- 论坛徽章:
- 0
|
这篇文章的内容可能是错误的,因为我也没有搞清楚就开写了,算是思考。发现和wiki有点不一样,多数的内容是参考了别人的经验,而我则加以整理,有点乱,NAT处理的方式变化多端,很难有一个统一的解决方案。
通常处于两个NAT路由后的主机不能直接建立连接,但有时候我们可以用UDP来建立直接的连接,这里有一个前提条件:两个NAT路由不会拒绝外部UDP的首发消息。一些路由器记录了UDP状态,当内网的主机发出包时,路由在外部打开一个映射端口,一些路由器记录UDP发包地址,并且只接受这个地址的回包,这种情况下不能建立穿透连接。
NAT路由器在端口映射上有两种方式,一种是对称型,一种是非对称型,对称型是指进出的数据包都采用一种端口映射方式,非对称型是进出的数据包映射为不同的端口
对称型映射:
192.168.1.5[2000] 218.65.22.33[10982]
非对称型映射
192.168.1.5[2000] ==> 218.65.22.33[10982]
192.168.1.5[2000] NAT_A[10982]==>64.33.55.66[5566]
当HOST_A通过端口2000发出UDP包时,NAT_A路由器mangle了包中的端口,把2000改成了自己分配的10982(10982只是举例,实际分配是变化的),然后路由器记录了这个端口和HOST_A上的2000端口映射关系,发到NAT_A外网[10982]的UDP包会被转发到HOST_A[2000]上去,但通常有一个时间限制,超过了时限则路由器中的映射就被关闭了,映射就失效。
同样的道理,HOST_B发送一个UDP到服务器也会使NAT_B产生一个映射关系
HOST_B[2000]==>NAT_B[20456]==>64.33.55.66[5566]
服务器获得了两边的映射关系后就可以转发这种映射到对方,HOST_A获得对方地址是NAT_B[20456],而HOST_B获得对方地址为NAT_A[10982],两者就可以用这个地址直接通信了。
非对称型NAT分配不同的端口给上下行的数据
假设NAT_A是非对称型NAT
HOST_A[2000]==>NAT_A[10982]==>64.33.55.66[5566]
服务器64.33.55.66收到HOST_A发来的包可以确认HOST_A发包的外网地址是:
NAT_A[10982],但当他怀疑NAT_A是非对称的NAT时,就需要去确定是否收包也采用同一个端口,于是64.33.55.66需要向NAT_A[10982]发包确认:
64.33.55.66[5566]==>NAT_A[10982]
如果这个发包得到了反馈,那么可以确定NAT是对称的,否则需要在10982端口附近找一个端口
64.33.55.66[5566]==>NAT_A[10976]
64.33.55.66[5566]==>NAT_A[10977]
64.33.55.66[5566]==>NAT_A[10978]
......
64.33.55.66[5566]==>NAT_A[10990]
哪个端口有正常的反馈,那么哪个端口就是收包端口。
通常在这个端口附近总可以找到那个被分配用来做收包的端口。服务器确认这个信息后就可以转发给HOST_B,同样HOST_B的信息可以转发给HOST_A,随后HOST_A和HOST_B就可以直接联系了。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/18432/showart_140123.html |
|