H.323会议系统的P2P NAT穿越解决方案

2009-09-07 00:00  
随着国际互联网IPv4网络IP资源的日益紧张,越来越多的企业部署了企业局域网。而NAT穿越问题也就随之而来,日益成为制约企业视频会议发展的关键因素。

随着客户对实时性和抗丢包性要求的提高,以及为了减轻中心点负荷、增强中心点承载能力、减少QoS问题等目标,采用点对点(P2P)方案的NAT穿越成为迫在眉睫的需求。

本文针对当前互联网的NAT类型、检测/穿越NAT的方法及标准H.323协议下实现UDP、TCP的NAT穿越方法、特别是P2P方案的NAT穿越,进行了相应的探讨,并给出了系统级的解决方案。

一、NAT类型

NAT英文全称是 Network Address Translation,中文意思是“网络地址转换”,它是一个IETF标准,允许一个整体机构如企业以一个公用IP地址出现在Internet上。顾名思义,它是一种把内部私有IP网络地址翻译成合法Internet IP地址的技术。这是目前IPv4网络资源严重不足条件下广泛存在的解决方法。首先介绍一下几种比较常见的NAT类型。

1. 基本NAT(Basic NAT)



EpA NAT EpB EpC EpD 私有IP:端口A 公网IP:端口A 22.22.22.2 22.22.22.3 22.22.22.4 如图,基础NAT将私网主机的私有IP地址转换成公网IP地址,但并不将TCP/UDP端口信息进行转换。基础NAT一般用在当NAT拥有很多公网IP地址的时候,它将公网IP地址与内部主机进行绑定,使得外部可以用公网IP地址访问内部主机。(注:实际上是只将IP转换,192.168.0.23 <-> 210.42.106.35,这与直接设置IP地址为公网IP还是有一定区别的,特别是对于企业来说,外部的信息都要经过统一防火墙才能到达内部,但是内部主机又可以使用公网IP)。

2. 完全锥形(Full Cone)



EpA NAT EpB EpC EpD 私有IP:端口A 公网IP:MAP port 22.22.22.2 22.22.22.3 22.22.22.4 如图。前提:EpA[私有IP:端口A]###NAT[公网IP:MAP port]建立并维持:1) EpA can send packets to any 公网Ep(EpB or EpC or EpD);2) 公网Ep(EpB or EpC or EpD) can send packets to EpA [私有IP:端口A] by [公网IP:MAP port]。

3. 限制锥形(Restricted Cone)



EpA NAT EpB EpC EpD 私有IP:端口A 公网IP:MAP port 22.22.22.2 22.22.22.3 22.22.22.4 × × 如图。前提:EpA[私有IP:端口A]###NAT[公网IP:MAP port]建立并维持;EpA sends a packet to EpB by [私有IP:端口A] but no send any packet to EpC.1) EpA can send packets to any 公网Ep(EpB or EpC or EpD)2) 公网EpB[公网IP:any 端口] can send packets to EpA[私有IP:端口A] by [公网IP:MAP port]3) 公网EpC[公网IP:any 端口] cann’t send packets to EpA[私有IP:端口A] by [公网IP:MAP port]

4. 端口限制锥形(Port Restricted Cone)



EpA NAT EpB EpC EpD 私有IP:端口A 公网IP:MAP port 22.22.22.2:端口B 22.22.22.3:端口C 22.22.22.4 × × × 22.22.22.2:端口C 22.22.22.3:端口B 如图,
前提:EpA[私有IP:端口A]###NAT[公网IP:MAP port]建立并维持;EpA sends a packet to EpB [公网IP B:端口B] by [私有IP:端口A] and sends a packet to EpC[公网IP C:端口C] by [私有IP:端口A], but no send any packet to EpB[公网IP B:端口C].
1) EpA can send packets to any 公网Ep(EpB or EpC or EpD)
2) 公网EpB[公网IP B:端口B] can send packets to EpA[私有IP:端口A] by [公网IP:MAP port]
3) 公网EpB[公网IP B:端口C] cann’t send packets to EpA[私有IP:端口A] by [公网IP:MAP port]
4) 公网EpC[公网IP C:端口C] can send packets to EpA[私有IP:端口A] by [公网IP:MAP port]
5) 公网EpC[公网IP C:端口B] cann’t send packets to EpA[私有IP:端口A] by [公网IP:MAP port]
6) 公网EpD[公网IP:any 端口] cann’t send packets to EpA[私有IP:端口A] by [公网IP:MAP port]

5. 对称形(Symmetric)



