RFC3581的下载地址:http://www.ietf.org/rfc/rfc3581.txt 服务器
该协议比较简短,主要用于描述rport(response-port)机制。 网络
NAT:网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被普遍应用于各类类型Internet接入方式和各类类型的网络中。缘由很简单,NAT不只完美地解决了lP地址不足的问题,并且还可以有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。 加密
NAT经常使用的分类以下: spa
l Full Cone NAT(彻底圆锥型) .net
l Address Restricted Cone NAT(地址限制圆锥型 ) 插件
l Port Restricted Cone NAT(端口限制圆锥型) 3d
在彻底圆锥型NAT(Full Cone NAT)中,NAT会将客户机地址{X:y}转换成公网地址{A:b}并绑定。任何包均可以经过地址{A:b}送到客户主机的{X:y}地址上。如图所示:
htm
地址限制圆锥型NAT(Address Restricted Cone NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P}的包才能和主机{X:y}通讯。以下图所示:
接口
端口限制圆锥型NAT(Port Restricted Cone NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P,q}的包才能和主机{X:y}通讯。以下图所示:
对称型NAT(Symmetric NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定为{X:y}|{A:b}<->{P:q}。对称型NAT只接受来自{P:q}的incoming packet,将它转给{X:y} ,每次客户机请求一个不一样的公网地址和端口,NAT会新分配一个端口号{C,d} 。以下图所示:
由于SIP信令中的From和Contact头域记录的是私网地址和端口,NAT没法识别和转换。如图所示:
这个内网的NAT上打了一个方向为211.136.91.58的“洞”,(这就是称为UDP Hole Punching的技术)之后211.136.91.58就能够经过这个洞与内网的192.168.1.223联系了,可是其余的IP不能利用这个洞。
在没有活动的时候,这个Hole会过时:
NAT对于地址转换关系是有必定生命期的,某个地址转换后在一段时间内没有被使用将会被清除,当这个业务流再次出现时,将会创建一个新的地址转换关系。
SIP代理没法穿越
SIP在UDP和TCP上操做。当在UDP中使用的时候,对请求的响应被发送给请求所来自的地址,端口字段带在请求的Via头字段中。一半以上的信息(例如:IP地址)带在 IP包头中,还有一半的信息(例如:端口信息)带在SIP消息头中。SIP这样作的缘由是为了监听全部的信息,包括请求消息和响应消息。
可是这种方式在客户端在 NAT中的状况不适用,在NAT的环境中,回应可能发送不过去,由于与在请求中找到的地址不同,并且此前也没有方法让客户端来获得源端口信息。
解决NAT穿越有不少中解决方案,经常使用的有:
能够识别SIP信令,可以适当地修改数据包。ALG能够是单独的链接于外网和内网之间的设备,也能够是内置于防火墙内的插件。
当FW/NAT发现外网呼叫信令为SIP时,将其转发到ALG(应用层网关),经过ALG创建起内网伪地址终端与外网终端的通讯链接。
使用ALG须要对现有设备升级改造。例如思科的路由器都支持配置ALG。
容许第三方(MIDCOM Agent )成为受FW/NAT信任的实体,而后表明FW/NAT作出决定,强迫其开放端口传送媒体流或数据流。这些受信任的实体经过“MidCom”定义的新协议与FW/NAT进行通讯。
协议的识别不禁Middlebox完成,而是由外部的MIDCOM Agent完成。
使用MidCom须要对现有设备升级改造。
IETF RFC 3489定义了如何肯定由NAT分配的公网地址和端口,不须要改造现有NAT。
主要特点:
l 可以让客户端发现NAT的存在以及类型;
l 可以让客户端发现NAT的绑定生命周期;
l 能够工做在多NAT串联环境下;
l 很是简单的协议,易于实现,负载低;
l STUN服务器能够位于公网任何地方。
适用范围:
l 不适用于Symmetric NAT;
l 对于Non- Symmetric NAT都适用;
l 若是双方都位于同一个NAT以后,就不适用。
Ø SBC能够帮助SIP信令穿越已经存在的FW/NAT,而不须要对现有的FW/NAT设备作任何改变;
Ø 对于SIP终端,SIP终端设备会周期性发送注册消息到SBC。
l Media Traversal Solution
SBC能够把相应的媒体流发送到防火墙上的相关IP地址和端口,而后正确地使媒体流到达防火墙后的用户侧。
得到IP地址是在Via头中带上received参数。为了获得端口信息,也参考了这种方式,即在Via头中带上rport属性来指明端口信息。
当在客户端和服务器之间是NAT的时候,请求可能会在NAT中建立(或刷新)一个绑定,为了让客户端收到响应信息,在事务处理的过程当中这个绑定必须保持存在。大多数的NAT绑定有超过1分钟的超时时间,这超过了non-INVITE事务的持续时间,于是对non-INVITE事务的请求的响应只能在绑定存在的时候存在。INVITE事务却是不存在这个问题。
为了保持这个绑定,客户端应该在每隔20s左右重发INVITE请求,这种重发机制须要发生在收到一个临时的响应后。
固然刚才所说的大概1分钟的超时时间也不是肯定的,有时候会比这长,此时重发机制能够发慢一点,不然,能够发快一点。这些问题可参考RFC3489。
若是是支持rport机制的服务器,它须要在接收到的请求中检查Via头是否包含一个没有值的rport参数。若是有,它须要在回应中带上rport的值,这与received的处理相似。
为了穿越对称性的对称性的NAT,响应须要发送到相同的IP地址和端口。当服务器在多端口或接口的请求上监听请求时,它必须记住请求是从何处发的。对一个稳定的Proxy,在一个传输的持续时间中,记住这些东西是没有问题的。可是对于不稳定的Proxy,它不存储请求和响应中的状态信息,为了达到本规范的要求,它须要将地址和端口信息加密到Via头字段中,在响应信息到达的时候,它能提取加密的信息并将它放到响应中。
rport机制须要终端支持该种机制,所以应用状况比较受限。可是在笔者的应用场景(呼叫中心)中,主要要解决的问题是坐席能在NAT环境中穿越,给服务器发送信息。由于坐席所使用的SIP软电话是本公司开发的,因此能够保证是支持rport和received的。
下面举一个发送REGISTER信息的实例,在请求信息的Via头中包含了没有值的rport参数,以下所示:
REGISTER sip:124.40.120.188:5060 SIP/2.0
Via: SIP/2.0/UDP 124.42.4.203:15500;branch=z9hG4bK-d8754z-1049ed261d2e643d-1---d8754z-;rport
Max-Forwards: 70
Contact: <sip:19988888888@192.168.2.65:12344;rinstance=7cd1c532e92fdb0e>;expires=0
To: "19988888888"<sip:19988888888@124.40.120.188:5060>
From: "19988888888"<sip:19988888888@124.40.120.188:5060>;tag=203ba359
Call-ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 1 REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User-Agent: eyeBeam release 1105a stamp 56793
Content-Length: 0
发送到的服务器支持rport机制,它看到请求中的rport后,将经过分析UDP包信息获得的的NAT的公网地址(124.42.4.203)和端口信息(15500)分别做为received和rport属性带给客户端:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 124.42.4.203:15500;branch=z9hG4bK-d8754z-1049ed261d2e643d-1---d8754z-;rport=15500;received=124.42.4.203
From: "19988888888"<sip:19988888888@124.40.120.188:5060>;tag=203ba359
To: "19988888888"<sip:19988888888@124.40.120.188:5060>;tag=0005-058-7d6dc90516ae2e21
Call-ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 4 REGISTER
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: <sip:124.40.120.188:5060>
Content-Length: 0
客户端在获得响应信息后,知道了所使用的公网地址和端口,在然后按期重发的REGISTER信息中,Contact变换成124.42.4.203: 15500,例如新发的REGISTER信息变为:
REGISTER sip:124.40.120.188:5060 SIP/2.0
Via: SIP/2.0/UDP 124.42.4.203:15500;branch=z9hG4bK-d8754z-1049ed261d2e643d-1---d8754z-;rport
Max-Forwards: 70
Contact: <sip:19988888888@124.42.4.203: 15500;rinstance=7cd1c532e92fdb0e>;expires=0
To: "19988888888"<sip:19988888888@124.40.120.188:5060>
From: "19988888888"<sip:19988888888@124.40.120.188:5060>;tag=203ba359
Call-ID: Yzc4N2IwMzY5OWU4MTdkMzY0NWY4OWU3NjMzNmJiM2U.
CSeq: 2 REGISTER
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User-Agent: eyeBeam release 1105a stamp 56793
Content-Length: 0
4. 参考文档
神州泰岳应用开发事业部郑昀《SIP穿越NAT》
RFC3581:http://www.ietf.org/rfc/rfc3581.txt