網絡拓撲
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
大佬的頂力相助!本人特地記錄此文,方便后來人進行參考!謝謝!!