FreeSWITCH跨NAT部署配置詳解
引言
本文僅討論FreeSWITCH部署在NAT之后(里面)這種場(chǎng)景,假設(shè)私網(wǎng)地址與公網(wǎng)地址有一個(gè)確定的映射關(guān)系。
這里只涉及mod_sofia(SIP信令及媒體)相關(guān)配置,其他模塊不在本文討論之列。
配置
mod_sofia默認(rèn)提供兩個(gè)profile,可以理解成是兩套配置,最主要的區(qū)別是監(jiān)聽(tīng)端口不一樣,其他的區(qū)別包括是否啟用TLS加密,使用哪個(gè)撥號(hào)計(jì)劃等等。這里以internal profile為例。
1、配置預(yù)處理變量
FreeSWITCH的慣例是把預(yù)處理變量定義在vars.xml文件中,然后再由其他配置文件去引用。這里我們主要關(guān)注公網(wǎng)地址以及SIP監(jiān)聽(tīng)端口。
etc/freeswitch/vars.xml
<include> <!-- 注意,X-PRE-PROCESS開(kāi)頭的配置都是預(yù)處理配置,有點(diǎn)像是定義全局變量,但是變量的值可以在程序啟動(dòng)時(shí)動(dòng)態(tài)獲取到 --> <!-- 這兩個(gè)變量必須要設(shè)置成公網(wǎng)IP,有3種方法配置公網(wǎng)IP: --> <!-- 1、配一個(gè)固定的公網(wǎng)IP --> <X-PRE-PROCESS cmd="set" data="external_rtp_ip=172.21.221.137"/> <X-PRE-PROCESS cmd="set" data="external_sip_ip=172.21.221.137"/> <!-- 2、通過(guò)公網(wǎng)上的stun服務(wù)動(dòng)態(tài)獲取 --> <X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=stun:stun.freeswitch.org"/> <X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=stun:stun.freeswitch.org"/> <!-- 3、通過(guò)域名解析動(dòng)態(tài)獲取 --> <X-PRE-PROCESS cmd="set" data="external_rtp_ip=host:host.server.com"/> <X-PRE-PROCESS cmd="set" data="external_sip_ip=host:host.server.com"/> <!-- 配置兩個(gè)profile所監(jiān)聽(tīng)的SIP端口: --> <!-- Internal SIP Profile --> <X-PRE-PROCESS cmd="set" data="internal_auth_calls=true"/> <X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/> <X-PRE-PROCESS cmd="set" data="internal_tls_port=5061"/> <X-PRE-PROCESS cmd="set" data="internal_ssl_enable=false"/> <!-- External SIP Profile --> <X-PRE-PROCESS cmd="set" data="external_auth_calls=false"/> <X-PRE-PROCESS cmd="set" data="external_sip_port=5080"/> <X-PRE-PROCESS cmd="set" data="external_tls_port=5081"/> <X-PRE-PROCESS cmd="set" data="external_ssl_enable=false"/> </include>
2、配置sip profiles
這里才是mod_sofia真正會(huì)讀取的配置。這里以internal profile為例,external同理。
etc/freeswitch/sip_profiles/internal.xml
<profile name="internal">
<settings>
<!--
這里引用vars.xml里面配置的全局變量。注意,要以$${var}的形式引用!
注意,local_ip_v4這個(gè)全局變量是fs_core自動(dòng)設(shè)置的,每分鐘更新一次。如果機(jī)器有多個(gè)IP,需要手動(dòng)指定一個(gè),詳見(jiàn)官方文檔:
https://developer.signalwire.com/freeswitch/Channel-Variables-Catalog/local_ip_v4_16353556/
-->
<!-- 當(dāng)前這個(gè)profile所要監(jiān)聽(tīng)的SIP端口。 -->
<param name="sip-port" value="$${internal_sip_port}"/>
<!-- 接收RTP流的端口要綁定在哪個(gè)地址上。只能是IP地址,不能是域名! -->
<param name="rtp-ip" value="$${local_ip_v4}"/>
<!-- 接收SIP請(qǐng)求的端口要綁定在哪個(gè)地址上。同上,只能是IP地址。 -->
<param name="sip-ip" value="$${local_ip_v4}"/>
<!-- 對(duì)外通告RTP消息時(shí)所用的地址。 -->
<param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
<!-- SIP報(bào)文中Contact header的地址。 -->
<param name="ext-sip-ip" value="$${external_sip_ip}"/>
</settings>
</profile>3、配置媒體端口范圍
有些NAT或防火墻只能映射或允許一個(gè)范圍內(nèi)的端口,這就需要調(diào)整FreeSWITCH接收RTP媒體流所用的端口范圍。
注意:FreeSWITCH使用偶數(shù)端口接受RTP流,使用奇數(shù)端口收發(fā)RTCP消息。假如需要承載50路通話(huà),則至少要映射100個(gè)端口!
etc/freeswitch/autoload_configs/switch.conf.xml
<configuration name="switch.conf" description="Core Configuration">
<settings>
<!-- RTP port range -->
<param name="rtp-start-port" value="40000"/>
<param name="rtp-end-port" value="40009"/>
</settings>
</configuration>驗(yàn)證
人為改一下ext-rtp-ip和ext-sip-ip,觀察它們的作用:

