SIP NAT Traverse

NAT种类

静态NAT:内网IP与公网IP手动的实现静态绑定,永久生效,多用于公网IP地址多到能与内网主机实现一一对应的静态绑定的情形。

动态NAT:在内网主机向外网发起连接请求时,NAT从公网IP Pool中临时的选择一公网IP与其绑定,待连接结束或连接长时间无响应时,该绑定自动解除。动态NAT分为两大类,若内网主机使用同一内网IP和同一端口号向外网同时发起多个连接时,NAT为所有连接绑定的公网IP和端口号均相同,则属于非对称NAT;若每一个连接所对应的公网IP相同,但公网端口号不同,则属于对称NAT。

非对称NAT又分为三类。如内网主机使用内网IP地址x和端口y(x:y)向外网(A:B)发起连接,NAT将(x:y)绑定到公网地址X和端口Y(X:Y)。此时如果NAT允许任何外网主机通过(X:Y)与内网(x:y)通信,则属于Full Cone NAT。如果NAT只允许源IP地址是A,端口号不限的数据包通过并到达内网(x:y),则属于Restricted Cone NAT。如果NAT只允许源IP地址是A,端口号是B的数据包通过并到达内网(x:y),则属于Port-Restricted Cone NAT。

NAT穿越方案

STUN详解
STUN是RFC3489规定的一种NAT穿透方式,全称是是Simple Traversal of UDP Through NAT,STUN的探测过程需要有一个公网IP的STUN-server,在NAT后面的UAC必须和此server配合,互相之间发送若干个UDP数据包。UDP包中包含有UAC需要了解的信息,比如NAT外网IP,PORT等等。

UAC通过是否得到这个UDP包和包中的数据判断自己的NAT类型。假设有如下UAC(B),NAT(A),SERVER(C),UAC的IP为IPB,NAT的IP为 IPA ,SERVER的 IP为IPC1 、IPC2。服务器C必须有两个IP。

(1)NAT的探测过程
STEP1:B向C的IPC1的port1端口发送一个UDP包。C收到这个包后,会把它收到包的源IP和port写到UDP包中,然后把此包通过IP1C和port1发还给B。这个IP和port也就是NAT的外网IP和port,也就是说在STEP1中就得到了NAT的外网IP。

注意:C返回给B的这个UDP包B一定收到(如果你不知道,去读下我的其它文章)。如果在你的应用中,向一个STUN服务器发送数据包后,你没有收到STUN的任何回应包,那只有两种可能:1、STUN服务器不存在,或者弄错了port。2、NAT设备拒绝一切UDP包从外部向内部通过(不支持cone NAT)。

当B收到此UDP后,把此UDP中的IP和自己的IP做比较,如果是一样的,就说明自己是在公网,下步NAT将去探测防火墙类型。如果不一样,说明有NAT的存在,系统进行STEP2的操作。

STEP2:B向C的IPC1发送一个UDP包,请求C通过另外一个IPC2和PORT(不同与SETP1的IP1)向B返回一个UDP数据包(C要有两个IP是为了检测cone NAT的类型)。如果B收到了这个数据包,说明NAT不对数据包进行任何过滤,这也就是STUN标准中的full cone NAT。而Full cone nat往往部署得很少,也就是说能收到这个数据包的可能性不大。如果没收到,那么系统进行STEP3的操作。

STEP3:B向C的IPC2的port2发送一个数据包,C收到数据包后,把它收到包的源IP和port写到UDP包中,然后通过自己的IPC2和port2把此包发还给B。和step1一样,B肯定能收到这个回应UDP包。如果此包中的port和step1中的port一样,那么可以肯定这个NAT是个CONE NAT,否则是对称NAT。根据对称NAT的规则,当目的地址的IP和port有任何一个改变,那么NAT都会重新分配一个port使用,而在step3中,和step1对应,我们改变了IP和port。因此,如果是对称NAT,那这两个port肯定是不同的。如果PORT是不同的,STUN的穿越方式就要被排除掉,因为它不能穿越对称NAT。如果相同,那么只剩下了restrict cone 和port restrict cone。系统用step4探测是是那一种。

STEP4:B向C的IP2的一个端口PD发送一个数据请求包,要求C用IP2和不同于PD的port返回一个数据包给B。如果B收到了,那也就意味着只要IP相同,即使port不同,NAT也允许UDP包通过。显然这是restrict cone NAT。如果没收到,就是port restrict  NAT.

(2)SIP怎么使用STUN

