[转]SIP穿越NAT&FireWall解决方案

原文链接(也是转载)http://blog.csdn.net/yetyongjin/article/details/6881491我修改了部分错字。

SIP从私网到公网会遇到什么样的问题呢?

1. 包的地址转换。
2. SIP消息里面的SIP地址转换。
3. SIP消息里面的SDP中的RTP地址转换。

网络现存结构复杂,SIP服务提供商并不一定是NETWORK提供商,很难要求客户只能使用某种方式的NAT&FireWall。如何找出一种可以满足各种网络的SIP应用解决方案呢?

NAT和Firewall的基本原理

首先,NAT的几种方式:
Full Cone:当一台私网内的主机向公网发一个包,其本地地址和端口是{A:B},NAT会将其私有地址{A:B}转换成公网地址{X:Y}并绑定。

任何包都可以通过地址{X:Y}送到该主机的{A:B}地址上,NAT会将任何发送到{X:Y}的incoming包的地址{X:Y}转换成{A:B}。

Partial/Restricted Cone:当一台私网内的主机向公网发一个包,其本地地址和端口是{A:B},NAT会将其私有地址{A:B}转换成公网地址{X:Y}并绑定。

任何包都可以通过地址{X:Y}送到该主机的{A:B}地址上,但是,NAT只为第一个发往{X:Y}的包绑定成{A:B}|{X:Y}<->{C:D},其中{C:D}是那个包的源地址和端口。

也就是说,只有来自{C:D}的包才能于主机{A:B}通信。
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}。

NAT只接受来自{C:D}的incoming packet,将它转给{A:B}。也就是说,如果私网内的主机要向外面发送一个包,它必须要知道对方的公网IP和端口。但如果对方也是处于一个私网内,它就很难获知对方的公网IP和端口。
由此可见,Symmetric Cone条件最严格,Partial/Restricted Cone次之,Full Cone条件最不严格。

下面再看看Firewall的基本策略:
Firewall会判断所有的包是来自内部(Inside)还是外部(Outside)。

一般,允许所有来自inside的包发出去。

一般,允许来自Outside的包发进来,但这个连接必须是由Inside发起的。

一般,禁止所有连接由Outside发起的包发进来。

一般,firewall会允许几个信任的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保持映射关系。

并为分配给呼叫双方的地址和端口进行绑定,这样,呼叫双方的RTP连接地址都是RTP Proxy,由RTP Proxy经过中转,发至真正的目的地。

假设,有两个SIP Client要进行通信,Ada和Bob,他们分别位于自己的Nat Server后面:

其中两台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:

1.       如果SDP描述的是单工工作的话,RTP连接无法建立,因为RTP proxy始终无法知道沉默方的RTP公网IP。
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地址。

时间: 2024-08-03 17:23:35

[转]SIP穿越NAT&FireWall解决方案的相关文章

SIP穿越NAT SIP穿越防火墙-SBC

FireWall&NAT FireWall是一种被动网络安全防卫技术,位于网络的边界,在两个网络之间执行访问控制策略,防止外部网络对内部信息资源的非法访问,也可以阻止特定信息从内部网络被非法输出.一般来说,防火墙将过滤掉所有不请自到的网络通信(除指定开放的地址和端口). NAT技术分为基本的网络地址转换技术(NAT)和网络地址与端口转换技术(NAPT,Network Address and Port Translator),其主要功能是为流出内网的分组分配一个全局的IP地址和端口号作为其源地址和

UDP穿越NAT原理(p2p)

转载自:http://blog.csdn.net/ldd909/article/details/5979967 论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码).在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理. 首先先介绍一些基本概念: NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用.NAT分为两大类,基本的NAT和NAPT(Network

P2P网络穿越 NAT穿越

http://blog.csdn.net/mazidao2008/article/details/4933730 —————————————————————————————————————————————————————————————— 穿越NAT的意义: NAT是为了节省IP地址而设计的,但它隐藏了内网机器的地址,“意外”起到了安全的作用.对外不可见,不透明的内部网络也与互联网的“公平”应用,“相互共享”的思想所不容,尤其是P2P网络中“相互服务”的宗旨,所以穿越NAT,让众多内部网络的机器

