freeswitch如何解决sip信令的NAT问题

发布时间 2023-12-08 17:48:54作者: 求真得真

 

概述

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网关。

 

空空如常

求真得真