NAT穿透技术原理浅谈
今天我们来看看NAT方面的技术,提起NAT技术,我们大家可能并不陌生,就真实的存在我们身边,只不过我们很少关注它.NAT是一种网络地址翻译技术,将内部私有IP地址改变成可以在公网上使用的:公网IP.其出现背景就是因为我们国家公网IP地址太少了不够用,才使NAT技术兴起.这里我就不具体和大家细说NAT是怎么转换IP地址了,技术原理不太难.NAT技术的使用从技术角度讲是有利也有弊的.我们可以同时让多个计算机同时联网,同时也隐藏了内部地址,NAT对来自外部的数据查看其NAT映射记录,对没有相应记录的数据包进行拒绝,无非提高了网络的安全性.从另一个方面来看,NAT设备对数据包进行编辑修改操作,降低了发送数据的数率.由于技术的复杂性,排错也变的困难了,我们在内部对外发布一个服务器,还得考虑这个端口映射问题等.这也到罢了,网络盛行的今天,各种应用不断,其协议应用也各有不同,有的根本无法通过NAT.这是最为头疼的事.目前为了解决这些问题,已多现多种穿透技术.一会我们细谈.
NAT三种实现方式
静态地址转换:一个公网IP对应一个内部IP,一对一转换
动态地址转换:N个公网IP对应M个内部Ip,不固定的一对一IP转换关系.同一时间,有M-N个主机无法联网.
端口多路复用:对外只有一个公网IP,通过端口来区别不同内部IP主机的数据.
IP转换策略
对于静态与动态地址转换;其数据包出站的时候,进行源地址转换.我们称之为SNAT[SOURCE ADDRESS].其内部源IP变公网源IP.数据包入站的时候,进行目标地址转换DNAT[DESTINATION ADDRESS],其外部公网宿IP变内部宿IP.静态与动态不进行端口转换.而端口多路复用技术.不但要转换其IP地址,还要进行其传输层的端口转换.通过这唯一的端口号来区别不同的内部数据[在通信过程中会建立一张内部到外部映射表].我们称之NATP[NAT PORT]技术.在我们家用网络中,大部分用的是端口多路复用技术.在端口多路复用技术中,对数据的处理还分这么两类:锥形NAT与对称型NAT.锥形NAT又分完全锥形NAT[FULL CONE]|受限锥形NAT[RESTRICTED CONE]|端口受限锥形NAT[PORT RESTRICTED CONE].
全完锥形NAT:将来自内部同一个IP地址同一个端口号的主机监听/请求,映射到公网IP某个端口的监听.任意外部IP地址与端口对其自己公网的IP这个映射后的端口访问,都将重新定位到内部这个主机.个人认为在内部发布服务器到外网,此技术原理完全否合该技术原理,当然某些P2P中也可能利用该技术.该技术中,基于C/S架构的应用可以在任何一端发起连接.
受限锥形NAT:与完全NAT不同的是,在公网映射端口后,并不允许所有IP进行对于该端口的访问,要想通信必需内部主机对某个外部IP主机发起过连接,然后这个外部IP主机就可以与该内部主机通信了.但端口不做限制.如出站源IP为A端口为B,对于外部IP回复,宿IP为A宿端口可以是任意.NAPT设备都将成功转发到内部主机.NAPT设备根据映射记录做出判断.该技术中只能内部主机先发起连接通信才可成功.
端口受限锥形NAT:该技术与受限锥形NAT相比更为严格.除具有受限锥形NAT特性.对于回复主机的源端口也有要求.哪我用端口B访问你,对于外部主机的回复信宿端口也只能是B.否折通信失败.该技术中只能内部主机先发起连接通信才可成功.
对称型NAT:内部主机用同一IP与同一端口与外部多IP通信.NAPT设备为每个会话转换了不同的源端口.不在转换成相同的源端口.对于回复的数据包,只有信宿IP地址与端口完全吻合才可进入.当然源IP也是要检测的,不可能随意外部IP都能进入的.
NAT穿透技术
为何会出现NAT穿透技术?我们知道在NAPT技术应用中,要想实现通信,端口是必需的.IP地址修改是必需的.现在是残酷的.FTP应用协议分控制端口与数据端口,悲剧的是数据端口不是固定的,协商成功后告知对方数据端口内容是承载于应用层之中.NAT设备无法对其进行分析,做出相应的映射,从而导致通信失败.VPN协议中的PPTP协议,在数据连接中协议部分根本没有端口这一概念.要NAT如何做出决策?ipsec安全协议本身就是保证数据的安全并认证通信源而发明,对其网络层进行IP效验,对传输入层进行加密,对数据进行加密.对于NAT来说让其通信这更是无稽之谈.当然无法穿过NAT的还有很多,如语音VOIP中的H.323与SIP协议.为了能让这些协议成功应用,出现了五花八门的穿透NAT技术.其技术有UPNP技术.ALG[应用层网关识别技术]SBC[会话边界控制]ICE[交互式连接建立]MIDCOM[中间盒技术]TURN[中继NAT穿越]STUN技术.TCP/UDP hole punching[TCP/UDP打洞技术]NAT-T技术…总之很多,原理各不相同,我也没有时间一个一个学习和分析.在此说几个应用比较多点的例子.
ALG技术:传统的NAT技术只能检测网络层与传输层地址,你FTP不是在应用层传送端口地址吗?所以ALG技术就是一种应用层地址识别技术,根据不同的协议进行检测,然后将发现的地址时行修改并通知NAT做相应的映射记录,从而实现成功通信.对于该技术,对于互联网每一种新的协议支持都要更新其设备要不无法识别.扩展性差.对于个别协议该技术无法解决问题,如IPSEC协议.
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类型检测过程如下
1. 进行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类型。
该技术大部分是针对P2P应用环境中.
NAT-T技术:其思想就是在ESP隧道模式下,在外IP包头与ESP报头中间加入8个字节的UDP报关,使其NAT成功映射.
IPSec提供了端到端的IP通信的安全性,但在NAT环境下对IPSec的支持有限,AH协议是肯定不能进行NAT的了,这和AH设计的理念是相违背的;ESP协议在NAT环境下最多只能有一个VPN主机能建立VPN通道,无法实现多台机器同时在NAT环境下进行ESP通信。
NAT穿越(NAT Traversal,NAT-T)就是为解决这个问题而提出的,RFC3947,3948中定义,在RFC4306中也加入了NAT-T的说明,但并没废除RFC3947,3948,只是不区分阶段1和阶段2。该方法将ESP协议包封装到UDP包中(在原ESP协议的IP包头外添加新的IP头和UDP头),使之可以在NAT环境下使用的一种方法,这样在NAT的内部网中可以有多个IPSec主机建立VPN通道进行通信。
AH封装:AH封装的校验从IP头开始,如果NAT将IP的头部改动,AH的校验就会失败,因此我们得出结论,AH是无法与NAT共存的。ESP封装的传输模式:对于NAT来说,ESP封装比AH的优势在于,无论是加密还是完整性的校验,IP头部都没有被包括进去。但是还是有新的问题,对于ESP的传输模式,NAT 无法更新上层校验和。TCP 和 UDP 报头包含一个校验和,它整合了源和目标 IP 地址和端口号的值。当 NAT 改变了某个包的 IP 地址和(或)端口号时,它通常要更新 TCP 或 UDP 校验和。当 TCP 或 UDP 校验和使用了 ESP 来加密时,它就无法更新这个校验和。由于地址或端口已经被 NAT 更改,目的地的校验和检验就会失败。虽然 UDP 校验和是可选的,但是 TCP 校验和却是必需的。
ESP封装的隧道模式:从ESP隧道模式的封装中,我们可以发现,ESP隧道模式将整个原始的IP包整个进行了加密,且在ESP的头部外面新加了一层IP头部,所以NAT如果只改变最前面的IP地址对后面受到保护的部分是不会有影响的。因此,IPsec只有采用ESP的隧道模式来封装数据时才能与NAT共存。ESP的传输模式,因为TCP部分被加密,NAT无法对TCP校验和进行修改,不兼容。ESP的隧道模式,由于NAT改动外部的IP而不能改动被加密的原始IP,使得只有这种情况下才能与NAT共存。