FreeSWITCH NAT
一、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