NAT与NAT穿越

来源:互联网 发布:手机截铃声软件 编辑:程序博客网 时间:2024/04/30 11:16

1、引言
网络地址转换(Network Address Translation,简称NAT)是一种在IP分组通过路由器或防火墙时重写源IP地址或/和目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。20世纪90年代中期,NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的。家庭和小型办公室的路由器一般都集成了防火墙,DHCP服务器和NAT功能。

NAT穿越是广泛用于P2P领域的通信方式。在视频会议过程中,NAT穿越也在内外网消息通信中起到了至关重要的作用,平台服务器之间、与会终端之间、以及平台服务器和与会终端之间都可能存在信令或多媒体流等的NAT穿越。

本文总结学习NAT的4种类型,以及NAT穿越的协议或框架。

2、NAT的类型
NAT有4种不同的类型:Full Cone、Address Restricted Cone、Port Restricted Cone和Symmetric(对称形),其中Full Cone、Address Restricted Cone、Port Restricted Cone等3种类型又统称为Cone NAT(圆锥形NAT)。

2.1 Full Cone
这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口。然后外网的任何发到这个打开的端口的UDP数据报都可以到达A,不管是不是C发过来的。

Java代码  收藏代码
  1. 例如 A:192.168.8.100  NAT:202.100.100.100  C:292.88.88.88  
  2. A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)  
  3. 任何发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)  



2.2 Full Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口。然后C可以用任何端口和A通信,其它的外网机器则不行。

Java代码  收藏代码
  1. 例如 A:192.168.8.100  NAT:202.100.100.100  C:292.88.88.88  
  2. A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)  
  3. 任何从C发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)  



2.3 Full Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口。然后C可以用原来的端口和A通信,C的其它端口或其它的外网机器则不行。

Java代码  收藏代码
  1. 例如 A:192.168.8.100  NAT:202.100.100.100  C:292.88.88.88  
  2. A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)  
  3. 只有从C(202.88.88.88:2000)发送到NAT(202.100.100.100:8000)的数据,才可以到达A(192.168.8.100:5000)  



2.4 Full Cone
对于这种NAT,连接不同的外部Server,NAT打开的端口会变化。也就是内部机器A连接外网机器B时,NAT会打开一个端口;连接外网机器C时,NAT又会打开另外一个端口。
对于双方都是Port Restricted Cone NAT的时候,则需要利用UDP打洞原理进行“先打洞,然后才能直接通信”。

对于Cone NAT要采用UDP打洞,需要一个公网机器Server C来充当“介绍人”。处于NAT之后的内网的A、B先分别和C通信,打开各自的NAT端口,C这个时候知道A、B的公网IP和端口。现在A和B想直接连接,比如A给B直接发包,除非B是Full Cone,否则不能通信。反之亦然。

为什么会这样?因为对于处于NAT之后的A、B。如果想A要与外界的D通信,则首先必须要A发包到D,然后A经过NAT设备NA,NA把A的内网地址和端口转换为NA的外网地址和端口。和D通信之后,D才能经过NA和A通信。也就是说,只能A和外界主动通信,外界不能主动和处于NA之后的A通信,这种包会被NA直接丢弃的。这也就是前面所说的Port Restricted Cone 的情形!

Java代码  收藏代码
  1. A(192.168.8.100:5000) -> NA(202.100.100.100:8000) -> D(292.88.88.88:2000)  


但是我们可以这样:

Java代码  收藏代码
  1. A --- NA --- Server C --- NB --- B  
  2. 其中: A、B 为主机;  
  3. NA、NB 为NAT设备;  
  4. Server C为外网的机器;  


如果A想与B通信,那么其过程如下:
(1)A首先连接 C,C得到A的外网NA的地址和端口;
(2)B也要连接C,C得到B的外网NB的地址和端口;
(3)A告诉C说我要和B通讯;
(4)C通过NB发信息给B,让B知道A的外网NA的地址和端口;
(5)B向NA发数据包(肯定会被NA丢弃,因为NA上并没有 A->NB 的合法session),但是NB上就建立了有B->NA的合法session了;
(6)B发数据包给C,让 C 通知 A,我已经把洞打好了;
(7)A接收到通知后,向 B 的外网NB发数据包,这样就不会被NB丢弃掉了。因为对于NB来说,它看到的是A的外网NA的地址,而通过第5步,B已经让NA成为NB的合法通信对象了。所以,当NA发数据包给NB时,NB就会接收并转发给B。

注意: 路由器和防火墙的UDP打洞的端口有个时间限制的,在一定时间内如果没有数据通讯会自动关闭。

3、NAT穿越
3.1 STUN
1、简介
STUN是一种NAT穿越协议,其全称是Simple Traversal of UDP Through NAT,即UDP对NAT的简单穿越方式。

2、应用模型

如上图所示,如果STUN ClientA想与STUN ClientB通信,那么其过程如下:
(1)STUN ClientA通过NA向STUN Server发送UDP请求STUN 消息询问并注册自身的转换后地址;
(2)STUN Server收到请求消息,产生响应消息,响应消息中携带请求消息的源端口,即STUN ClientA在NA上对应的外部端口,然后响应消息通过NA发送给STUN ClientA;
(3)STUN ClientB通过NB向STUN Server发送UDP请求STUN 消息询问并注册自身的转换后地址;
(4)STUN Server收到请求消息,产生响应消息,响应消息中携带请求消息的源端口,即STUN ClientB在NB上对应的外部端口,然后响应消息通过NB发送给STUN ClientB;
(5)STUN ClientA将其在NA上对应的外部地址和端口信息包含在消息中,发送给STUN Server请求要和STUN ClientB通讯;
(6)STUN Server收到请求信息后,查询STUN ClientB的注册地址,并通过NB将请求转发给STUN ClientB;
(7)STUN ClientB通过消息体中的内容得知STUN ClientA在的外部地址和端口,并将其在NB上对应的外部地址和端口信息包含在响应消息中,然后将响应信息发送给STUN ClientA,STUN ClientA收到响应信息后也知道了STUN ClientB的外部地址和端口,这样就在STUN ClientA和STUN ClientB之间建立了连接,解决了穿越NAT的通信建立问题以及作为被叫时的问题。

