网络拓扑
SIP客户端->外网->防火墙->FS
可以明显的看出,sip客户端是在一个网络环境,FS在另外一个网络环境,主要靠“外网”联系起来(FS所在网络有固定IP)!
配置之路
internal.xml
- 设置sip和rtp的外网地址
填上你的stun服务器,如:stun.ideasip.com、stun:stun.freeswitch.org,也可以设置成你的外网IP,具体操作你可以试试,我这里填的是FS所在的外网固定IP。
<param name="ext-rtp-ip" value="你FS外网固定IP"/>
<param name="ext-sip-ip" value="你FS外网固定IP"/>
external.xml
<param name="ext-rtp-ip" value="你FS外网固定IP"/>
<param name="ext-sip-ip" value="你FS外网固定IP"/>
switch.conf.xml
设置RTP端口开放从10000到20000,你也可以使用默认(从16384到32768)的,但是有的防火墙最多只支持一次设置间隔200,多了要设置到你哭,比如华为的usg6550防火墙……这里我们设置10000个够了,如下:
<param name="rtp-start-port" value="10000"/>
<param name="rtp-end-port" value="20000"/>
在防火墙上映射fs的sip端口和rtp端口
注意 * 端口号10000-20000对应的是switch.conf.xml预先修改的 rtp-start-port 和 rtp-end-port
端口号 | 协议 |
---|---|
1719 | UDP |
1720 | TCP |
3478 | UDP |
3479 | UDP |
5002 | TCP |
5003 | UDP |
5060 | UDP&TCP |
5070 | UDP&TCP |
5080 | UDP&TCP |
8021 | TCP |
10000-20000 | UDP |
5066 | TCP |
7443 | TCP |
--
如果你没有改动switch.conf.xml文件的默认端口,那么上面的10000-20000 UDP应该是16384-32768
映射好后在外网使用一个软电话注册登陆FS并拨9664,正常情况下可以听到一段回铃音乐,如果你没有听到,请参考下面我碰到的问题及解决思路。
碰到的问题
这里记录的是本人实际碰到的问题和解决方法,对你不一定有用,请只做参考!
拨9664或者软电话之间对打单通
按上面的配置拨9664,听不到声音;使用两个软电话互打只听到一边有声音。抓包分析没发现什么异常。
修改映射的外网5060,改成其它没有被占用的端口,比如7898。也可以一同把var.xml文件里面的5060一同改掉。把默认的5060改掉后拨打9664和使用两个软电话互打神奇的解决了单通问题(可能是5060被运营商和谐掉了,这里本人并不清楚具体原因)。
使用外网的软电话通过FS拨打手机号,单通
使用外网的软电话通过FS拨打手机号,单通,经检查发现使用的网关有NAT功能。
本人使用的网关在SIP设置菜单中有“自动Nat”、“开启STUN”“开启Rport 自动探测NAT IP”“开启RTP自适应”经过多次测试,发现“开启RTP自适应”选项钩选后可解决“使用外网的软电话通过FS拨打手机号,单通”的问题。
呼入30秒后自动挂断
通过以止配置步骤,使用外网注册上来的的软电话之间互打、使用外网注册上来的软电话直接通过网关拨打电话号码,均正常。但是,如果使用手机通过“网关”->“FS”进行呼入声音一切正常,发现每次都准确的在30秒自动挂断!
本人尝试添加:
<variable name='sip-force-contact' value='NDLB-connectile-dysfunction-2.0'/>
<action application="set" data="sip_sticky_contact=true" />
然后并不起效!
抓包分析
- 先看INVITE SDP包
主要看Message Header消息的Contact
发现INVITE SDP包的Contact使用的正是网关所在内网IP及端口,这里并没有问题!
- 再看fs回的200 OK消息
发现200 OK包的Contact使用的是FS所在外网IP及端口
这样就导致了FS收不到发回来的ACK消息,超时30S后就自动挂断了,这里应该是FS所在的内网地址(不改成内网也可以,要保证外网的映射端口是通的就不存在这个问题)!
修改配置文件
打开internal.xml,external.xml分别找到
<param name="ext-sip-ip" value="你FS外网固定IP"/>
把它注释掉或者改成:
<param name="ext-sip-ip" value="$${local_ip_v4}"/>
本人是直接改成<param name="ext-sip-ip" value="$${local_ip_v4}"/>
没有注释。
呼入、呼出测试,一切正常!至此,呼入30秒后自动挂断的问题顺利解决,非常感谢@noname
大佬的顶力相助!本人特地记录此文,方便后来人进行参考!谢谢!!