此時(shí)有一個(gè)到達(dá)internal profile的呼叫,從FreeSWITCH回復(fù)的200 OK中可以看到,Contact header中填的是ext-sip-ip,而SDP部分填的是ext-rtp-ip:

問(wèn)題
- 私網(wǎng)端口號(hào)與公網(wǎng)端口號(hào)不一樣怎么辦?比如:私網(wǎng):5060 <==> 公網(wǎng):8060
- 恐怕只能修改代碼了。mod_sofia可以支持監(jiān)聽(tīng)I(yíng)P與通告IP不一致,但端口不能不一致。即它就只能在SIP報(bào)文中通告它自己本地監(jiān)聽(tīng)的端口。
以上就是FreeSWITCH跨NAT部署配置詳解的詳細(xì)內(nèi)容,更多關(guān)于FreeSWITCH跨NAT部署的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java注解處理器學(xué)習(xí)之編譯時(shí)處理的注解詳析
編譯時(shí)注解相信對(duì)每一個(gè)java開(kāi)發(fā)者來(lái)說(shuō)都不陌生,下面這篇文章主要給大家介紹了關(guān)于Java注解處理器學(xué)習(xí)之編譯時(shí)處理的注解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧2018-05-05
SpringBoot如何優(yōu)雅的處理校驗(yàn)參數(shù)的方法
這篇文章主要介紹了SpringBoot如何優(yōu)雅的處理校驗(yàn)參數(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問(wèn)題
這篇文章主要介紹了解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Maven構(gòu)建Hadoop項(xiàng)目的實(shí)踐步驟
本文主要介紹了Maven構(gòu)建Hadoop項(xiàng)目的實(shí)踐步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
平衡二叉樹(shù)的左右旋以及雙旋轉(zhuǎn)的圖文詳解
今天小編就為大家分享一篇關(guān)于平衡二叉樹(shù)的左右旋以及雙旋轉(zhuǎn)的圖文詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
MyBatis?Generator快速生成實(shí)體類(lèi)和映射文件的方法
這篇文章主要介紹了MyBatis?Generator快速生成實(shí)體類(lèi)和映射文件的方法,通過(guò)示例代碼介紹了MyBatis?Generator?的使用,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Java中如何將?int[]?數(shù)組轉(zhuǎn)換為?ArrayList(list)
這篇文章主要介紹了Java中將?int[]?數(shù)組?轉(zhuǎn)換為?List(ArrayList),本文通過(guò)示例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Spring Boot中整合Spring Security并自定義驗(yàn)證代碼實(shí)例
本篇文章主要介紹了Spring Boot中整合Spring Security并自定義驗(yàn)證代碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