EpA NAT EpB EpC EpD 私有IP:端口A 公网IP A:端口A 22.22.22.2:port B 22.22.22.3:port C 22.22.22.4:port D 公网IP B:端口B 公网IP C:端口C × × 如图,前提:EpA[私有IP:端口A]###NAT[公网IP:MAP port]##公网Ep [公网IP:port X]之间是一一对应的关系,EpA发包到EpB、EpC、EpD,NAT会给每一条通道分配一个映射地址[公网IP:MAP port],其中IP和端口不全相同。每个外网Ep只能通过其对应的公网映射地址/端口与EpA通信。

二、NAT检测与穿越方案——STUN

解决穿透NAT问题的最常用的一种思路是,私网中的终端通过某种机制预先得到出口NAT上的对外地址,然后在载荷中所填写的地址信息直接填写出口NAT上的对外地址,而不是私网内终端的私有IP地址,这样载荷中的内容在经过NAT时就无需被修改了,只需按普通NAT流程转换报文头的IP地址即可,载荷中的 IP地址信息和报文头地址信息是一致的。STUN协议就是基于此思路来解决应用层地址的转换问题。

STUN的全称是Simple Traversal of UDP Through Network Address Translators,即UDP对NAT的简单穿越方式。应用程序(即STUN CLIENT)向NAT外的STUN SERVER通过UDP发送请求STUN 消息,STUN SERVER收到请求消息,产生响应消息,响应消息中携带请求消息的源端口,即STUN CLIENT在NAT上对应的外部端口。然后响应消息通过NAT发送给STUN CLIENT,STUN CLIENT通过响应消息体中的内容得知其NAT上的外部地址,并将其填入以后呼叫协议的UDP负载中,告知对端,本端的RTP接收地址和端口号为NAT 外部的地址和端口号。由于通过STUN协议已在NAT上预先建立媒体流的NAT映射表项,故媒体流可顺利穿越NAT。

STUN协议最大的优点是无需对现有NAT/FW设备做任何改动。这是由于实际应用中,已有大量的NAT/FW,并且这些NAT/FW并不支持VoIP及视频会议等应用,如果用其他解决方案诸如MIDCOM或NAT/ALG方式来解决此问题,则需要替换现有的NAT/FW,这是不太容易的。而采用STUN方式无需改动NAT/FW,这是其最大优势,同时STUN方式可在多个NAT串联的网络环境中使用,但MIDCOM方式则无法实现对多级NAT的有效控制。

STUN的局限性在于需要终端支持STUN CLIENT的功能,同时STUN并不适合支持TCP连接的穿越,因此不支持H.323信令的穿越。另外STUN方式不支持对称NAT (Symmetric NAT)类型穿越。

STUN协议是一个客户机/服务器协议,STUN协议支持UDP/TCP方式检测,以下对STUN协议NAT UDP检测方法作了简单描述。
客户端主机所在网络可以分为以下类型: 
1. Opened: 即主机拥有公网IP,并且没有防火墙,可自由与外部通信。
2. Full Cone NAT: 主机前有NAT设备,且NAT设备为Full Cone NAT。 
3. Restricted Cone NAT: 主机前有NAT设备,且NAT设备为Restricted Cone NAT。 
4. Port Restricted Cone NAT: 主机前有NAT设备,且NAT设备为Port Restricted Cone NAT。 
5. Symmetric UDP Firewall: 主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙。
6. Symmetric NAT: 主机前有NAT设备,且NAT设备为Symmetric NAT。
7. Blocked: 防火墙限制UDP通信。

STUN服务器运行在UDP协议之上,它具有两个固定公网地址,能完成以下几个功能: 
1. 告诉STUN客户端经NAT设备映射后的公网地址。
2. 根据STUN客户端的要求,从服务器的其他不同IP或端口向客户端回送包。

如何根据STUN服务器提供的功能来确认网络类型呢? RFC3489给出了如图过程:

图:STUN NAT类型检测示图

三、H.323协议扩展的NAT穿越方案——H.460/18、19

上文提到,STUN协议提供了UDP对大部分NAT的穿越的解决方案。但是对于应用TCP协议的H.323会议信令来说,就无能为力了。

为此,ITU(International Telecommunications Union国际电信联盟) 在H.323上扩展了 H.460/18、19协议,专门阐述了如何利用Internet上的服务器进行H.323信令与码流NAT穿越的协议与实现。H.460/18定义H.323视频终端交换信号信息,H.460/19 则定义了媒体的NAT-firewall穿越机制。

