在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P通信,而不需要其他公共服务器的中转。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常称为NAT穿透(NAT Traversal)。最常见的NAT穿透是基于UDP的技术。
穿越技术
1) ALG (Application Level gateway,应用层网关)方式: 该方式需要对现有防火墙/NAT进行升级,应用层网关设计成能够识别指定IP 协议(比如H.323和SIP协议)的防火墙
2) UPnP (Universal Plug and Play,通用即插即用) 方式: UPnP是为了在电脑、智能家电和智能设备之间建立无所不在的网络连接而提出的协议体系[12]。由微软公司发起,在1999年成立了一个开放的产业联盟UPnPForum,并制订了一系列标准。UPnP允许客户端软件发现和配置包括NAT和防火墙在内的网络部件,其中后者需要安装UPnP软件。目前只有部分NAT和防火墙支持UPnP功能
3) MIDCOM (Middle box Communications,中间盒通讯方式)方式 MIDCOM的目的是使用第三方应用程序(包括硬件设备)来控制防火墙和NAT设备并动态地决定安全策略,以此来适应VoIP业务。第三方的应用程序使用MIDCOM定义的协议(或私有协议)控制防火墙和NAT设备,根据VoIP的需要动态地打开呼叫信令、媒体流互通的IP地址和端口号。
4) STUN:全名 Simple Traversal of User DatagramProtocol through Network Address Translators (NATs),(翻譯:NAT的UDP簡單穿越),是一種網路協議,它允許位於NAT(或多重NAT)後的客戶端找出自己的公網地址,查出自己位於哪種類型的NAT之後以及NAT為某一個本地埠所綁定的Internet端埠。這些信息被用來在兩個同時處於NAT 路由器之後的主機之間建立UDP通信。該協議由RFC 3489定義。
5) TURN:允許在TCP或UDP的連線上跨越 NAT 或防火牆。TURN是一個client-server協議。这种方式除了具有STUN方式的优点外,还解决了STUN应用无法穿透对称NAT(Symmetric NAT)以及类似的Firewall设备的缺陷,同时TURN支持基于TCP的应用,如H323协议。
6) ICE:互動式連接建立(Interactive ConnectivityEstablishment),一種綜合性的NAT穿越的技術。互動式連接建立是由IETF的MMUSIC工作組開發出來的一種framework,可整合各種NAT穿透技術,如STUN、TURN(TraversalUsing Relay NAT,中繼NAT實現的穿透)、RSIP(Realm Specific IP,特定域IP)等。該framework可以讓SIP的客戶端利用各種NAT穿透方式打穿遠程的防火牆。 如果UDP傳送失敗,ICE會改試TCP: 先是 HTTP,然後改試 HTTPS。此外如果使用STUN (UDP)直接連線失敗,ICE會切換道TURN (relay模式),ICE uses an intermediary (relay) TURN server。所以 ICE 其實就是混和TURN 和STUN的行為模式的通訊協定.
NAT的种类:
1. Full Cone NAT
所有从同一个内网IP和端口号发送过来的请求都会被映射成同一个外网IP和端口号,并且任何一个外网主机都可以通过这个映射的外网IP和端口号向这台内网主机发送包。
2. Restricted Cone NAT
它也是所有从同一个内网IP和端口号发送过来的请求都会被映射成同一个外网IP和端口号。与完全锥形不同的是,外网主机只能够向先前已经向它发送过数据包的内网主机发送包。
3. Port Restricted Cone NAT
与限制锥形NAT很相似,只不过它包括端口号。也就是说,一台IP地址X和端口P的外网主机想给内网主机发送包,必须是这台内网主机先前已经给这个IP地址X和端口P发送过数据包。
4. Symmetric NAT
所有从同一个内网IP和端口号发送到一个特定的目的IP和端口号的请求,都会被映射到同一个IP和端口号。如果同一台主机使用相同的源地址和端口号发送包,但是发往不同的目的地,NAT将会使用不同的映射。此外,只有收到数据的外网主机才可以反过来向内网主机发送包。
4种NAT穿越难度依次是
4(最难穿越) | Symmetric NAT |
3(困难) | Port Restricted Cone NAT |
2(容易) | Restricted Cone NAT |
1(最容易穿越) | Full Cone NAT |
NAT对VoIP的影响
VoIP中所使用的信令,如SIP、H.323,在应用层数据包中包含后续RTP媒体流 所需要地址和端口信息。而NAT仅仅修改网络层和传输层的IP地址和端口,并不会修改应用层数据。这使得位于NAT内的信令,在经过NAT之后,应用层数据包中包含的地址和端口信息并未被修改成对外映射的公网地址,从而导致后续媒体流的连接失败。因此,在VoIP的应用中,必须解决NAT穿越问题。
NAT对SIP应用的影响
NAT的使用对SIP协议的应用主要有两个影响。
1.信令不通
2.媒体不通。
1 SIP信令不通的原因
信令不通表示SIP消息本身无法穿越NAT。这种现象的产生是由上述两个原因综合造成的。 首先是当SIP终端在向SIP Proxy发起注册时,其注册的IP地址为私网地址。导致了其他SIP终端无法通过这个私网地址呼叫到相应的SIP终端。也就是上一节NAT对IP网络的第二个影响。其次是由NAT对IP网络的第一个影响造成的。当私网中的主机A向SIP Proxy发起一次注册后,会在NAT A上建立一个地址映射。但是这个映射是有一定的时间限制的,NAT A只为主机A保留一段时间的地址映射。一旦这个时间过去且主机A没有再发起建立映射的要求,那么这个映射就消失了或者给了其他的主机使用。这样也会造成信令不通。 在这两个原因的共同作用下,SIP终端之间或者终端和Proxy之间的信令通信就可能中断。
2 媒体流不通的原因
媒体流不通主要是指在SIP信令建立成功后,却在SIP终端中无法接收语音媒体流的情况。 造成媒体流不通的主要原因是NAT对IP网络的第二的影响。在SIP通信中,关于媒体的信息存放在SIP的包体(主要是SDP包)中。在SDP包中有字段c和m共同描述了本次媒体所使用的IP地址和端口号。在NAT后的SIP终端在发送这个INVITE消息的时候,SDP的c和m字段就带有了私网地址。这样导致了媒体流无法建立的情况。
STUN解决方案
应用程序即STUN 客户端向NAT外的STUN 服务器通过UDP发送STUN 请求。STUN 服务器收到请求消息,产生响应,响应消息中包含请求消息的源端口,即STUN 客户端在NAT上映射的外部端口。然后响应消息通过NAT发送给STUN 客户端,STUN 客户端通过响应消息体中的内容得知其在NAT上对应的外部地址,并且将其填入以后信令协议的UDP负载中,告知对方自己的RTP接收地址和端口号为NAT外的地址和端口号。由于通过STUN协议已在NAT上预先建立媒体流的NAT映射表,故媒体流可以顺利穿越NAT。 STUN协议最大的优点是无需现有NAT设备做任何改动。目前,网络中已有大量的NAT,而且这些NAT并不支持VoIP应用。如果采用MIDCOM或ALG方式,则需要替换现有的NAT,实施起来难度较大,且MIDCOM方式无法实现对多级NAT的有效控制。如果采用STUN方式,不但无需改动NAT,而且能够很好地适应多个NAT串联的网络环境
STUN用途
目前定义了三种STUN用途:
InteractiveConnectivity Establishment(ICE)[MMUSIC-ICE],交互式连接建立
Client-initiatedconnections for SIP [SIP-OUTBOUND],用于SIP的客户端初始化连接
NATBehavior Discovery [BEHAVE-NAT],NAT行为发现
STUN服务器特点
1.符合 IETF 的 STUN (rfc3489) 标准。
2.支持多级NAT/FW 。
3.无需对现有 NAT 和防火墙设备做任何改动。
4.不需要转发,效率高。
5.提供安全认识机制。
6.需要 STUN 客户端支持。
7.不支持 TCP 连接的穿透。
8.不能穿透 Symmetric NAT 和 Symmetric UDP FW 。
STUN问题总结
H.323中包含了基于TCP的信令,因此H.323穿越不能通过STUN完全解决。能够使得UDP数据包穿越NAT,但是只支持NAT类型的子集,特别是STUN不支持对称类型的NAT穿越,而该类型在很多企业中的应用是很普遍的。STUN的发现过程基于NAT处理UDP的方式,可能对某些新型的NAT设备是不正确的。当STUN服务器不是位于一个公共的地址域时,STUN不能正常工作。
TURN:
一个位于NAT后面的主机可能相同其他位于NAT后面的主机交流。为了达到目的,可以用打洞的方法来找到一条路径,但是不通过转发。 当两台主机都位于对称NAT之后时,打洞技术可能会失败。TURN协议允许一个位于NAT之后的主机请求另一台主机转发。客户端可以通过服务端转发包到另一端。并且可以控制转发如何结束。 这个客户端通过在服务端获取一个IP端口对,也被称作转发端口地址来进行上述操作。 当对方发送一个包到转发端口地址时,服务器就将这个包转发到客户端。当一个客户端发送一个数据包到服务器时,服务器转发这个包到转发端口地址所对应的客户端。 一个采用TURN协议的客户端一定有一些方法把自己的转发地址告诉对方,并且知道每个通信伙伴的IP端口地址对。
TURN方式解决NAT问题的思路与STUN相似,也是基于局域网接入用户通过 某种机制预先得到其私有地址对应在公网的地址,不同的是STUN方式得到的地址为出口NAT上的地址,TURN方式得到地址为TURN 服务器上的地址,然后在报文负载中所描述的地址信息直接填写该公网地址的方式。TURN适合处于对称NAT或防火墙之后的实体接收来自连接另一端的对等实体的数据。
STUN,TURN分析矩阵图
Name | STUN | TURN |
Full Cone NAT Support | Yes | Yes |
Restricted Cone NAT Support | Yes | Yes |
Port Restricted Cone NAT Support | Yes | Yes |
Symmetric NAT Support | NO | Yes |
UDP Session Support | Yes | Yes |
TCP Session Support | NO | Yes |
Need Voip Client Support | Yes | Yes |
Server Need Public IP | Yes | Yes |
Advantage | Light ,Portable Not Relay Client PDU | Support TCP(H323) Support Symmetric NAT |
Shortcomings | Not Support TCP(H323) Not Support Symmetric NAT | Relay Client PDU Bandwidth ,Delay, Package lost , |