一、NAT百科相关内容:
NAT 即 Network Address Translation,是一种将私有(保留)地址转化为合法IP地址的转换技术,不仅完美地解决了lPv4地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机 ,目前广泛应用。
NAT可以分为静态NAT(static nat)、NAT池(pooled nat)和 端口复用NAT(PAT Port Address Translation), 目前大多使用的是PAT。
二、NAT穿越技术中对NAT类型的划分:
在RFC3489/STUN[1]中,基于UDP的NAT穿透技术把主机划分为如下七种NAT类型:UDP Blocked、Open Internet、Symmetric Firewall、Full Cone NAT、Restricted Cone NAT、Port Restricted Cone NAT、Symmetric NAT。具体解释如下:
(1)Open Internet:主机具有公网IP,允许主动发起和被动响应两种方式的UDP通信。
(2)UDP Blocked:位于防火墙之后,并且防火墙阻止了UDP通信。
(3)Symmetric Firewall:主机具有公网IP,但位于防火墙之后,且防火墙阻止了外部主机的主动UDP通信。
(4)Full Cone NAT:当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个固定的公网{IP:端口}。此后,通过这个socket发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;同时,任何外部主机都可以使用这个公网{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个映射表,内网主机的内网{IP:端口}与公网{IP:端口}是一一对应的关系。一旦这个映射关系建立起来(内部主机向某一外部主机发送一次数据即可),任何外部主机就可以直接向NAT内的这台主机发起UDP通信了,此时NAT透明化了。
(5)Restricted Cone NAT:当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个公网{IP:端口}。此后,通过这个socket向外发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;而任何收到过从这个socket发送来的数据的外部主机(由IP标识),都可以通过这个公网{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个内网{IP:端口}到公网{IP:端口}的映射,还维护了一个{外部主机IP, 公网{IP:端口}}到内网{IP:端口}的映射。因此,要想外部主机能够主动向该内部主机发起通信,必须先由该内部主机向这个外部发起一次通信。
(6)Port Restricted Cone NAT:当内网主机创建一个UDP socket并通过它第一次向外发送UDP数据包时,NAT会为之分配一个公网{IP:端口}。此后,通过这个socket向外部发送的任何UDP数据包都是通过这个公网{IP:端口}发送出去的;一旦外部主机在{IP:端口}上收到过从这个socket发送来的数据后,都可以通过这个外部主机{IP:端口}向该socket发送UDP数据包。即是说,NAT维护了一个从内网{IP:端口}到公网{IP:端口}的映射,还维护了一个从{外部主机{IP:端口}, 公网{IP:端口}}到内网{IP:端口}的映射。
(7)Symmetrict NAT:当内网主机创建一个UDP socket并通过它第一次向外部主机1发送UDP数据包时,NAT为其分配一个公网{IP1:端口1},以后内网主机发送给外部主机1的所有UDP数据包都是通过公网{IP1:端口1}发送的;当内网主机通过这个socket向外部主机2发送UDP数据包时,NAT为其分配一个公网{IP2:端口2},以后内网主机发送给外部主机2的所有UDP数据包都是通过公网{IP2:端口2}发送的。公网{IP1:端口1}和公网{IP2:端口2}一定不会完全相同(即要么IP不同,要么端口不同,或者都不同)。这种情况下,外部主机只能在接收到内网主机发来的数据时,才能向内网主机回送数据。
三、常用NAT穿越技术:
1、UPNP协议实现穿越
其实现原理是动态创建端口映射规则,前提则需要连接客户端和NAT设备本身支持UPNP协议。
2、ALGs(Application Layer Gateways)
ALG主要完成了对应用层报文的处理,通常情况下NAT只对报头中的IP,PORT信息进行转换,不对应用层数据载荷中的字段进行分析,如果使能了ALG,那么在识别了相应报文之后便会对IP报头以外的载荷信息进行解析,然后进行地址转换,重新计算校验和。 具体的来说,ALG可以处理的协议有如下这些:DNS,FTP,H323,SIP,HTTP,ILS,MSN/QQ,NBT,RTSP,PPTP,TFTP、GRE等。使用该穿越技术,则需要NAT转换设备进行升级,否则无法支持。对于个别协议该技术无法解决问题,如IPSEC协议。
目前linux防火墙可以支持常见的大部分协议的ALG。
3、STUN技术(Simple Traversal of User Datagram Protocol Through Network Address Translators )
该穿越技术主要是借助UDP协议进行UDP打洞,相应RFC可以参考RFC 3489和RFC 5398,其只能在非Symmetrict NAT情况下成功穿越。
STUN技术:通过STUN协议与第三方服务器建立连接,推测出客户端的NAT类型.进而通信.RFC3489/STUN协议过程[摘自cr0_3百度空间].STUN协议定义了三类测试过程来检测NAT类型,如下所述:
Test1:STUN Client通过端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-s1:Port-s1}把它所看到的STUN Client的IP和端口{IP-m1,Port-m1}作为Binding Response的内容回送给STUN Client。
Test1#2:STUN Client通过端口{IP-c1:Port-c1}向STUN Server{IP-s2:Port-s2}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-s2:Port-s2}把它所看到的STUN Client的IP和端口{IP-m1#2,Port-m1#2}作为Binding Response的内容回送给STUN Client。
Test2:STUN Client通过端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}发送一个Binding Request(设置了Change IP和Change Port属性)。STUN Server收到该请求后,通过端口{IP-s2:Port-s2}把它所看到的STUN Client的IP和端口{IP-m2,Port-m2}作为Binding Response的内容回送给STUN Client。
Test3:STUN Client通过端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}发送一个Binding Request(设置了Change Port属性)。STUN Server收到该请求后,通过端口{IP-s1:Port-s2}把它所看到的STUN Client的IP和端口{IP-m3,Port-m3}作为Binding Response的内容回送给STUN Client。
NAT类型检测过程如下
- 进行Test1。如果STUN Client不能够收到STUN Server的应答(重复多次确认),那么说明该STUN Client是UDP Blocked类型(也有可能是STUN Server不可到达,这里不考虑这种情形);否则,STUN Client把返回的{IP-m1,Port-m1}和本地的{IP-c1:Port-c1}进行比较(只需要比较IP即可),如果相同,说明本机直接连接于公网,否则本机位于NAT之后,但还需要进一步判断具体类型。
1.1. 如果本机直接连接于公网,进行Test2。如果STUN Client不能够收到STUN Server的应答(重复多次确认),那么说明该STUN Client是Symmetric Firewall类型;否则,该STUN Client是Open Internet类型。
1.2. 如果本机位于NAT之后,进行Test2。如果STUN Client能够收到STUN Server的应答,那么说明该STUN Client是Full Cone NAT;否则,需要进一步进行测试。
1.2.1. 进行Test1#2。STUN Client比较IP-m1和IP-m1#2是否相同,如果不相同,那么说明该STUN Client是Symmetric NAT类型;否则,需要进一步进行测试。
1.2.1.1 进行Test3。如果STUN Client能够收到STUN Server的应答,那么说明该STUN Client是Restricted Cone NAT类型;否则,该STUN Client是Port Restricted Cone NAT类型。
4、其他穿越技术:
SBC[会话边界控制]
ICE[交互式连接建立]
MIDCOM[中间盒技术
TURN[中继NAT穿越]
四、LINUX的NAT类型:
由于STUN只能穿越非Symmetrict NAT的类型,那我们在linux中使用 MASQUERADE所创建的NAT是什么类型呢?
Linux的NAT“MASQUERADE”属于对称形NAT。
说明这一点只需要否定 MASQUERADE 为锥形 NAT 即可。
Linux 在进行地址转换时,会遵循两个原则:
尽量不去修改源端口,也就是说,ip 伪装后的源端口尽可能保持不变。
更为重要的是,ip 伪装后必须 保证伪装后的源地址/ 端口与目标地址/ 端口(即所谓的socket )唯一。
假设如下的情况( 内网有主机 A 和 D ,公网有主机 B 和 C ):
先后 建立如下三条连接:
A ( 1000 ) —— > NAT ( 1000 )—— > B ( 2000 )
D ( 1000 ) —— > NAT ( 1000 )—— > C ( 2000 )
A ( 1000 ) —— > NAT ( 1001 )—— > C ( 2000 )
可以看到,前两条连接遵循了原则 1 ,并且不违背原则 2
而第三条连接为了避免与第二条产生相同的 socket 而改变了源端口
比较第一和第三条连接,同样来自 A(1000) 的数据包在经过 NAT 后源端口分别变为了 1000 和 1001 。说明 Linux 的 NAT 是对称 NAT 。
五、Cone NAT 与 Symmetric NAT 对比:
CONENAT 要求原始源地址端口相同的数据包经过地址转换后,新源地址和端口也相同,换句话说,原始源地址端口不同的数据包,转换后的源地址和端口也一定不同。
那么,是不是 Full Cone NAT 的可穿透性一定比 Symmetric NAT 要好呢,或者说,通过 Symmetric NAT 可以建立的连接,如果换成 Full Cone NAT 是不是也一定能成功呢?
假设如下的情况:
(内网有主机A和D,公网有主机B和C,某 UDP 协议服务端口为 2000 ,并且要求客户端的源端口一定为 1000 。 )
1)如果A使用该协议访问B:
A ( 1000 ) —— > NAT ( 1000 )——— > B ( 2000 )
由于 Linux 有尽量不改变源端口的规则,因此在 1000 端口未被占用时,连接是可以正常建立的
如果此时D也需要访问B:
D ( 1000 ) —— > NAT ( 1001 )—X— > B ( 2000 )
端口必须要改变了,否则将出现两个相同的 socket ,后续由 B(2000) 发往NAT( 1000 )的包将不知道是转发给A还是D。
于是B将因为客户端的源端口错误而拒绝连接。
在这种情况下, MASQUERADE 与 CONENAT 的表现相同。
2)如果A连接B后,D也像C发起连接,而在此之后,A又向C发起连接
① A ( 1000 ) —— > NAT ( 1000 )——— > B ( 2000 )
如果是 MASQUERADE :
② D ( 1000 ) —— > NAT ( 1000 )——— > C ( 2000 )
③ A ( 1000 ) —— > NAT ( 1001 )—X— > C ( 2000 )
如果是 CONENAT :
② D ( 1000 ) —— > NAT ( 1001 )—X— > C ( 2000 )
③ A ( 1000 ) —— > NAT ( 1000 )——— > C ( 2000 )
对于 MASQUERADE 来说,只要在没有重复的 socket 的情况下,总是坚持尽量不改变源端口的原则,因此第二条连接仍然采用源端口 1000 ,而第三条连接为了避免重复的 socket 而改变了端口。
对于 CONENAT ,为了保证所有来自 A(1000) 的数据包均被转换为 NAT(1000) ,因此 D 在向 C 发起连接时,即使不会产生重复的 socket ,但因为 NAT 的 1000 端口已经被 A(1000) “占用”了,只好使用新的端口。
可以看出,不同的 target 产生不同的结果。我们也不能绝对的说,在任何时候,全锥形 NAT 的可穿透性都比对称 NAT 要好,比如上面的例子,如果只存在连接①和②,显然是对称形 NAT 要更适用。
因此,选择哪种 NAT ,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。
六、进一步思考:
1、对于MASQUERADE 所创建的NAT如何进行穿越呢?
2、linux系统的路由器中如何创建NAT才会成为CONE NAT呢? 同时如何操作才能创建出 Full Cone NAT、Restricted Cone NAT、Port Restricted Cone NAT这三种NAT呢?