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
posted @ 2022-04-19 16:25  钟齐峰  阅读(2272)  评论(0编辑  收藏  举报