FreeSWITCH跨NAT部署配置詳解
引言
本文僅討論FreeSWITCH部署在NAT之后(里面)這種場景,假設私網(wǎng)地址與公網(wǎng)地址有一個確定的映射關系。
這里只涉及mod_sofia(SIP信令及媒體)相關配置,其他模塊不在本文討論之列。
配置
mod_sofia默認提供兩個profile,可以理解成是兩套配置,最主要的區(qū)別是監(jiān)聽端口不一樣,其他的區(qū)別包括是否啟用TLS加密,使用哪個撥號計劃等等。這里以internal profile為例。
1、配置預處理變量
FreeSWITCH的慣例是把預處理變量定義在vars.xml文件中,然后再由其他配置文件去引用。這里我們主要關注公網(wǎng)地址以及SIP監(jiān)聽端口。
etc/freeswitch/vars.xml
<include> <!-- 注意,X-PRE-PROCESS開頭的配置都是預處理配置,有點像是定義全局變量,但是變量的值可以在程序啟動時動態(tài)獲取到 --> <!-- 這兩個變量必須要設置成公網(wǎng)IP,有3種方法配置公網(wǎng)IP: --> <!-- 1、配一個固定的公網(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、通過公網(wǎng)上的stun服務動態(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、通過域名解析動態(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"/> <!-- 配置兩個profile所監(jiān)聽的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真正會讀取的配置。這里以internal profile為例,external同理。
etc/freeswitch/sip_profiles/internal.xml
<profile name="internal"> <settings> <!-- 這里引用vars.xml里面配置的全局變量。注意,要以$${var}的形式引用! 注意,local_ip_v4這個全局變量是fs_core自動設置的,每分鐘更新一次。如果機器有多個IP,需要手動指定一個,詳見官方文檔: https://developer.signalwire.com/freeswitch/Channel-Variables-Catalog/local_ip_v4_16353556/ --> <!-- 當前這個profile所要監(jiān)聽的SIP端口。 --> <param name="sip-port" value="$${internal_sip_port}"/> <!-- 接收RTP流的端口要綁定在哪個地址上。只能是IP地址,不能是域名! --> <param name="rtp-ip" value="$${local_ip_v4}"/> <!-- 接收SIP請求的端口要綁定在哪個地址上。同上,只能是IP地址。 --> <param name="sip-ip" value="$${local_ip_v4}"/> <!-- 對外通告RTP消息時所用的地址。 --> <param name="ext-rtp-ip" value="$${external_rtp_ip}"/> <!-- SIP報文中Contact header的地址。 --> <param name="ext-sip-ip" value="$${external_sip_ip}"/> </settings> </profile>
3、配置媒體端口范圍
有些NAT或防火墻只能映射或允許一個范圍內(nèi)的端口,這就需要調(diào)整FreeSWITCH接收RTP媒體流所用的端口范圍。
注意:FreeSWITCH使用偶數(shù)端口接受RTP流,使用奇數(shù)端口收發(fā)RTCP消息。假如需要承載50路通話,則至少要映射100個端口!
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>
驗證
人為改一下ext-rtp-ip
和ext-sip-ip
,觀察它們的作用:
此時有一個到達internal profile的呼叫,從FreeSWITCH回復的200 OK中可以看到,Contact header中填的是ext-sip-ip
,而SDP部分填的是ext-rtp-ip
:
問題
- 私網(wǎng)端口號與公網(wǎng)端口號不一樣怎么辦?比如:私網(wǎng):5060 <==> 公網(wǎng):8060
- 恐怕只能修改代碼了。mod_sofia可以支持監(jiān)聽IP與通告IP不一致,但端口不能不一致。即它就只能在SIP報文中通告它自己本地監(jiān)聽的端口。
以上就是FreeSWITCH跨NAT部署配置詳解的詳細內(nèi)容,更多關于FreeSWITCH跨NAT部署的資料請關注腳本之家其它相關文章!
相關文章
Java實現(xiàn)SMS短信通發(fā)送手機驗證碼案例講解
這篇文章主要介紹了Java實現(xiàn)SMS短信通發(fā)送手機驗證碼案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08詳解Spring cloud使用Ribbon進行Restful請求
這篇文章主要介紹了詳解Spring cloud使用Ribbon進行Restful請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04BeanUtils.copyProperties使用總結以及注意事項說明
這篇文章主要介紹了BeanUtils.copyProperties使用總結以及注意事項說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(獨占模式)
這篇文章主要為大家詳細介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02