全部博文(146)
分类: LINUX
2008-02-01 12:08:51
如上图所示,此种类型的NAT设备固定地将内网主机X端口Y(X/Y),映射为外网地址x/y,WAN侧任意主机可以收到来自X/Y–>x/y–>的数据包,反之也可以将数据包通过x/y回传给X/Y。从图上看类似一个锥形,且数据传输不受任何限制,故称之为全锥型NAT设备。
相比较上一种类型,以下三种NAT类型,对WAN侧数据包都有一个共同的特征:非请勿入,即WAN侧数据能够通过x/y传送数据至X/Y的前提条件是,X/Y曾先向WAN端该主机发送了数据包。
受限制的锥型NAT相比较全锥型的NAT,要求能够A–>x/y–>X/Y的条件是,X主机先发送数据包给A。如上图所示,我们将A至x/y的回传路径用虚线表示,以表明非请勿入的限制条件。
在前一种类型基础上,该类型不但对IP地址进行了限制,而且也限制了WAN侧主机发送数据包的端口,因此我们将WAN用椭圆图表示,是一个二维空间。该限制是,只有X/Y通过x/y发送数据包到A/B后,A/B发送的数据包才能够通过x/y回送给X/Y,其它数据包全部拒绝。
最后一种NAT类型是限制最严格的类型,是最难穿透和令P2P应用开发者最为头痛的类型。从上图可以看出,内网主机向外网映射是一一对应的对称的关系,即只有X/Y先发包给A/B,A/B发送的数据经x/y回到X/Y,同样W/Z和C/D关系如此。
根据STUN协议,在WAN端公网上架设STUN服务器,在LAN主机使用STUN客户端,我们可以检测网络的NAT类型。其检测过程如下:
(1)X/Y发送Binding Request消息给服务端,服务端将在WAN侧看到的地址x/y以Binding Response消息回应客户端。客户端用本机地址、端口和x/y对比,如果相同,则说明没有经过NAT设备;如果不同则表示中途有NAT映射。
(2)检测NAT类型。同上步骤,但服务端为另外一个地址,客户端对比前后两次收到的NAT映射地址,如果两次检测的地址不相同,则表示NAT是对称型设备。
(3)如果不是对称型设备,继续检测。但发送的Binding Resquest消息要求服务端改变地址发送Binding Respone消息给客户端。如果客户端能够收到Binding Respone消息,说明NAT设备是全锥型的。
(4)如果收不到回应消息,继续检测。这次发送的Binding Resquest消息要求服务端只改变发送Binding Respone消息的端口且IP地址不改变。如果客户端收不到响应消息则说明NAT设备是端口受限型的设备;否则只是受限制的NAT设备。
那么Linux NAT是什么类型呢?
我们不妨使用上面的步骤检测一下。我们知道Linux系统在作NAT时,会建立一个源地址、源端口、目的地址、目的端口的元组[X,Y,A,B],以及NAT后反方向接收数据的元组[A,B,x,y],请注意反方向的目标地址是NAT映射后的WAN侧地址。
首先,检测的第一步骤结果,显然X/Y不同于x/y,所以经过了NAT设备。其次检测第二步,如果Linux系统x/y组合没有被其它的连接所使用,则还是使用x/y地址,所以就可能被认为不是对称型设备,还要继续检测。但这是错误的检测结果,因为如果x/y地址已经被其它连接使用了,Linux内核不会为某地址端口保持固定的映射,则 X/Y 的映射会改变,所以 Linux NAT是对称型的设备。看来根据STUN协议检测NAT设备类型还要作进一步的分析。