[转]SIP穿越NAT&FireWall解决方案
2. SIP消息里面的SIP地址转换。
3. SIP消息里面的SDP中的RTP地址转换。
网络现存结构复杂,SIP服务提供商并不一定是NETWORK提供商,很难要求客户只能使用某种方式的NAT&FireWall。如何找出一种可以满足各种网络的SIP应用解决方案呢?
NAT和Firewall的基本原理
Full Cone:当一台私网内的主机向公网发一个包,其本地地址和端口是{A:B},NAT会将其私有地址{A:B}转换成公网地址{X:Y}并绑定。
Partial/Restricted Cone:当一台私网内的主机向公网发一个包,其本地地址和端口是{A:B},NAT会将其私有地址{A:B}转换成公网地址{X:Y}并绑定。
Partial和Restricted Cone的区别是Partial只绑定incoming packet 的IP地址,而Restricted Cone会绑定incoming packet的IP地址和端口。也就是上面描述的那种情况。
Symmetric Cone:当一台私网内的主机向公网某台主机发送一个包,{A:B}->{C:D}。NAT会将其地址{A:B}转换成{X:Y},并为其绑定成{A:B}|{X:Y}<->{C:D}。
由此可见,Symmetric Cone条件最严格,Partial/Restricted Cone次之,Full Cone条件最不严格。
下面再看看Firewall的基本策略:
Firewall会判断所有的包是来自内部(Inside)还是外部(Outside)。
所有NAT和Firewall都是对于TCP/IP层以下进行处理和过滤的,而SIP应用的地址是在应用层。所以必须采用其他的途径来解决这一问题。
针对不同的NAT类型,可以有不同的解决方案。
1. UPnP
2. External Query
3. STUN
4. ALG
其中前3种都是由SIP Client(包括UA和Proxy)通过某种手段或协议在INVITE之前获取自己的公网地址和端口。需要SIP Client提供额外支持,并且也不适应所有的NAT方式。
ALG(Application Layer Gateway)适应所有NAT方式,并不需要SIP Client做任何额外的支持。它对Application层的SIP信令进行处理和修改,从而做到透明转换地址。
下面针对一个案例详细描述ALG的解决方案。
SIP ALG解决方案
ALG修改SIP消息里面的SIP地址和端口和SDP消息里面的RTP地址和端口,其中RTP地址和端口要向RTP Proxy请求获得,RTP Proxy分配自己的一个空闲的地址和端口,并和这个Call保持映射关系。
其中两台NAT Server都是Symmetric Cone方式。
其信令流程如下:
1.Ada发起信令,Invite Bob。
IP Packet IP Address:
From: 192.168.1.10:5060
To: 128.97.41.56:5060 (SIP ALG)
SIP Msg IP Address:
From: 192.168.1.10:5060
To: 128.97.41.56:5060
SDP Body IP Address for RTP:
192.168.1.10:10024
2.经过NAT Server,NAT将其私有地址转换成公网地址,并绑定,由于是采用Symmetric Cone方式,所以还绑定目的的IP地址。
{192.168.1.10:5060}|{128.96.41.1:5678}<->{128.97.41.56:5060}
IP Packet IP Address:
From: 128.96.41.1:5678
To: 128.97.41.56:5060 (SIP ALG)
SIP Msg IP Address:
From: 192.168.1.10:5060
To: 128.97.41.56:5060
SDP Body IP Address for RTP:
192.168.1.10:10024
3.SIP ALG接受到该INVITE,发现其包的IP地址和SIP IP地址不同,就判断其是经过NAT,于是就将其相关的SIP IP地址修改。
并检查它的Body中是否是包含SDP信息,如果是,且有RTP地址,SIP ALG就会去向RTP Proxy请求一个公网RTP地址来代替原有的RTP地址。
IP Packet IP Address:
From: 128.97.41.56:5060
To: 128.96.63.25:5566
SIP Msg IP Address:
From: 128.96.41.1:5678
To: 128.96.63.25:5566(下一跳的地址)
SDP Body IP Address for RTP:
128.97.44.5:3000
4.因为Bob不断的向SIP ALG发送注册包,所以,它的NAT Server始终为它保留着这么个绑定,{10.0.0.12:5060}|{128.96.63.25:5566}<->{128.97.41.56:5060}。所以,由SIP ALG发出的INVITE,Bob能收到。
Bob返回200 OK,包含SDP信息。
IP Packet IP Address:
From: 10.0.0.12:5060
To: 128.97.41.56:5060
SIP Msg IP Address:
From: 10.0.0.12:5060
To: 128.97.41.56:5060(下一跳的地址)
SDP Body IP Address for RTP:
10.0.0.12:10002
5.NAT Server将其包的IP地址修改。发往SIP ALG。
6.SIP ALG接受到该200 OK,发现其包的IP地址和SIP IP地址不同,就判断其是经过NAT,于是就将其相关的SIP IP地址修改。
并检查它的Body中是否是包含SDP信息,如果是,且有RTP地址,SIP ALG就会去向RTP Proxy请求一个公网RTP地址来代替原有的RTP地址。
IP Packet IP Address:
From: 128.96.63.25:5566
To: 128.96.41.1:5678
SIP Msg IP Address:
From: 128.96.63.25:5566
To: 128.96.41.1:5678(下一跳的地址)
SDP Body IP Address for RTP:
128.97.44.5:3002
7.此时,RTP Proxy为这个Session保持着这么个连接绑定
{128.97.44.5:3000|128.97.44.5:3002}
8.Ada收到200 OK,它认为对方的RTP地址是128.97.44.5:3002。将与其建立连接。
而Bob认为对方的RTP地址是128.97.44.5:3000。将与其建立连接。
9.当RTP Proxy的3002端口收到包,它可以从包地址获得Ada的RTP公网IP。
当RTP Proxy的3000端口收到包,它可以从包地址获得Bob的RTP公网IP。
从而,RTP Proxy会将3002端口收到的包转发到Bob的RTP公网IP。
同样,RTP Proxy会将3000端口收到的包转发到Ada的RTP公网IP。
这样,一个通话的连接就成功建立。
SIP ALG的部署因为无论如何,都需要所有RTP包经过RTP Proxy,所以所有的MS都要有修改SDP的能力,而只有SIP ALG需要有修改SIP消息的能力。让用户配置自己的Proxy是什么,避免公网的SIP Client也经过SIP ALG,造成没必要的消耗。
补充如果SIP ALG发现INVITE包的地址和SIP地址是一致的话,它将不对这个包进行修改,它认为这个包是来自公网,或者SIP Client具备了穿越NAT的能力。但它会修改其SDP的IP地址。
ISSUE:
2. 每次建立RTP连接,某一方的RTP包可能会丢掉若干个,直到RTP proxy获知另一方的RTP公网IP。
3. 是否应该强制任何RTP包都要经过RTP Proxy,无论它们都是来自公网,可以直接连接。我想是的,因为主叫方是不知道被叫方的网络环境的。
4. 如果多个RTP Proxy进行均衡,如何保证为主叫方分配IP的Proxy和为被叫方分配IP的Proxy是一致的呢?(它们必须是同一台Proxy)
可以增加一个header,比如RTP proxy,这个header只有SIP ALG认识。
5. 如果SIP消息加密,就无法修改其SIP的IP地址。
[转]SIP穿越NAT&FireWall解决方案的更多相关文章
- SIP穿越NAT SIP穿越防火墙-SBC
FireWall&NAT FireWall是一种被动网络安全防卫技术,位于网络的边界.在两个网络之间运行訪问控制策略.防止外部网络对内部信息资源的非法訪问,也能够阻止特定信息从内部网络被非法输 ...
- [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
[转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching) http://www.360doc.com/content/12/0428/17/6187784 ...
- UDP穿越NAT原理(p2p)
转载自:http://blog.csdn.net/ldd909/article/details/5979967 论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码).在这里我 ...
- P2P网络穿越 NAT穿越
http://blog.csdn.net/mazidao2008/article/details/4933730 ——————————————————————————————————————————— ...
- TR-069_Amendment-4:附录G.穿越NAT网关的连接请求方式
注意:这种机制只适用于RFC 3489[21]中定义的经典STUN,RFC 5389引入后,这个机制已经过时.这个机制不是设计用于RFC 5389中定义的STUN.IPv6部署要么不使用NAT,要么以 ...
- NAT穿透解决方案介绍
最近公司要实现在各种网络环境下面的多屏互动(机顶盒.android phone.iphone及PC端)的需求:由于IP地址资源有限的原因,目前我们使用的各种终端设备都位于局域网后面也就是多台设备共享同 ...
- NAT穿透解决方案介绍(转)--Java ICE实现
转:http://www.cnblogs.com/javaminer/p/3575282.html 最近公司要实现在各种网络环境下面的多屏互动(机顶盒.android phone.iphone及PC端 ...
- C# p2p UDP穿越NAT,UDP打洞源码
思路如下(参照源代码): 1. frmServer启动两个网络侦听,主连接侦听,协助打洞的侦听. 2. frmClientA和frmClientB分别与frmServer的主连接保持联系. 3. 当f ...
- udp打洞( NAT traversal )的方法介绍
http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.html http://www.gzsec.com/oldversion/ ...
随机推荐
- [OrangePi] Backup internal EMMC to SD Card
Boot your Orange PI board from EMMC without SD Card inserted login insert your SD Card Run: sudo ins ...
- session_start()一些问题
session问题集锦 对于PHP的session功能,始终找不到合适的答案,尤其是一些错误,还有一些没有错误的结果,最可怕的就是后者,一直为许多的初学者为难.就连有些老手,有时都被搞得莫名其妙.本文 ...
- Java 的局部变量和成员变量
在Java语言中没有全局变量 分析各种变量的作用域的最简单方法是以花括号为界, 1.在类体中定义的是成员变量,成员变量会被默认初始化 2.在方法中定义的是局部变量,局部变量不会被默认初始化
- python any()和all()用法
#any(x)判断x对象是否为空对象,如果都为空.0.false,则返回false,如果不都为空.0.false,则返回true #all(x)如果all(x)参数x对象的所有元素不为0.''.Fal ...
- 160829、Java加解密与数字签名
** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...
- STM32内存跟FLASH问题
RO: 常量 ZI: 未初始化的全局变量 RW: 初始化的全局变量 Code: 程序本身 Code, RO-data,RW-data ..............flash RW-data, ZIda ...
- 快速搭建Redis缓存数据库
之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...
- SQL数据类型大全 《转自网络》
数据类型是数据的一种属性,表示数据所表示信息的类型.任何一种计算机语言都定义了自己的数据类型.当然,不同的程序语言都具有不同的特点,所定义的数据类型的种类和名称都或多或少有些不同.SQLServer ...
- htmlnav
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Shopping(SPFA+DFS HDU3768)
Shopping Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...