P2P网络“自由”穿越NAT的“秘密”原理

NAT是为了节省IP地址而设计的,但它隐藏了内网机器的地址,“意外”起到了安全的作用,由于客户端是主动登录P2P网络才可穿越,所以P2P的方式也没有违背企业的内部管理原则…… 穿越NAT的意义: NAT是为了节省IP地址而设计的,但它隐藏了内网机器的地址,“意外”起到了安全的作用.对外不可见,不透明的内部网络也与互联网的“公平”应用,“相互共享”的思想所不容,尤其是P2P网络中“相互服务”的宗旨,所以穿越NAT,让众多内部网络的机器也参与到P2P网络中的大集体中来,一直是P2P开发者的所希望的.

TR-069_Amendment-4:附录G.穿越NAT网关的连接请求方式

注意:这种机制只适用于RFC 3489[21]中定义的经典STUN,RFC 5389引入后,这个机制已经过时.这个机制不是设计用于RFC 5389中定义的STUN.IPv6部署要么不使用NAT,要么以不同的方式使用它. G.1介绍 CWMP可以用来对通过网关连接的局域网下的CPE设备进行远程管理.当设备部在NAT网关之后,并被分配了私网IP后,CWMP依然可以对其进行管理,但有了限制,通过Connection Request触发CWMP会话的机制不可用. 本附录定义了一种方式,允许ACS初始化位

ASA防火墙穿越NAT设备与路由器做ipsecVPN

一. 实验任务及思路: 1.  使用GNS3搭建拓扑(拓扑如下),R2路由器模拟ISP服务提供商,R1上配置PAT实现内网对Internet的访问,要求ASA防火墙与R3之间建立IPSec VPN,连接穿过NAT设备,配置实现两端对等体建立IPSec VPN连接. 2. C1与C2先后互ping,比较ipsecVPN连接情况 二.  实验拓扑: 三.  IP地址规划:    C1 192.168.10.10/24 ASA1 e0/1 192.168.10.1/24 e0/0 172.16.11.

针对VMware虚拟机NAT无法使用解决方案——桥接的力量!

由于校园网的识别共享机制会误将虚拟机的NAT搭建方式识别为共享方式.在这里我需要解释一下NAT和桥接之间的差别: NAT在进行网络连接的时候,会将宿主机当做一个路由器使用,这样做的好处是可以将私有ip地址转换为公有ip地址(宿主地址),将请求发出去,可以节约ip地址不足的问题: 网络桥接模式下,你可以认为局域网下接入了一台新的电脑,使用两个ip地址(处于同一网段),这就是说,如果你是用的校园网,只能在虚拟系统和主机之间做出一个抉择,其他用户不用考虑. 这里用到的是VMware12,win7系统.

CISCO ASA NAT 回流解决方案

实际案例中也不少碰到此类问题,客户内网有台服务器映射在互联网上,外网用户访问Global-IP没问题,但是内网用户想要访问Global-IP就会不通,典型的就是用户将内网服务器做了公网DNS A记录,无论内外网均通过域名访问. JUNIPER系列设备包括Netscreen/ISG/SSG没有这类问题,直接通过普通的DIP即可实现,后续产品SRX防火墙也需通过双向NAT来解决,下面通过CISCO ASA来解决这个CASE,JUNIPER SRX解决原理类似. 假想拓扑如下: ASA内网网段192.

Cisco ASA站点间穿越nat互相访问的实验

1. 实验拓扑图: 1. 实验说明: R1作为A公司的站点1,内部有台1.1.1.1/32的服务器需要A公司站点2的管理员实行远程telnet的设备管理: R5作为A公司的站点2,内部有台2.2.2.2/32的服务器需要A公司站点1的管理员实行远程telnet的设备管理: 设备之间都有ASA防火墙的安全保护,R2作为互联网的一台路由器: 2. 实验配置: R1#show  run usernamecisco password 0 cisco ! interfaceLoopback0