FS史上最完整的NAT穿越


*本文已做過更改,如需參考,請轉至《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-portrtp-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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM