文档库 最新最全的文档下载
当前位置:文档库 › SIP ALG穿透NAT的实现

SIP ALG穿透NAT的实现

SIP ALG穿透NAT的实现

沈军1,周淑华2,张思发1 时间:2008年05月05日

字体: 大中小关键词:信令媒体流地址映射端口号内网

摘要:为解决SIP应用穿透NAT的问题,剖析了NAT的工作原理,并针对SIP协议信令过程的特点,提出了采用ALG设备解决NAT 的穿透问题,具体设计了ALG的结构和相关实现算法,并给出了详细的实现方案。

关键词:会话发起协议(SIP) 网络地址转换(NAT) 会话描述协议(SDP) 信令

会话发起协议SIP[1](Session Initiation Protocol)是由IETF组织于1999年提出的在Internet网络环境中实现实时通信应用的一种信令协议。SIP引发了现代通信体系结构的变革,然而它却在视频能力、会议控制方面没有一个完善的标准;同时,由于大量企业和驻地网都采用了私有编址[2],并通过网络地址转换NAT(Network Address Translation)来控制与公共网络的通信,而SIP数据包需通过信令消息中的IP地址和端口号来实现目的地寻址,且它的媒体流端口是动态分配的,这就为在NAT上配置固定的包过滤策略带来了困难。因此,SIP穿透NAT是绝大多数VoIP运营商亟待解决的问题。

当前,几种主要的NAT穿透技术有SIP ALG、Full Proxy、MidCom、VPN、隧道穿透、STUN等。其中,SIP ALG方式是在传统的NAT 上进行扩展,使之具备感知SIP呼叫控制协议的能力,从而对基于SIP呼叫的地址实现穿透。它是一种比较简单的方案,最突出的特点是ALG和具体的SIP系统无关,对于一个SIP系统不需要做任何修改,只要在响应的NAT上加载SIP ALG,就能完成私网到公网甚至私网中的两个用户之间的SIP连接。

1 SIP应用穿透NAT面临的问题

1.1 NAT的工作原理

NAT[3]被置于两网间的边界。NAT技术使得一个私有网络可以通过Internet注册IP连接到外部世界。位于内网和外网中的NAT路由器在发送数据包之前,负责把内部IP翻译成外部合法地址。当从外网来的含公网地址信息的数据包到达NAT时,NAT使用预设好的规则(其组元包含源地址、源端口、目的地址、目的端口、协议)来修改数据包,然后再转发给内网接收点。NAT的基本工作原理如图1所示,NAT 设备实际上是在维护一个状态表,该表用于把非法的IP地址映射到合法的IP地址上。

1.2 技术难点

与传统NAT支持HTTP等数据的穿透不同,SIP应用中的语音和视频数据需通过信令消息中的IP地址和端口号来实现目的地寻址,因此信令消息在地址穿透中不仅需要对TCP/UCP层的端口信息以及IP层的源地址和目的地址进行变换,还需对IP包载荷中的相关地址信息进行变换。同时,对于SIP应用来说,是在控制信息中动态地协商媒体流端口,信令协议中的IP地址也是私有的,因此要准确把握相关的地址和端口信息,并进行正确的转换。这是本文需要解决的首要技术难点。

其次,SIP ALG实现对NAT的穿透会因呼叫方处在内网和外网而不同,因此对进出NAT的SIP消息在解析时要判断是内网之间的呼叫

请求(内部消息)、外网呼叫请求内网(对内消息),还是内网呼叫请求外网(对外消息),以便对该消息进行正确处理。这也是本文需要解决的技术难点。

2 SIP ALG的设计思想

由于媒体流端口是在呼叫双方SIP信令建立连接后动态协商的,因此对SIP消息穿透NAT设备要综合考虑这两个方面因素。

2.1 SIP信令的穿透原理

SIP信令穿透NAT与HTTP穿透类似,NAT设备只要打开固定的端口,就能保证SIP信令穿透NAT并与外界建立连接。

本文基于SIP终端设备的特殊性来考虑信令穿透NAT。SIP终端设备会周期性地发送Register消息[1]到注册服务器上,由于不断有信令消息经过NAT设备,致使NAT设备对通过的消息流始终保持一个确定的端口;同时,当Register消息经过ALG,ALG就会记录信令穿透NAT时经NAT转换后的IP地址和端口等信息,并将此信息与NAT后面的终端用户ID(如890010098)等信息进行绑定。这样,当一个信令到来,ALG将通过NAT上正确的地址和端口发送给被叫方。

2.2 媒体流的穿透原理

当信令穿透NAT后,NAT后面的SIP终端就可以收到来自外网的呼叫请求。这时呼叫方的Invite消息和响应方的200(OK)消息中都携带了用于描述与会话相关的信息及与流媒体相关参数的SDP(Session Description Protocol)消息体[4]。当该消息通过ALG时,ALG将通过与该媒体流相关的呼叫——会话层消息中的用户ID(如890010098)识别出NAT上的IP地址和端口并进行相应的转换,这样当呼叫方收到200(OK)消息时就能从SDP消息体中获取该IP地址和端口等信息并发送ACK确认消息,从而完成一个会话的建立。

3 SIP ALG的实现

利用SIP ALG实现对NAT的穿透,主要是对流经ALG的SIP消息进行处理和维护。按照各部分功能的差异,可以将SIP ALG划分为消息解析模块、消息修改模块和消息转发模块,SIP ALG的整体结构如图2所示,该图体现了各功能模块间的相互关系。

下面以一个典型的两个不同NAT内的用户(Joe:890010098@192.168.1.4和Bob:810000004@10.10.15.44)通过注册服务器(SER服务器)完成连接的过程为例,来说明SIP ALG的具体实现。SIP ALG解决NAT穿透的示意图如图3所示。

3.1 前提条件

SIP ALG的实现主要是对Request、Response消息进行解析、修改与转发。因此在实现ALG前首先要了解SIP请求(Request)的方法(Register、Invite、ACK、Options、Cancel、Bye)[1],SIP回答(Response,包括Trying、Ringing、OK和ACK)[1]以及SIP消息中的相关头域(Request-URI、Via、From、To、Call-ID、Cseq、Contact等)[1]。

3.2 消息解析模块的实现

消息解析模块主要对流经ALG的SIP消息进行解析,并判断该消息是内部消息、对外消息还是对内消息,以便消息修改模块能对这些消息进行正确的处理。消息解析模块的工作流程如图4所示。它主要判断数据包From、To、Via等头域中的IP地址信息,以准确解析消息类型。

3.3 消息修改模块的实现

由于同一NAT内部的用户间可以直接通信,因此“内部消息处理”模块不需要对消息体进行修改。这样就把消息修改模块分为对内消息修改与对外消息修改。这两个过程实际上是可逆的。对内消息修改主要根据地址映射表把外网IP和端口号转换成内部IP和端口号,以便外部请求能准确到达NAT内侧的用户端;对外消息修改则根据地址映射表把内部IP和端口号转化成外网可用的IP和端口号,这样,来自外网的请求就能准确定位到该地址。但无论哪个模块,最终结果都是对相应的Request和Response消息中与NAT有关的IP地址和端口号进行修改。消息修改模块的处理流程如图5所示。

对信令消息的修改需要对Invite、ACK、BYE和Register等Request消息和100(Tring)、180(Ringing)以及200(OK)等Response消息中的Via、From、To、Call-ID、Contact等头域中包含的私有IP地址和端口信息进行修改。而对SDP消息体的处理是SIP ALG实现其功能的关键所在,因为SDP消息体的交换是实现呼叫双方媒体流通信的前提和关键。对SIP控制的向内的媒体流转发,ALG分析向外的Invite和200(OK)消息中的SDP消息体中“Media Description”和“Connection Information”行,根据这两行中的描述地址在NAT上启用未用端口,完成向内接收媒体流的目的地址翻译,从而实现媒体流通信的建立。需要注意的是,在对Response消息进行修改时,还需通过Call-ID匹配呼叫的上下文环境,也要加入Record-Route头域以告知内网上的SIP终端,本次呼叫中以后所有的SIP消息都要流经该SIP ALG,这样才能保证ALG的正确转发。最后,对消息修改完毕后,需要重新计算消息的长度,并保存在Content-Length中。3.4 消息转发模块的实现

消息转发模块主要是通过控制NAT,对修改后的SIP消息进行转发,以完成一个会话的建立。消息转发模块在ALG中保留并维护当前呼叫的上下文环境,也就是一个地址映射信息表,如表1所示。以记录相关的地址映射信息。

表1中的数据表示所有目的地址为202.205.11.230、60012的SIP包都会被NAT网关转发到主机10.10.15.44:5060上处理。消息修改模块在做修改前,要首先查询ALG内记录的地址映射信息表,如果表内已建立了该用户的信息,则按此信息对向NAT处的SIP消息做相应修改,否则丢弃该消息。

为生成相关地址映射信息表,ALG首先需要分析向外的Register消息。ALG记录Register中的To和Contact头域,按它们的值在NAT设备上启用一个未用的端口,然后ALG记录生成的映射信息并填入地址映射信息表。生成地址映射信息表后,消息修改模块再按映射信息修改向外的Invite和Register等报文,然后再通过消息转发模块实现对NAT的穿透。

本文通过分析NAT的工作原理以及SIP信令与媒体流的特点,详细讲述了SIP ALG的具体实现方法。实验证明,本文设计的SIP ALG 能很好地解决NAT穿透问题,且运行稳定,互通性好。

参考文献

1 Handley M,Schulzrinne H,Schooler E et al.SIP:Session Initiation Protocol.RFC3261,IETF,2002

2 Rekhter Y,Moskowitz B,Karrenberg D et al.Address alloca-tion for private internets.RFC1918,IETF,1996

3 Rosenberg J,Weinberger J,Huitema C et al.STUN- Simple Traversal of User Datagram Protocol(UDP) Through Network Address Translators (NATs).RFC3489,IETF,2003

4 Handley M,Jacobson V.SDP:Session Description Protocol.RFC2327,IETF,1998

5 Rosenberg J,Weinberger J,Schulzrinne H.SIP Extensions for NAT Traversal.Internet Draft,IETF,2001

6 沈波,张顺颐,沈苏彬.会话发起协SIP的分析和研究.数据通信,2001;(4)

相关文档