记录一例 FreeSWITCH 语音单向的案子:
网络拓扑为:
语音网关 10.x.x.x --------- FS 出口地址 192.168.1.100 ------- FS 本地地址 192.168.1.200
FS 一侧等于是把 SIP 5060 端口和 RTP 端口做了端口映射,但没配置好。
语音网关看到 192.168.1.100,但看不到 192.168.1.200。
FS 能看到语音网关的 10.x.x.x。
现象是从语音网关呼叫 FS,dialplan 如果配置为:
<action application="answer"/> <!-- FS 回的是正确的 C 地址-->
<action application="sleep" data="200"/> <!--延时真好用-->
<action application="bridge" data="***"/>
这样是正常的,FS 能收到语音网关的 RTP 流。
但换成下面这样就不行,收不到:
<action application="answer"/> <!-- 缺延时而已, 其他的没变 -->
<action application="bridge" data="***"/>
在语音网关一侧抓包进行研究,如果执行 dialplan1,那么网关先发 RTP 包,按 SIP 协商的发到 FS 的出口地址。
如果执行 dialplan2, 那么语音网关先收到 FS 发过来的 RTP 包,重点是收到的 RTP 包其源地址是 FS 的本机地址 192.168.1.200, 而不是 FS 出口地址 192.168.1.100,于是语音网关自动发到 了192.168.1.200,但这个地址是不能达的,结果导致了语音单向。
抓包分析清楚之后解决办法有很多,比如把语音网关的 RTP 自动调整关闭掉就行, 把 FS 一侧的的端口映射做好也足以解决问题。