深圳市宝安区华美居

0086-18665301040

NAT理论讨论和网关配置实战技巧分享

NAT理论讨论和网关配置实战技巧分享

随着网络配置的发展和变化,SIP环境中用户需要支持不同的网络环境,不同的终端和不同的服务器端。各种环境因素纠缠在一起就会产生各种各样的问题,这些问题导致用户的IPPBX和呼叫中心等通信功能不能正常工作。在这些莫名其妙的问题中,运维人员经常碰到的一个最重要的问题就是NAT问题。
NAT理论讨论和网关配置实战技巧分享
其实,笔者以前就NAT问题已经进行过很多讨论,集中讨论了解决NAT问题的各种设置方式。但是在实际使用过程中,一些企业使用SBC来解决问题,一些中小型企业用户因为公司资源问题,其实还是使用最简单实用低成本的方式来解决NAT问题。为了帮助用户能够这些问题。今天,我们首先和读者分享一个企业用户场景中如何配置网关来解决NAT问题,然后再回顾笔者以前的一些其他场景的理论讨论。

1

SIP语音环境下的常见问题

在VOIP的环境中,特别是基于SIP通信的环境中,我们经常会遇到一些非常常见的问题,例如,单通,30秒就断线,注册问题,回声等。这些问题事实上都有非常直接的排查方式和解决办法,用户可以按照一定的排查方式,工具非常高效地解决这些问题。但是,因为读者技术水平参差不齐,网络上的很多技术也不完整。笔者今天系统归纳了这些问题。根据一些用户的使用环境和用户经常遇到一些问题,我们列举了以下十个在SIP呼叫中经常遇到的问题,并且给出了相应的排查方式,用户可以按照这些方法来解决SIP通话中的这些问题。这几个问题包括:
  1. 不能注册或呼叫到SIP服务器端

  2. 30秒挂断呼叫的黄金法则

  3. 咬线或摘机状态

  4. 单通或无语音

  5. 收到400 bad request

  6. 收到413,513 Request Entity Too Large或Message Too Large消息

  7. 收到408, 480或者487 消息

  8. 483 – Too Many Hops

  9. 488 – Not Acceptable Here

具体关于经典问题的讨论,读者可以阅读笔者文章:

SIP语音环境中十大经典问题及解决办法

其中在涉及到NAT问题中,比较常见的问题包括:

  • SIP账户注册不上,Register报文收不到响应消息

  • 呼叫通话中出现语音单通,内网设备收不到公网媒体流

  • 收不到ACK信令,呼叫接通持续30秒自动挂断

  • 收不到BYE消息,通话挂不断

2

NAT产生的三个原因

SIP信令呼叫建立和媒体通信的建立是根据SIP消息头部和SDP消息体里携带的IP地址和端口来协商的,如果SIP服务器在公网,设备部署在NAT网络下,NAT设备默认发出的SIP消息里携带的是内网IP地址和端口,从而导致外网服务器寻址失败,信令和媒体报文送不到NAT设备,造成信令、媒体丢失。针对这种组网应用,通常采用以下三种NAT穿透技术解决:
  1. 动态NAT

  2. 静态NAT

  3. STUN穿透

设备启用NAT穿透功能后,可以实现“网络打洞”,并且探测到路由器外网的IP地址,从而发出的SIP消息头部以及SDP消息体携带的IP地址和端口都会替换为获取到的公网IP和端口。

3

NAT穿越原理示例

以鼎信IAD语音网关为例,设备上开启动态NAT功能后,发出取得请求消息via头里会携带rport字段,如下:

NAT理论讨论和网关配置实战技巧分享

1)发送REGISTER消息,在请求信息的Via头域中包含了无具体rport端口参数,如下所示:

REGISTER sip: 124.40 . 120.188 : 5060  SIP / 2.0// Via的rport 空白Via: SIP/ 2.0 / UDP  124.42 . 4.203 : 15500 ;branch = z9hG4bK - d8754z -1049ed261d2e643d - 1 --- d8754z -;rportMax - Forwards:  70Contact: < 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 =203ba359Call -ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.CSeq:  1 REGISTERAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFOUser - Agent: eyeBeam release 1105a stamp  56793Content- Length:
2)公网服务器收到请求消息后,将会分析检测来源SIP消息的NAT地址和端口,并且会在响应SIP报文里使用received和rport字段携带给客户端,如例子中的获取到的NAT的公网地址(124.42.4.203)和端口(15500):
SIP / 2.0   200  OKVia: SIP / 2.0 / UDP  124.42 . 4.203 : 15500 ;branch = z9hG4bK - d8754z -1049ed261d2e643d - 1 --- d8754z - ;rport = 15500 ;received = 124.42. 4.203From:  " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 >;tag = 203ba359To:  " 19988888888 " < sip: 19988888888 @ 124.40 . 120.188 : 5060 > ;tag= 0005 - 058 - 7d6dc90516ae2e21Call - ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.CSeq:  4  REGISTERAllow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGEContact:  < 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.0Via: SIP / 2.0 / UDP  124.42 . 4.203 : 15500 ;branch = z9hG4bK - d8754z -1049ed261d2e643d - 1 --- d8754z - ;rportMax - Forwards:  70Contact:  < 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 = 203ba359Call - ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.CSeq:  2  REGISTERAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFOUser - Agent: eyeBeam release 1105a stamp  56793Content - Length:
这样IPPBX(或SIP Proxy)就会把SIP报文发往NAT公网地址和端口,实现NAT穿透。
具体关于NAT打洞的原理和概念介绍,读者可以查阅历史文章:

SIP系列讲座-SIP-防火墙-NAT-Hole Punching探讨

SIP系列讲座-NAT解决方法探讨Symmetric RTP-UPnP-ALG

4

STUN穿透原理示例

Simple Traversal of UDP over NATs,即NAT的UDP的简单穿越,是客户机-服务器的一种网络协议,由RFC 3489定义。该协议定义了一些消息格式,大体上分为Request/Response。这个协议主要作用是用以在两个处于NAT路由器之后的主机之间建立UDP通信。帮助位于NAT后的客户端获取自己的公网地址以及NAT为这个客户端的本地端口所绑定的对外端口。
利用STUN技术实现NAT穿透,首先需要搭建一个STUN server(也可以找免费的STUN server),然后在设备上配置STUNserver地址即可。

NAT理论讨论和网关配置实战技巧分享

NAT理论讨论和网关配置实战技巧分享

STUN实现穿透流程处理:
  1. 开启STUN后,设备作为客户端,会自动用SIP端口和不同的RTP端口往STUN服务器发STUN探测消息;
  2. 服务器收到后会在响应消息里携带设备所在网络的NAT地址和端口;
  3. 路由器会记录保持对应的NAT地址表
  4. 设备收到STUN服务器响应消息后自动记录NAT公网IP和端口
  5. 设备发起的SIP报文里contact头字段和SDP字段会自动携带公网地址
  6. 设备会定时刷新STUN报文,用于NAT洞保持打开状态
  7. 开启STUN报文注册消息如下:

NAT理论讨论和网关配置实战技巧分享

更多关于的具体概念和解释,读者可以查阅笔者历史文章:

SIP系列讲座-NAT解决方法探讨-STUN-TURN-ICE

5

静态NAT示例

静态NAT在实际应用中使用比较少,因为使用静态NAT实现穿透时,路由器的公网IP必须是一个固定不变的地址,如果是PPPOE拨号上网的网络,不适合启用这种方式。
启用静态NAT,必须手动配置好公网IP,并且需要在路由器里添加端口映射,将设备的SIP端口和RTP端口映射到公网。设备发出去的SIP消息contact头部和SDP信息里携带配置的静态公网IP地址,从而实现NAT穿透。

NAT理论讨论和网关配置实战技巧分享

6

其他相关NAT解决方案讨论

通过设置网关的NAT配置,用户可以解决一般比较常见的NAT问题,对中小型企业的用户也是非常实用的功能。除了以上讨论以外,笔者也发布过关于NAT问题的其他文章,希望对读者有大的帮助:

图解边界会话控制器(SBC)的20个最常用功能

SIP系列讲座-NAT解决方法探讨Symmetric RTP-UPnP-ALG

Asterisk课堂-SIP和NAT

SIP呼叫和路由器ALG相关配置详解

6

总结

笔者分享了一个关于结合网关来配置NAT的示例说明,笔者就会更加了解具体的配置环境,可以通过相对比较经济的办法来处理NAT问题。为了为读者提供了更多关于NAT的完整的介绍和解决方案,例如使用SBC来处理NAT问题。
再次说明,笔者通过示例来说明如何解决NAT问题,但是在实际环境中,每个用户使用的终端和网关可能有所不同,需要用户自己调整相应参数。

NAT理论讨论和网关配置实战技巧分享
NAT理论讨论和网关配置实战技巧分享
关注微信公众号:asterisk-cn,获得有价值的Asterisk行业分享
Asterisk freepbx FreeSBC技术文档: www.freepbx.org.cn
融合通信/IPPBX商业解决方案:www.hiastar.com
如何使用FreeSBC+FreeSWITCH/Asterisk,qq技术分享群:334023047

联系电话-18665301040
客服-3
客服-2
客服-1