本端的接收地址和端口号为NAT外的地址和端口号。由于通过STUN协议已在NAT上预先建立媒体流的NAT映射表项,因此,媒体流可顺利穿越NAT。

需要注意的是,NAT/PAT对于地址转换关系是有一定生命期的,某个地址转换后在一段时间内没有被使用将会被清除,当这个业务流再次出现时,将会建立一个新的地址转换关系,这就意味着STUN的询问过程以及终端的注册过程都需要再执行一遍才能保证通信的正确。解决这个问题一个比较通行的方案是采用某种方式保持NAT/PAT的转换关系,例如在NAT/PAT生命期内重复注册一次,比如NAT/PAT的生命期是3分钟,那么就将注册重复周期设置为2分钟。

另外,STUN Server并非指一个专用的服务器,而是指一种功能、一个协议,我们可以在软交换服务或者任何一个需要此功能的服务器上内置此协议。

3、优点和局限性
在NAT采用对称模式(Symmetric NAT)工作时,STUN的方案就会出现问题。假如我们在软交换服务上提供STUN Server功能,终端A通过STUN可以获得NAT为终端A与软交换服务之间通信分配的地址A',并将这个地址注册在软交换服务上,当一个公网上的终端B呼叫终端A时,A'和B通过软交换服务完成呼叫建立过程。当B试图向A'发送媒体流时,问题就出现了。因为对称NAT只允许从软交换服务发送数据给地址A',从B发送的媒体流将被丢弃。所以,STUN无法应用于工作在对称模式的NAT。
STUN协议最大的优点是无需现有NAT/FW设备做任何改动,同时STUN方式可在多个NAT串联的网络环境中使用。STUN的局限性在于STUN并不适合支持TCP连接的穿越,同时STUN方式不支持NAT的对称模式(Symmetric NAT)。

3.2 TURN
1、简介
TURN的全称为Traversal Using Relay NAT,即通过Relay方式穿越NAT。另外,这种方式又称SPAN(Simple Protocol for Augmenting NATs)方式。

2、应用模型
TURN方式解决NAT问题的思路与STUN相似,也是基于私网接入用户通过某种机制预先得到其私有地址对应在公网的地址(STUN方式得到的地址为出口NAT上的地址,TURN方式得到地址为TURN Server上的地址),然后在报文负载中所描述的地址信息直接填写该公网地址的方式,实际应用原理也是一样的。

3、优点和局限性
TURN应用模型通过分配TURN Server的地址和端口作为客户端对外的接受地址和端口,即私网用户发出的报文都要经过TURN Server进行Relay转发,这种方式除了具有STUN方式的优点外,还解决了STUN应用无法穿透对称NAT(Symmetric NAT)以及类似的Firewall设备的缺陷,即无论企业网/驻地网出口为哪种类型的NAT/FW,都可以实现NAT的穿透,同时TURN支持基于TCP的应用,如H323协议。TURN的局限性在于所有报文都必须经过TURN Server转发,增大了包的延迟和丢包的可能性。

3.3 ICE
1、简介
ICE的全称Interactive Connectivity Establishment(互动式连接建立),由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。ICE跟STUN和TURN不一样,ICE不是一种协议,而是一个框架(Framework),它整合了STUN和TURN。

2、应用模型

如上图所示,如果A想与B通信,那么其过程如下:
(1)A收集所有的IP地址,并找出其中可以从STUN服务器和TURN服务器收到流量的地址;
(2)A向STUN服务器发送一份地址列表,然后按照排序的地址列表向B发送启动信息,目的是实现节点间的通信; 
(3)B向启动信息中的每一个地址发送一条STUN请求;
(4)A将第一条接收到的STUN请求的回复信息发送给B;
(5)B接到STUN回复后,从中找出那些可在A和B之间实现通信的地址;
(6)利用列表中的排序列最高的地址进一步的设备间通信;
  由于该技术是建立在多种NAT穿透协议的基础之上,并且提供了一个统一的框架,所以ICE具备了所有这些技术的优点,同时还避免了任何单个协议可能存在的缺陷。因此,ICE可以实现在未知网络拓扑结构中实现的设备互连,而且不需要进行对手配置。另外,由于该技术不需要为VoIP流量手动打开防火墙,所以也不会产生潜在的安全隐患。

3.4 UPnP
UPnP是若干网络协议的组合,主要用于设备的互联,但是一种叫做Internet Gateway Device (IGD) Protocol的防火墙穿越技术是基于UPnP的,其允许网络设备或者点对点应用程序通过动态开启和闭合与外部服务之间的通信端口穿过NAT网关与外界通信。

4、参考资料
[1] NAT and Traversal NAT(TURN/STUN/ICE)
http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.html
[2] ICE 原理学习
http://blog.csdn.net/voipmaker/article/details/8453702