Linux如何进行网络地址转换 (6)

Linux如何进行网络地址转换 (6),第1张

可能不能够被正确转换。

--------------------------------------------------------------------------------

7、 特定的协议

有些协议不希望被NAT。这些协议,两种延伸必须指明:一个是协议的连接跟踪,一个是真实NAT。

在发布的netfilter中,有可用的FTP模块:ip_conntrack_ftp.o和ip_nat_ftp.o。如果你加载了任一种模块到你的内 核(或者编译进去),那么任何关于FTP连接的NAT都是可行的。如果没有,那么只能使用被动FTP(passive ftp),而且如果做了一些Source NAT,它(指FTP)也许不能可靠的工作。

--------------------------------------------------------------------------------

8、 关于NAT的警告

如果你对连接做NAT,所有双向传送的包(进入和送出网络的)必须通过NAT服务器,否则NAT服务器的工作可能不可靠。特别是,连接跟踪代码重组了分片,也就意味着不光是连接跟踪不能可靠工作,甚至所有包都无法通过,因为分片被丢弃。

--------------------------------------------------------------------------------

9、 Source NAT 和路由

如果你要做SNAT,你必须注意所有机器被SNAT的包的回应都将发送到NAT服务器。例如,如果你映射了一些送出的包的源地址为1.2.3.4,那么外部的路由器必须知道发送回应包的地址到NAT服务器。可以这样做:

1、如果你对本机地址做SNAT(路由等所有事情都正常),你不需要做任何事。

2、如果你在本地LAN上做SNAT到未用地址(例如,你映射为1.2.3.99,你的1.2.3.0/24网络中未用的IP),你的NAT服务器需要像那个地址(99)一样正确响应ARP请求。最简单的办法是建立一个IP别名,例如:

# ip address add 1.2.3.99 dev eth0

3、如果你对完全不同的地址做SNAT,你必须保证被SNAT的包到达的机器会返回NAT服务器。如果NAT服务器是它们的默认网关,那么就已经行了,否则你需要发布一个路由(如果运行了路由协议)或者对每个机器手工添加路由。

--------------------------------------------------------------------------------

10、 同一个网络内的Destination NAT。

如果你要对同一个网络做端口转发,你需要确认所有以后的包和回应包都通过NAT服务器(这样它们才能被修改)。NAT代码现在(自2.4.0-test6),会屏蔽掉同组的被NAT的包送出的ICMP重定向,不过收到的服务器会继续尝试直接响应客户。(不会理解这个回应)

经典的情况是,内部人员试图访问你的“公用”Web服务器,而它实际上从公用地址(1.2.3.4)被DNAT到内部机器(192.168.1.1),例如:

# iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to 192.168.1.1

一种办法是运行一台内部DNS服务器,它知道你的公用(外部)Web服务器的真实的(内部)IP地址,并转发所有其他请求到外部DNS服务器。也就是说你的Web服务器能够记录真实的内部IP地址。

另一种办法是让NAT服务器映射那些连接的源地址到它自己,让服务器通过它发出响应。例如,我们可以这样做(假设NAT服务器内部IP地址是192.168.1.250):

# iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24 -p tcp --dport 80 -j SNAT --to 192.168.1.250

因为PREROUTING规则会首先运行,对内部Web服务器来说,包的去向早已确定。我们可以确定好源IP地址。

--------------------------------------------------------------------------------

11. Thanks

根据前面的hook函数挂载图我们可以清晰的知道,对于那些需要被本机转发的数据包,注册在NF_IP_PRE_ROUTING点的ip_nat_in ()函数完成对其目的地址转换的 *** 作,注册在NF_IP_POST_ROUTING点的ip_nat_out()函数完成源地址转换任务。如果在编译Linux内核源码时打开了CONFIG_IP_NF_NAT_LOCAL选项,则注册在NF_IP_LOCAL_OUT和NF_IP_LOCAL_IN点的hook函数就会工作,最常见的用法的是用NF_IP_LOCAL_OUT点的ip_nat_local_fn()函数来改变本机发出报文的目的地址。至于注册在NF_IP_LOCAL_IN点的ip_nat_fn()函数一般不会起作用,只是当数据包到达该HOOK点后会例行被调用一下。因为,NAT的所有规则只可能被配置到nat表的PREROUTING、POSTROUTING和OUTPUT三个点

你的tt取出来是不是类似"B5"这样的16进制数字符串?想要转成单字节uint8_t类型的话,进行如下转换即可:

if((tt[0]>='0')&&(tt[0]<='9'))

{

mm.bssid_ap[0]=((tt[0]-'0')<<4)

}

else

if((tt[0]>='a')&&(tt[0]<='z'))

{

mm.bssid_ap[0]=((tt[0]-'a')<<4)

}

else

if((tt[0]>='A')&&(tt[0]<='Z'))

{

mm.bssid_ap[0]=((tt[0]-'A')<<4)

}

if((tt[1]>='0')&&(tt[1]<='9'))

{

mm.bssid_ap[0]

+=(tt[1]-'0')

}

else

if((tt[1]>='a')&&(tt[1]<='z'))

{

mm.bssid_ap[0]

+=(tt[1]-'a')

}

else

if((tt[1]>='A')&&(tt[1]<='Z'))

{

mm.bssid_ap[0]

+=(tt[1]-'A')

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/8299277.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存