*本文已做過更改,如需參考,請轉至《FS NAT穿越、單通及呼入30秒自動掛斷解決》 *
*本文已做過更改,如需參考,請轉至《FS NAT穿越、單通及呼入30秒自動掛斷解決》 *
*本文已做過更改,如需參考,請轉至《FS NAT穿越、單通及呼入30秒自動掛斷解決》 *
重要的事情說三遍!!!
史上最完整的NAT穿越
開個玩笑了,可能是因為網上一大堆繁雜而又不太全面的文章太多了,也可能是自己的網絡拓撲不太一樣(最簡單的一種),按網上的大堆文章來弄,期間各種調試FS各種internal,external參數,然而弄了兩天並沒有什么luan用!
網絡拓撲
SIP客戶端->外網->防火牆->FS
可以明顯的看出,sip客戶端是在一個網絡環境,FS在另外一個網絡環境,主要靠“外網”聯系起來!
配置之路
var.xml
填上你的stun服務器,如:stun.ideasip.com、stun:stun.freeswitch.org,也可以設置成你的外網IP,具體操作你可以試試
<X-PRE-PROCESS cmd="set" data="external_rtp_ip=stun:stun.ideasip.com"/>
<X-PRE-PROCESS cmd="set" data="external_sip_ip=stun:stun.ideasip.com""/>
具體可用的服務器可以參見(自己選):
stun:stun1.l.google.com:19302
stun:stun2.l.google.com:19302
stun:stun3.l.google.com:19302
stun:stun4.l.google.com:19302
stun:23.21.150.121
stun:stun01.sipphone.com
stun:stun.ekiga.net
stun:stun.fwdnet.net
stun:stun.ideasip.com
stun:stun.iptel.org
stun:stun.rixtelecom.se
stun:stun.schlund.de
stun:stunserver.org
stun:stun.softjoys.com
stun:stun.voiparound.com
stun:stun.voipbuster.com
stun:stun.voipstunt.com
stun:stun.voxgratia.org
stun:stun.xten.com
測試stun服務器是否可用(如測試 stun1.l.google.com:19302):
stun stun1.l.google.com:19302
如果返回你所在的服務網絡外網IP地址加端口,證明stun服務器是可用的,類似如下:
222.85.X.X:53251
internal.xml
- 開啟rport功能
<param name="NDLB-force-rport" value="true"/>
- 設置rtp自動調整功能,注意是false
<param name="disable-rtp-auto-adjust" value="false"/>
- 設置sip和rtp的外網地址(調用var.xml里面設置的stun或者你的外網IP參數)
<param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
<param name="ext-sip-ip" value="$${external_sip_ip}"/>
- 設置acl參數,以此來判斷內外網呼叫
<paramname="local-network-acl" value="lan"/>
external.xml
- 設置sip和rtp的外網地址(調用var.xml里面設置的stun或者你的外網IP參數)
<param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
<param name="ext-sip-ip" value="$${external_sip_ip}"/>
acl.conf.xml
這里對應internal.xml里面的<paramname="local-network-acl" value="lan"/> ,設置ACL為(比如你的SIP所在的網絡內網IP為192.168.10.5,則可以設置為192.168.10.0/24或者直接指定只允許192.168.10.5/32這個IP):
<list name="lan" default="deny">
<node type="allow" cidr="192.168.10.0/24"/>
</list>
這個ACL表示只允許內網網段為192.168.10.0/24的電腦連接,其它均拒絕
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"/>
brian.xml
為了兼容沒有rport功能的終端,在brian.xml中加入
<variable name="sip-force-contact" value="NDLB-connectile-dysfunction"/>
在路由器(防火牆)上映射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 |
用以上方法,在雲服務器上部署是可以聽到聲音,能正常運行,雲服務器沒有內網IP,查看網絡連接直接顯示的是外網IP
下面的填坑之路是在具有內網IP的服務器上做的NAT穿越解決方法:在SIP客戶端添加stun就可以解決
填坑之路
聽不到聲音
這個時候撥打9664測試一下聽不聽得見音樂,或者直接撥打其它已經注冊上去的一個分機,如果聽不到聲音,通過抓包分析,我這里的RTP走內網地址了,本來應該要走外網地址的才對。如下圖(通過抓包解決問題):
客戶端抓包呼叫流:
服務端抓包呼叫流:
從上兩圖可以清楚地看到服務端RTP流送到了SIP客戶端的內網IP上,這顯然是不行的,這也是聽不到聲音的最主要原因。
期間花了兩天時間來測試調各種參數,包括換acl、把internal.xml中的local-network-acl填為domains、把internal.xml和external.xml中的ext-rtp-ip,ext-sip-ip都填為服務所在的外網IP,在IP前面加"auto-nat:"、直接更改為可用的stun服務器地址等都不行,要么是客戶端送到服務器RTP的流是內網,要么服務器送到客戶端的RTP是SIP的內網,要么兩個都是內網IP,還是聽不到聲音。
更改客戶端配置
由於本人使用的接入客戶端是eyebeam,修改eyebeam的"SIP賬號"->屬性->網絡拓撲->防火牆穿越->STUN服務器->使用指定服務器,填入你的STUN服務器,如我這里填的是“ stun.ideasip.com ”,其它客戶端相信也有類似的配置。
測試撥打9664
撥打9664或者已經注冊到服務上的另一客戶端,聽到了期盼已久的聲音!至此,NAT穿越完美結束!
如果還是聽不到聲音,試着把5060、5080默認端口改一下,比如改成7890,7898這種沒有占用的端口試試,有的運營商會和諧掉這兩個端口,這樣肯定就聽不到聲音了
后續
- 查看NATMAP 我機器上啥都沒有……
命令 nat_map status
Nat Type: UNKNOWN, ExtIP:
NAT port mapping enabled.
0 total.
- 列出internal SIP Profile的狀態
命令 sofia status profile internal
=================================================================================================
Name internal
Domain Name N/A
Auto-NAT false
DBName sofia_reg_internal
Pres Hosts 10.20.13.97,10.20.13.97
Dialplan XML
Context public
Challenge Realm auto_from
RTP-IP 10.20.13.97
Ext-RTP-IP stun:stun.ideasip.com
SIP-IP 10.20.13.97
Ext-SIP-IP 222.X.X.165
URL sip:mod_sofia@222.x.x.x:6729
BIND-URL sip:mod_sofia@222.x.x.x:6729;
maddr=10.20.13.97;transport=udp,tcp
HOLD-MUSIC local_stream://moh
OUTBOUND-PROXY N/A
CODECS IN OPUS,G722,PCMU,PCMA,GSM
CODECS OUT OPUS,G722,PCMU,PCMA,GSM
TEL-EVENT 101
DTMF-MODE rfc2833
CNG 13
SESSION-TO 0
MAX-DIALOG 0
NOMEDIA false
LATE-NEG true
PROXY-MEDIA false
ZRTP-PASSTHRU true
AGGRESSIVENAT true
CALLS-IN 2
FAILED-CALLS-IN 0
CALLS-OUT 0
FAILED-CALLS-OUT 0
REGISTRATIONS 2
嗯,正常情況下Ext-RTP-IP要么是STUN,要么是服務所在的外網IP, Ext-SIP-IP是你的服務所在的外網地址,如果不存在這兩個參數,證明NAT沒有成功。
如果還是不行,你需要一個SBC!