VoIP应用中NAT知识分享
VoIP(Voice over IP)技术包含SIP、H.323等一系列的协议,基于IP网络通信,功能丰富,业务灵活,不仅支持语音业务,而且能够提供视频以及传真等多种服务,应用也越来越广泛, 然而当前应用组网大部分都是部署在NAT防火墙内,对VoIP业务的应用有一定影响,使用中也会遇到各种问题,下面和大家分享几种常用NAT穿越技术
NAT环境常见问题
· SIP账户注册不上,Register报文收不到响应消息;
· 呼叫通话中出现语音单通,内网设备收不到公网媒体流;
· 收不到ACK信令,呼叫接通持续30秒自动挂断;
· 收不到BYE消息,通话挂不断;
原因分析
SIP信令呼叫建立和媒体通信的建立是根据SIP消息头部和SDP消息体里携带的IP地址和端口来协商的,如果SIP服务器在公网,设备部署在NAT网络下,NAT设备默认发出的SIP消息里携带的是内网IP地址和端口,从而导致外网服务器寻址失败,信令和媒体报文送不到NAT设备,造成信令、媒体丢失。针对这种组网应用,通常采用以下三种NAT穿透技术解决:
(1)动态NAT;(2)静态NAT;(3)STUN穿透
设备启用NAT穿透功能后,可以实现"网络打洞",并且探测到路由器外网的IP地址,从而发出的SIP消息头部以及SDP消息体携带的IP地址和端口都会替换为获取到的公网IP和端口。
NAT穿越原理
1. 动态NAT穿透原理
(1)以鼎信IAD语音网关为例,设备上开启动态NAT功能后,发出取得请求消息via头里会携带rport字段,如下
发送REGISTER消息,在请求信息的Via头域中包含了没有值的rport参数,如下所示:
REGISTER sip: 124.40 . 120.188 : 5060 SIP / 2.0
Via: SIP/ 2.0 / UDP 124.42 . 4.203 : 15500 ;branch = z9hG4bK - d8754z -1049ed261d2e643d - 1 --- d8754z -;rport
Max - Forwards: 70
Contact: < sip: 19988888888 @ 192.168 . 2.65 : 12344 ;rinstance =7cd1c532e92fdb0e > ;expires =
To: " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 >
From: " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 >;tag =203ba359
Call -ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 1 REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User - Agent: eyeBeam release 1105a stamp 56793
Content- Length:
(2)公网服务器收到请求消息后,将会分析检测来源SIP消息的NAT地址和端口,并且会在响应SIP报文里使用received和rport字段携带给客户端,如例子中的获取到的NAT的公网地址(124.42.4.203)和端口(15500):
SIP / 2.0 200 OK
Via: SIP / 2.0 / UDP 124.42 . 4.203 : 15500 ;branch = z9hG4bK - d8754z -1049ed261d2e643d - 1 --- d8754z - ;rport = 15500 ;received = 124.42. 4.203
From: " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 >;tag = 203ba359
To: " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 > ;tag= 0005 - 058 - 7d6dc90516ae2e21
Call - ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 4 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: < sip: 124.40 . 120.188 : 5060 >
Content - Length:
(3) 设备在收到响应200OK信息后,从rport 和received字段里获取NAT公网地址和端口,设备之后发SIP消息时会更改为路由器公网的IP和端口。如下列,Contact头部携带变换成124.42.4.203: 15500,例如新发的REGISTER信息变为:
REGISTER sip: 124.40 . 120.188 : 5060 SIP / 2.0
Via: SIP / 2.0 / UDP 124.42 . 4.203 : 15500 ;branch = z9hG4bK - d8754z -1049ed261d2e643d - 1 --- d8754z - ;rport
Max - Forwards: 70
Contact: < sip: 19988888888 @ 124.42 . 4.203 : 15500 ;rinstance =7cd1c532e92fdb0e > ;expires =
To: " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 >
From: " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 >;tag = 203ba359
Call - ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 2 REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User - Agent: eyeBeam release 1105a stamp 56793
Content - Length:
这样IPPBX(或SIP Proxy)就会把SIP报文发往NAT公网地址和端口,实现NAT穿透。
2. STUN穿透原理
Simple Traversal of UDP over NATs,即NAT的UDP的简单穿越,是客户机-服务器的一种网络协议,由RFC 3489 定义。该协议定义了一些消息格式,大体上分为Request/Response。这个协议主要作用是用以在两个处于NAT路由器之后的主机之间建立UDP通信。帮助位于NAT后的客户端获取自己的公网地址以及NAT为这个客户端的本地端口所绑定的对外端口。
利用STUN技术实现NAT穿透,首先需要搭建一个STUN server(也可以找免费的STUN server),然后在设备上配置STUNserver地址即可。
STUN实现穿透流程:
(1) 开启STUN后,设备作为客户端,会自动用SIP端口和不同的RTP端口往STUN服务器发STUN探测消息;
(2) 服务器收到后会在响应消息里携带设备所在网络的NAT地址和端口;
(3) 路由器会记录保持对应的NAT地址表
(4) 设备收到STUN服务器响应消息后自动记录NAT公网IP和端口;
(5) 设备发起的SIP报文里contact头字段和SDP字段会自动携带公网地址;
(6) 设备会定时刷新STUN报文,用于NAT洞保持打开状态。
开启STUN报文注册消息如下:
3. 静态NAT
静态NAT在实际应用中使用比较少,因为使用静态NAT实现穿透时,路由器的公网IP必须是一个固定不变的地址,如果是PPPOE拨号上网的网络,不适合启用这种方式。
启用静态NAT,必须手动配置好公网IP,并且需要在路由器里添加端口映射,将设备的SIP端口和RTP端口映射到公网。设备发出去的SIP消息contact头部和SDP信息里携带配置的静态公网IP地址,从而实现NAT穿透。