H.460使得视频会议的NAT/Firewall穿越真正进入了服务供应商及企业领域。目前,主流的H.323视频会议厂商均提供了支持H.460协议的终端和穿越服务器TS(Traversal Server)。但是,H.460最大的问题在于所有的信令和码流均需要通过Traversal Server进行中转,这对服务器的性能、网络带宽要求都提出了过高的要求。此外,多次的码流转发会对音视频造成额外的丢弃损失和网络时延,这也是视频会议中不可接受的。

四、H.323 + Traversal Server + STUN Server:P2P系统构架下的NAT穿越方案

为了克服H.460方案中,Traversal Server存在的服务器负载过大、多次转发引入的系统时延等问题,KEDACOM创新的采用了Traversal Server + STUN Server的综合方案,(命名为KDV-TS),成功将P2P技术引入H.323系统。系统构架图如下:


总体架构图

与单纯的H.460 Traversal Server比较,KDV-TS系统将新增NAT类型检测流程,修改部分呼叫流程,以达到在EndPoint间直接传送码流的目的(命名为P2PendPoint)。

NAT类型检测消息即沿用STUN协议的消息定义。KDV-TS与P2PEndPoint(即上图H.460EP+NTCTC)进行NAT类型检测实现步骤如下:


NAT类型检测

1. P2PEndPoint向KDV-TS发送请求信令1,要求得到自身经NAT映射后的地址: 
a. 收不到KDV-TS响应信令2,则认为UDP被防火墙阻断,不能通信,网络类型:Blocked。 
b. 收到KDV-TS响应信令2,如果为错误响应,则判断错误号,再次发送正确的请求信令1,回退到第一步,三次后还不成功,将不再检测,网络类型为:UnKnowed,进入第6步;如果收到正确响应,对比本地地址和端口,如果相同,则认为无NAT设备,进入第2步,否则认为有NAT设备,进入3步。 

2. P2P EndPoint向KDV-TS发送请求信令3,要求服务器从其它IP和PORT向P2PEndPoint发送响应信令4: 
a. 收不到KDV-TS从其它IP和PORT的响应,认为包被前置防火墙阻断,网络类型:Symmetric UDP Firewall。 
b. 收到则认为P2PEndPoint处在一个开放的网络上,网络类型: Opened

3. P2PEndPoint向KDV-TS发送请求信令3,要求KDV-TS从其他IP和PORT向P2PEndPoint发响应信令4: 
a. 收不到KDV-TS从其他地址和port的响应,认为包被前置NAT设备阻断,进入第4步。 
b. 收到则认为NAT设备类型为Full Cone,即网络类型: Full Cone NAT

4. P2PEndPoint向KDV-TS的另外一个port发送请求信令5,要求得到自身经NAT映射后的地址,并对比之: 
a. 地址或端口不相同,则网络类型: Symmetric NAT
b. 地址和端口相同则认为是Restricted NAT,进入第5步,进一步确认类型。 

5. P2PEndPoint向KDV-TS发送请求信令7,要求KDV-TS从相同IP的其他PORT向P2PEndPoint回响应信令8: 
a. 收不到KDV-TS从其他PORT地址的回复,认为包被前置NAT设备阻断,网络类型: Port Restricted Cone NAT
b. 收到则认为网络类型: Restricted Cone NAT

6. P2PEndPoint知道自己所在的网络类型后,定期向KDV-TS发送指示信令9,表明自己所在的网络类型。

配合NAT类型探测,在没有Symmetric NAT终端参与的点对点呼叫的场景下,即可使用P2P技术进行H.323呼叫。呼叫的建立过程可以表达如下:



1. A发起呼叫;
2. 服务器向A请求NAT类型
3. 返回获取A的NAT类型;
4. 服务器向B转发呼叫请求(信令转发);
5. 服务器同时向B请求并获取B的NAT类型;
6. 双方在NAT上打洞并持续保活;
7. A向B打开逻辑通道;
8. 服务器根据NAT类型,决定启用P2P呼叫。修改打开逻辑通道信令的目标地址为NAT上洞的地址和端口;
9. B向该地址和端口向A发送码流(P2P的一条码流建立成功);
10. 重复7、8、9直到双方完成所有逻辑通道建立;
11. 开始正常会议使用。

成功将Traversal Server 与 STUN Server引入到H.323视频会议系统,KEDACOM的KDV8000E多点控制单元(MCU)可以完美的将企业视频会议系统中频繁遭遇的NAT/Firewall 穿越、多运营商线路接入、中心点带宽不足、无公网服务器地址等诸多问题一并解决,最大限度的简化视频会议的部署成本,简化网络管理难度,提高企业效益。