SIP ALG穿透NAT的实现

转载 2012年03月26日 16:16:31

原文地址:http://www.chinaaet.com/article/index.aspx?id=3655

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穿透问题,且运行稳定,互通性好。

BCM SIP ALG原理及实现(应用层实现机制)

一、SIP ALG概念及作用
  • liujianfeng1984
  • liujianfeng1984
  • 2014年07月13日 16:53
  • 4481

内核SIP ALG学习指引和基本实现原理(分析BCM方案实现)

总结一下内核ALG的学习方法和基本原理,方便以后需要了解这方面的朋友少走弯路。该文档分析基于broadcom5358方案。...
  • liujianfeng1984
  • liujianfeng1984
  • 2013年09月25日 01:14
  • 9149

BCM SIP ALG原理及实现(应用层实现机制)

一、SIP ALG概念及作用
  • liujianfeng1984
  • liujianfeng1984
  • 2014年07月13日 16:53
  • 4481

VOIP NAT穿越之SIP信令穿越

本文原创自 http://blog.csdn.net/voipmaker  转载注明出处。 本文是VOIP通信NAT系列专题的第三篇, 本文论述NAT对SIP协议穿越的影响,SIP协议...
  • u012377333
  • u012377333
  • 2015年03月19日 17:10
  • 1185

ALG原理与应用

1      NAT ALG简介 普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323、SIP等)、...
  • xiaoshengqdlg
  • xiaoshengqdlg
  • 2014年03月28日 17:52
  • 1089

NAT ALG原理与应用

NAT ALG原理与应用
  • chenlycly
  • chenlycly
  • 2016年08月29日 23:10
  • 647

SIP基本场景分析

1、SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始、管理和终止网络中的语音和视频会话,具体地说就是用来生成、修...
  • zwz1984
  • zwz1984
  • 2016年06月08日 21:06
  • 491

关于SIP防火墙穿越的汇总 .

术语和基础知识 防火墙   一个防火墙限制私人内网和公众因特网之间的通讯,典型地防火墙就是丢弃那些它认为未经许可的数据包。在数据包穿越一个防火墙时,它检查但是不修改包里的 IP地址和TCP/ ...
  • dxpqxb
  • dxpqxb
  • 2014年08月22日 10:24
  • 1676

SIP穿越NAT SIP穿越防火墙-SBC

FireWall&NAT FireWall是一种被动网络安全防卫技术,位于网络的边界,在两个网络之间执行访问控制策略,防止外部网络对内部信息资源的非法访问,也可以阻止特定信息从内部网络被非法输出。...
  • wtyvhreal
  • wtyvhreal
  • 2015年06月28日 12:51
  • 2587

ASPF技术白皮书

ASPF技术白皮书 关键词:ASPF,包过滤 摘  要:ASPF是一种应用层状态检测技术,它通过与NAT和ALG等技术的组合应用,实现对应用层协议状态的处理和检测。本文详细介绍了ASPF技术的工作...
  • Sun_Rise2011
  • Sun_Rise2011
  • 2013年12月07日 10:08
  • 1154
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SIP ALG穿透NAT的实现
举报原因:
原因补充:

(最多只允许输入30个字)