一、FreeSWITCH幫助終端穿越NAT
1、SIP穿越
FreeSWITCH默認使用acl來判斷對方是否處於NAT環境中,配置如下:
// internal.xml <param name="apply-nat-acl" value="nat.auto"/>
nat.auto是ACL,包含了RFC1918規定的私網地址,並去掉了本地網絡地址。當SIP終端注冊時,通過比較contact地址是否包含在此ACL中來判斷該終端是否處於NAT背后,如果是那么它就把contact地址自動替換為SIP包的來源地址,后邊的呼叫就可以正常抵達。
在實際工作當中,當局域網內架設另一個無法直接互通的子網時,信令無法正常抵達子網終端,那么就需要改為無論何種情況下都要使用的SIP包的來源地址作為用戶的contact地址。
2、RTP穿越
NAT環境下SIP終端SDP信息中的IP地址是私網地址,因此freeSWITCH無法直接發送RTP包,而NAT設備基本只允許內網主機曾經接觸過的外網主機發送的UDP數據包進入。FreeSWITCH使用了一個名為RTP自動調整的特性,SIP協商時給對方一個可用的公網RTP地址,然后等待客戶端發送RTP包,一旦FreeSWITCH收到RTP包后,就可以根據對方發包的地址給它發RTP包了。此類情況發生時,log中可以看到類似的信息:
[INFO] switch_rtp.c:7268 Auto Changing audio port from 192.168.1.198:44978 to 61.51.110.204:44978
[DEBUG] switch_rtp.c:4137 Starting timer [soft] 160 bytes per 20ms
[INFO] switch_rtp.c:7268 Auto Changing audio port from 192.168.1.101:8074 to 61.51.110.204:8074
注意:
此辦法存在安全性能問題,如某黑客向隨機的RTP端口發送數據包,FreeSWITCH收到后將遠端地址調整到黑客的IP和端口,進而RTP數據包全部發往新的IP地址。所以為了防止這個問題,FreeSWITCH規定這種端口調整只能在電話開始的時候進行,且僅支持一次調整。自動調整的功能默認時開啟的。配置如下:
<param name="disable-rtp-auto-adjust" value="false"/>
或者針對個別的呼叫來禁用自動調整,在呼叫時設置通道變量rtp_auto_adjust=false來禁止。
二、FreeSWITCH處於NAT后面的解決方案
1、如果路由支持uPnP或者NAT-PMP協議
FreeSWITCH支持通過uPnP或NAT-PMP協議在路由器上“打洞”,打洞完成后就知道自己將要映射的外網地址了。前提是路由器支持uPnP功能並開通。FreeSWITCH配置如下:
//internal.xml external.xml <param name="ext-rtp-ip" value="auto-nat"/> <param name="ext-sip-ip" value="auto-nat"/>
FreeSWITCH檢測到NAT以后,設置Profile的外網SIP和RTPIP,通過命令可以查詢Ext-SIP-IP和Ext-RTP-IP值,如下:
freeswitch@internal> sofia status profile internal
==========================================
Name internal
Domain Name N/A
Auto-NAT false
DBName sofia_reg_internal
Pres Hosts 172.16.5.40,172.16.5.40
Dialplan XML
Context public
Challenge Realm auto_from
RTP-IP 172.116.5.40
Ext-RTP-IP 116.171.1.158
SIP-IP 172.116.5.40
Ext-SIP-IP 116.171.1.158
2、當路由不支持uPnP和NAT-PMP協議
需要手動設置,配置如下:
//internal.xml external.xml 假設116.171.1.158為外網映射地址 <param name="ext-rtp-ip" value="auto-nat"/> <param name="ext-sip-ip" value="auto-nat"/> 修改為 <param name="ext-rtp-ip" value="116.171.1.158"/> <param name="ext-sip-ip" value="116.171.1.158"/>
3、其他NAT穿透相關設置
開啟rport功能
//internal.xml
<param name="NDLB-force-rport" value="true"/>
三、檢查ACL參數,確定沒有阻擋
此處做ACL控制,目前是全部放開,一旦發現可疑的攻擊服務器的IP地址就需要加入到deny中阻止。
//autoload_configs/acl.conf.xml <param name="acl.conf" description="Network Lists">
檢查路由器上的IP端口映射,檢查FreeSWITCH機器的安全策略,確認下面端口:
- 1719 UDP H.323 Gatekeeper RAS port
- 1720 TCP H.323 Call Signaling
- 3478 UDP STUN service
- 3479 UDP STUN service
- 5002 TCP MLP protocol server
- 5003 UDP Neighborhood service
- 5060 UDP & TCP SIP UAS Used for SIP signaling (Standard SIP Port, for default Internal Profile)
- 5070 UDP & TCP SIP UAS Used for SIP signaling (For default "NAT" Profile)
- 5080 UDP & TCP SIP UAS Used for SIP signaling (For default "External" Profile)
- 16384-32768 UDP RTP/ RTCP multimedia streaming Used for audio/video data in SIP and other protocols
- 5066 TCP Websocket Used for WebRTC
- 7443 TCP Websocket Used for WebRTC