首頁 > 軟體

FreeSWITCH跨NAT部署設定詳解

2023-02-16 06:02:16

引言

本文僅討論FreeSWITCH部署在NAT之後(裡面)這種場景,假設私網地址與公網地址有一個確定的對映關係。

這裡只涉及mod_sofia(SIP信令及媒體)相關設定,其他模組不在本文討論之列。

設定

mod_sofia預設提供兩個profile,可以理解成是兩套設定,最主要的區別是監聽埠不一樣,其他的區別包括是否啟用TLS加密,使用哪個撥號計劃等等。這裡以internal profile為例。

1、設定預處理變數

FreeSWITCH的慣例是把預處理變數定義在vars.xml檔案中,然後再由其他組態檔去參照。這裡我們主要關注公網地址以及SIP監聽埠。

etc/freeswitch/vars.xml

<include>
  <!-- 注意,X-PRE-PROCESS開頭的設定都是預處理設定,有點像是定義全域性變數,但是變數的值可以在程式啟動時動態獲取到 -->
  <!-- 這兩個變數必須要設定成公網IP,有3種方法設定公網IP: -->
  <!-- 1、配一個固定的公網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、通過公網上的stun服務動態獲取 -->
  <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、通過域名解析動態獲取 -->
  <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所監聽的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所要監聽的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或防火牆只能對映或允許一個範圍內的埠,這就需要調整FreeSWITCH接收RTP媒體流所用的埠範圍。

注意:FreeSWITCH使用偶數埠接受RTP流,使用奇數埠收發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-ipext-sip-ip,觀察它們的作用:

此時有一個到達internal profile的呼叫,從FreeSWITCH回覆的200 OK中可以看到,Contact header中填的是ext-sip-ip,而SDP部分填的是ext-rtp-ip

問題

  • 私網埠號與公網埠號不一樣怎麼辦?比如:私網:5060 <==> 公網:8060
  • 恐怕只能修改程式碼了。mod_sofia可以支援監聽IP與通告IP不一致,但埠不能不一致。即它就只能在SIP報文中通告它自己本地監聽的埠。

以上就是FreeSWITCH跨NAT部署設定詳解的詳細內容,更多關於FreeSWITCH跨NAT部署的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com