概述
freeswitch是一款简单好用的VOIP开源软交换平台。
公网环境复杂多变,客户环境更是各种稀奇古怪的问题。
fs在针对sip信令的NAT问题有针对性的参数设置。
本文讨论的范围限于fs的公网地址正常没有在NAT后面的两种常见场景。其他更多更复杂的NAT场景暂不讨论。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.10.7
GCC:4.8.5
客户端NAT
客户端NAT场景,客户端部署在NAT后面,这种场景在普通办公网最常见。
eyebean(私网) -> NAT(公网) -> fs(公网)
该场景最常见的问题,200OK消息无法正常返回A路,导致32秒后自动挂断。
解决办法,修改conf/sip_profile/external.xml。
<param name="aggressive-nat-detection" value="true"/>
aggressive-nat-detection参数的作用,如果接收到请求的网络IP/端口与Via头中的IP/端口组合不同,启用NAT模式。
后续的消息将使用实际请求的网络IP/端口来响应。
呼出中继NAT
呼出中继NAT场景,呼出的对端中继设备在NAT后面,该场景多见于客户自建中继设备。
fs(公网) -> NAT(公网) -> siptrunk(私网)
该场景最常见的问题,ACK消息无法正常发到siptrunk,导致32秒后自动挂断。
解决办法,修改conf/dialplan/public.xml,在呼出流程中增加配置。
<extension name="test-sticky">
<condition field="destination_number" expression="^(\d+)$">
<action application="set" data="sip_sticky_contact=true"/>
<action application="bridge" data="${as_bridge_str}"/>
</condition>
</extension>
sip_sticky_contact参数的作用,针对响应的200OK消息中的实际地址与contact地址做比较,ACK消息使用真实地址响应。
总结
本文仅仅讨论了两种比较简单常见的NAT问题,公网环境中的NAT问题更加的复杂多变。
对于NAT问题的通用思路是想办法找到对方或自己的公网地址,在消息传递过程中使用各种手段透传过NAT网关。
空空如常
求真得真