FreeSWITCH 穿越 NAT
NAT的四种类型
基于UDP的P2P应用需要考虑NAT的类型,因为不同的NAT组合的穿透的方式并不一致,有的能通, 有的不能通。
一般来讲, NAT可以分为四种类型,分别是:
- 全锥型(Full Cone)
- 受限锥型(Restricted Cone), 或者说是IP受限锥型
- 端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型
- 对称型(Symmetric)
其中1,2,3属于同一种类型,都是锥型,区别只是路由器的不同的安全策略。还有些NAT不属于这四种中的任何一种,就不在本文的讨论范围了。
为什么有四种类型的NAT
NAT缓解了IPV4地址不够用的问题,同时也也带了限制,那就是NAT外部的主机无法主动跟位于NAT内部的主机通信,NAT内部主机想要通信,必须主动和公网的一个IP通信,路由器负责建立一个映射关系,从而实现数据的转发, 这就是NAT的工作原理。
假定
公网server1 ip是1.1.1.1, 监听端口是1111
公网server2 ip是2.2.2.2, 监听端口是2222
NAT router ip是8.8.8.8
NAT内部client是192.168.0.3
client发送数据的时候,不管是tcp还是udp必须本地绑定一个端口,一般来讲,这个过程都是自动的。
假定client(192.168.0.3, 100)给 server(1.1.1.1, 1111)发送报文,报文到达路由器,路由器在自己的公网ip上开辟一个端口800,从而建立了一个隐射关系(8.8.8.8, 800)<--->(192.168.0.3, 100), 建立映射关系后,所以(192.168.0.3, 100)和(1.1.1.1, 1111)之间的报文都通过这个映射关系进行转发。
NAT之间主要的区别分两种情况讨论
1:client(192.168.0.3, 100)和server(1.1.1.1, 1111)在路由器上建立好映射关系后,如果client(192.168.0.3, 100)又给(2.2.2.2, 2222)发送数据,路由器该怎么处理呢?
1, 复用旧的映射关系(8.8.8.8, 800)<--->(192.168.0.3, 100)和(2.2.2.2, 2222)通信, 这就是锥型(Cone) NAT
2, 创建新的映射关系(8.8.8.8, 801)<--->(192.168.0.3, 100)和(2.2.2.2, 2222)通信, 这就是对称型NAT
注: (8.8.8.8, 801)只是举例,到底用什么端口取决于路由器的端口管理策略,总之是另外的一个端口,有的路由器有多个公网IP,不同的IP也会参与到这个映射关系中。
2:client(192.168.0.3, 100)和server(1.1.1.1, 1111)在路由器上建立好映射关系后,如果这个时候路由器(8.8.8.8)在800端口上收到从另外一台server(2.2.2.2, 2222)发来的数据,是不是应该转发给(192.168.0.3, 100)呢?
有四种情况:
1, 无条件转发给(192.168.0.3, 100), 这就是全锥型(Full Cone)NAT。
2, 如果(192.168.0.3, 100)之前给(2.2.2.2)发送过数据,则转发, 这就是受限锥型(Restricted Cone)。
3, 如果(192.168.0.3, 100)之前给(2.2.2.2, 2222)发送过数据,则转发, 这就是端口受限锥型(Port Restricted Cone)。
4, 丢弃报文,拒绝转发, 这就是对称型NAT。
从上面也描述也可以看出,安全性系数, 对称型 > 端口受限锥型 > 受限锥型 > 全锥型
不同NAT的穿透性
NAT有10种组合
全锥型 | 全锥型 | ✓ |
全锥型 | 受限锥型 | ✓ |
全锥型 | 端口受限锥型 | ✓ |
全锥型 | 对称型 | ✓ |
受限锥型 | 受限锥型 | ✓ |
受限锥型 | 端口受限锥型 | ✓ |
受限锥型 | 对称型 | ✓ |
端口受限锥型 | 端口受限锥型 | ✓ |
端口受限锥型 | 对称型 | ✘, 无法打通 |
对称型 | 对称型 | ✘, 无法打通 |
FreeSWITCH帮助终端穿越NAT的解决方案:
SIP穿越
FreeSWITCH默认使用ACL来判断对方是否处于NAT环境中,配置:
<param name="apply-nat-acl" value="nat.auto"/>
nat.auto是一个ACL,包含了RFC1918规定的私网地址,并去掉了本地网络的地址。当SIP终端注册时,通过比较contact地址是否包含在此ACL中来判定该终端是否处于
NAT背后,如果是那么它就把contact地址自动替换为SIP包的来源地址,后边的呼叫就可以正常抵达。
RTP穿越
NAT环境的SIP终端SDP信息中的IP地址是私网地址,FreeSWITCH无法直接发送RTP包,而NAT设备基本都只允许内网主机曾经接触过的外网主机发送的UDP数据包
进入。FreeSWITCH使用了一个名为RTP自动调整的特性,在SIP协商时给对方一个可用的公网RTP地址,然后等待客户端发送RTP包,一旦FreeSWITCH收到RTP包后,
就可以根据对方发包的地址给它发RTP包了。此类情况发生时,Log中可看到类似信息:
[INFO] switch_rtp.c:4753 Auto Changeing port from 192.168.1.100:50496 to 1.2.3.4:50496
注意:此办法存在安全性问题,如某黑客向随机的RTP端口发数据包,FreeSWITCH收到后将远端地址调整到黑客的IP和端口,进而RTP数据全部跑歪了。所以为了防止
这个问题,FreeSWITCH规定这种端口调整只能在电话开始的时候进行,且仅支持一次调整。
自动调整的功能默认是开启的,可在Profile中禁用:
<param name="disable-rtp-auto-adjust" value="true"/>
或者仅针对个别的呼叫来禁用自动调整,在呼叫时设置通道变量"rtp_auto_adjust=false"来禁止。
SIP终端自己的解决方案
1、STUN服务
STUN的原理是:在公网上部署一个STUN服务器,位于NAT后面的客户端设备向它发送一系列的UDP包先在NAT设备上“打洞”,STUN服务器取到UDP包的来源地址后,
回送相关的消息告诉该客户端它被映射的外网地址。
大多数的SIP话机及软电话均可以选择是否启用STUN服务。使用STUN后,SIP消息的contact头域中就可以直接填入外网地址。
注意:STUN服务对于锥形NAT是有效的,但对于对称型NAT就无能为力了。简单讲就是SIP终端从STUN服务学习到的IP及端口会失效,如果两个SIP终端分别处于两个
对称型NAT之后,则它们是无法进行通信的。
2、ICE
综合利用STUN和TURN(使用转发方式进行穿越的NAT,主要用来解决对称型NAT的问题,FreeSWITCH不支持该技术,但支持与TURN的SIP客户端配合工作)等技术,
使之在最合适的情况下工作。比如,如果两个SIP终端处于相同的NAT后面,则他们可以直接用内网地址进行通信;如果位于不同的NAT后面,并且是锥型NAT,则选择从
STUN服务器获得外网地址进行通信;如果是对称型NAT,则只能通过TURN来通信。
FreeSWITCH处于NAT后面的解决方案
1、uPnp
FreeSWITCH支持通过uPnP或NAT-PMP协议在路由器上“打洞”,打洞完成后就知道自己将要映射的外网地址了,前提是路由器支持uPnp功能并开通。FreeSWITCH
检测到NAT以后,设置Profile的外网SIP和RTP的IP,通过命令 freeswitch@sword>sofia status profile external 可查询Ext-SIP-IP和Ext-RTP-IP的值。
自动检测NAT的配置在external.xml中:
<param name="ext-rtp-ip" value="auto-nat"/>
<param name="ext-sip-ip" value="auto-nat"/>
2、STUN服务
如果路由器不支持uPnp及NAT-PMP协议,那么可将上述配置改为:
<param name="ext-rtp-ip" value="stun:stunserver.org"/>
<param name="ext-sip-ip" value="stun:stunserver.org"/>
使用命令 freeswitch>stun stunserver.org 可检测该服务是否有效。
3、手动设置
手动找出路由器的外网IP地址后,以下两种方法都可设置:
<param name="ext-sip-ip" value="autonat:1.2.3.4"/>
<param name="ext-rtp-ip" value="autonat:1.2.3.4"/>
或者
<param name="ext-sip-ip" value="1.2.3.4"/>
<param name="ext-rtp-ip" value="1.2.3.4"/>
4、DNS服务器
部署DNS服务器,如host:sip.sword.com,通过域名解析获得外网的IP地址。
此方法的好处是,外网和内网的SIP终端用户都可以通过域名注册,如果有移动办公的用户,就不用经常更换内网地址或外网地址注册了。
原文地址:
http://www.360doc.com/content/15/1222/16/15077656_522312189.shtml
https://blog.****.net/mycloudpeak/article/details/53550405
推荐阅读
-
穿梭时光穿越民国北京街景视频,AI修复成全网热门
-
叶天逸:难以置信!我真的穿越了吗?接着他惊喜的表情出现了!接着,他恢复神智,凝视着这一幕,往事涌入脑海。
-
清华硕士独自在家打造出一辆车,全程一人设计与加工,轻松穿越沙漠攀岩,且易于拆装
-
深入理解LVS管理工具ipvsadm:详细解析与NAT模式实操演示
-
理解并掌握LVS-NAT和ipvsadm命令的使用方法
-
理解并掌握ipvsadm命令工具以及LVS-NAT和LVS-DR的实现方法
-
使用LVS-NAT模式搭建集群的方法
-
使用ipvsadm命令配置LVS-NAT和LVS-DR集群的方法
-
玩转IPVS:深入理解NAT转发模式
-
详述LVS-NAT模式的配置方法