SIP通过STUN得到NAT的外网IP和SIP的信令监听端口的外网port,替换SIP注册包中的contact头中的IP和port,然后注册。这样就可以确保当有人呼叫内网SIP-UA的时候注册服务器能找到它。需要注意的是,NAT发现一个连接超过一段时间后没有活动,它就会关闭这个影射,因此内网SIP-UA必须间隔一端时间发送一个数据包出去以keep-alive。另外,当内网SIP-UA要和外网建立RTP通讯的时候,需要把SDP中的IP和PORT改成公网IP和PORT。修改SIP包中相关IP和Port的任务由内网SIP-UA承担,而且它最终需要自己独立的和外网SIP-UA通讯,并通过防火墙做中继。

STUN协议最大的优点是无需现有NAT/FW设备做任何改动,同时STUN方式可在多个NAT串联的网络环境中使用。它的局限性在于STUN并不适合支持TCP连接的穿越,因而不支持H.323穿越。同时STUN方式不支持对对称NAT的穿越。

TURN

TURN全称是Traversal-Using-Relay-NAT,即通过Relay方式穿越NAT。TURN应用模型通过分配TURN-Server的地址和端口作为私网中VOIP终端对外的接受地址和端口,即私网终端发出的报文都要经过TURN-Server进行Relay转发,这种方式除了具有STUN方式的优点外,还解决了STUN应用无法穿透对称NAT(Symmetric NAT)以及类似的Firewall设备的缺陷,同时TURN支持基于TCP的应用,如H323协议。此外TURN-Server控制分配地址和端口,能分配RTP/RTCP地址对(RTCP端口号为RTP端口号加1)作为私网终端用户的接受地址,避免了STUN方式中出口NAT对RTP/RTCP地址端口号的任意分配,使得客户端无法收到对端发来的RTCP报文(对端发RTCP报文时,目的端口号缺省按RTP端口号加 1发送)。

TURN的局限性在于需要VOIP终端支持TURN Client,这一点同STUN一样对网络终端有要求。此外,所有报文都必须经过TURN Server转发,增大了包的延迟和丢包的可能性。

SBC(Session Border Controller)

SBC方案,是迄今为止,对FW/NAT问题解决最完善的方案。实施SBC 方案,不仅不用对原有网络中的FW/NAT 设备做任何改动,而且对原有网络没有任何特殊要求。

SBC本身可以被看作支持VoIP的Proxy,它是一种“可识别应用层”的设备,可以识别第五层和第七层的消息,并且还可以处理第五层的众多会话信令协议,修改数据包头的地址,从而实现SBC 内外网地址变换。SBC同时还可以用于协助VoIP穿越远端防火墙/NAT设备所有经过SBC的信令和媒体流经过SBC的协调和修改,可以在系统侧和用户侧正确传输。用户侧的NAT-Firewall可以接受这种修改后的信令和媒体流并把他们传送到用户侧内网。

对于SIP 终端,SIP终端设备会周期性发注册消息到SBC,由于不停的有信令消息经过防火墙/NAT设备,可以使防火墙/NAT 对通过的消息流始终保持一个确定的端口;同时,当注册信息经
过SBC,它将记录在防火墙上的第三层的IP地址和端口等信息,并且将此信息与防火墙后面的终端的用户名或电话号码等第五层信息进行绑定记录。这样,当一个信令到来,SBC将通过防火墙上正确的地址和端口发送给被叫方。

当呼叫建立后,双向的媒体流端口都是动态建立的。由于媒体流同样也通过SBC,SBC将通过与该媒体流相关的呼叫(第五层消息中的用户名或电话号码)识别出防火墙上的IP地址和端口。因此,SBC 可以把相应的媒体流发送到防火墙上的相关IP 地址和端口,然后正确的使媒体流到达防火墙后的用户侧。

SBC 本身可以被看作支持VoIP 的防火墙,是一种“可识别应用层”的设备,可以识别第五层和第七层的消息,并且还可以处理第五层的众多会话信令协议,修改数据包头的地址,从而实现“远端防火墙穿越”。同时,SBC可以通过对会话数目的限制,实现应用层防D.O.S.攻击。

ALG(Application Layer Gateway)

ALG(Application Layer Gateway)适应所有NAT 方式,并不需要SIP Client 做任何额外的支持。它对Application 层的SIP 信令进行处理和修改,从而做到透明转换地址。

ALG修改SIP消息里面的SIP地址和端口和SDP消息里面的RTP地址和端口,其中RTP地址和端口要向RTP-Proxy请求获得,RTP Proxy 分配自己的一个空闲的地址和端口,并和这个Call 保持映射关系。并为分配给呼叫双方的地址和端口进行绑定,这样,呼叫双方的RTP连接地址都是RTP Proxy,由RTP Proxy经过中转,发至真正的目的地。