FireWall&NAT
FireWall是一种被动网络安全防卫技术,位于网络的边界,在两个网络之间执行访问控制策略,防止外部网络对内部信息资源的非法访问,也可以阻止特定信息从内部网络被非法输出。一般来说,防火墙将过滤掉所有不请自到的网络通信(除指定开放的地址和端口)。
NAT技术分为基本的网络地址转换技术(NAT)和网络地址与端口转换技术(NAPT,Network Address and Port Translator),其主要功能是为流出内网的分组分配一个全局的IP地址和端口号作为其源地址和源端口号,并将此映射关系加入一个地址/端口映射表。对于外来分组,NAT 服务器将利用地址/端口映射表将外来分组的目的IP地址和端口号正确的变换回内部主机所使用的内部IP地址和端口号,然后再转发给内网主机。
基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外是不可见的。子网内只有少数一些IP地址可以对应到真正全球唯一的IP地址。如果这些节点需要访问外部网络,那么基本NAT就负责将这个节点的子网内IP转化为一个全球唯一的IP然后发送出去。(基本的NAT会改变IP包中的原IP地址,但是不会改变IP包中的端口)。
另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。基本NAT的设备可能我们见的不多。见下图
有一个私有网络10.0.0.0,Client A是其中的一台计算机,这个网络的网关(一个NAT设备)的外网IP是155.99.25.11(应该还有一个内网的IP地址,比如10.0.0.10)。如果Client A中的某个进程(这个进程创建了一个UDP Socket,这个Socket绑定1234端口)想访问外网主机18.181.0.31的2234端口,那么当数据包通过NAT时会发生什么事情呢?
首先NAT会改变这个数据包的源IP地址,改为155.99.25.11。接着NAT会为这个传输创建一个Session(Session是一个抽象的概念,如果是TCP,也许Session是由一个SYN包开始,以一个FIN包结束。而UDP呢,以这个IP的这个端口的第一个UDP开始,结束呢,也许是几分钟,也许是几小时),并且给这个Session分配一个端口,比如62000,然后改变这个数据包的源端口为62000。所以本来是(10.0.0.1:1234->18.181.0.31:2234)的数据包到了互联网上变为了(155.99.25.11:62000->18.181.0.31:2234)。一旦NAT创建了一个Session后,NAT会记住62000端口对应的是10.0.0.1的1234端口,以后从18.181.0.31发送到62000端口的数据会被NAT自动的转发到10.0.0.1上。(注意:这里是说18.181.0.31发送到62000端口的数据会被转发,其他的IP发送到这个端口的数据将被NAT抛弃)这样Client A就与Server S1建立以了一个连接。前面我们所说的在NAT上建立的那个Session,就是我们常说的:”在内网的NAT上打上一个’洞’”。这个洞不能由外部来打,只能由内网的主机来打。而且这个洞是有方向的。如上例所说的是从内部某台主机(10.0.0.1)向外部的某个IP(18.181.0.31)发送一个UDP包,那么就在这个内网的NAT设备上打了一个方向为18.181.0.31的”洞”。以后18.181.0.31就可以通过这个洞与内网的10.0.0.1联系了。(此处说明一点,在NAT上打的这个”洞”只能由这两个IP使用,其他的IP不能利用这个洞进行通信。) 这就是称为UDP Hole Punching的技术。
在没有活动的时候,这个Hole会过期。NAT对于地址转换关系是有一定生命期的,某个地址转换后在一段时间内没有被使用将会被清除,当这个业务流再次出现时,将会建立一个新的地址转换关系。
NAT常用的分类如下:
Full Cone NAT(完全圆锥型)
Address Restricted Cone NAT(地址限制圆锥型 )
Port Restricted Cone NAT(端口限制圆锥型)
Symmetric NAT(对称型)
Full Cone NAT(完全圆锥型NAT )
在完全圆锥型NAT(Full Cone NAT)中,NAT会将客户机地址{X:y}转换成公网地址{A:b}并绑定。任何包都可以通过地址{A:b}送到客户主机的{X:y}地址上。如图所示:
Address Restricted Cone NAT(地址限制圆锥型)
地址限制圆锥型NAT(Address Restricted Cone NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P}的包才能和主机{X:y}通信。如下图所示:
Port Restricted Cone NAT(端口限制圆锥型)
端口限制圆锥型NAT(Port Restricted Cone NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定,只有来自主机{P,q}的包才能和主机{X:y}通信。如下图所示:
Symmetric NAT(对称型)
对称型NAT(Symmetric NAT)会将客户机地址{X:y}转换成公网地址{A:b}并绑定为{X:y}|{A:b}<->{P:q}。对称型NAT只接受来自{P:q}的incoming packet,将它转给{X:y} ,每次客户机请求一个不同的公网地址和端口,NAT会新分配一个端口号{C,d} 。如下图所示:
部署SIP网络出现的问题
基于SIP协议的语音和视频会话采用主叫呼入方式(unsolicited incoming calls),被叫方无法事先预知,所以终端必须随时监听外来的呼叫,这和前面介绍的防火墙工作原理是相悖的。即使打开防火墙上的一个端口来专门接收呼叫信令,SIP语音和视频通信协议还会动态分配别的端口来传送语音和视频等媒体数据。如何在不降低网络安全性的前提下为防火墙后面的用户提供安全的双向通信就是一个重要问题。
同时NAT对SIP语音和视频通信的传输有关键性的影响。首先,SIP会话信令(Layer 5)的SDP中包含了终端准备用来收发信令/媒体的地址和端口信息,这些信息对NAT服务器是透明的,在经过NAT服务器之后保持不变。当位于内网的SIP终端作为主叫向外发起呼叫请求的时候,SIP信令经过NAT服务器之后只有(Layer 3)的地址信息被改写,而layer 5的会话信令中包含的地址信息被原封不动的送到了被叫,中间可能经过多个SIP Proxy,利用SIP协议的这一机制,主叫和被叫可以完成媒体协商过程,但是当被叫使用主叫的私有地址来发送媒体的时候,媒体流将发送失败。总之,针对NAT 的解决方案必须保证安全的双向通信,支持主叫呼入方式,同时要尽可能避免对NAT设备的改动或是依赖于特定类型的设备。
NAT的常用解决方案
解决NAT穿越有很多中解决方案,常用的有:
1、ALG(Application Level Gateway)
可以识别SIP信令,能够适当地修改数据包。ALG可以是单独的连接于外网和内网之间的设备,也可以是内置于防火墙内的插件。当FW/NAT发现外网呼叫信令为SIP时,将其转发到ALG(应用层网关),通过ALG建立起内网伪地址终端与外网终端的通信连接。
经过NAT转换后,到外网SIP包中via,contact,ower/creator,connection information均需要改为NAT外网IP。
使用ALG需要对现有设备升级改造。例如思科的路由器都支持配置ALG。光口板用的正是ALG功能。
附件为光口板sip alg功能所遇到的一些关键问题。
2、MidCom(Middlebox Communications)
MIDCOM技术是为了解决ALG和代理技术所共有的可扩展性不强而出现的一种NAT穿越解决方案。MIDCOM技术是采用可信的第三方(MIDCOM Agent)对Middlebox(NAT)进行控制,由MIDCOM Agent控制Middlebox打开和关闭媒体端口。总的来说,MIDCOM技术是一种理想的NAT穿越解决方案,它将IP语音和视频业务识别的智能从Middlebox转移到外部的MIDCOM Agent上,应用协议对Middlebox来说是透明的。
通常,MIDCOM Agent的功能可以集成在呼叫控制服务器(如SIP服务器、GK或软交换设备)之中,而Middlebox功能集成在NAT之中,MIDCOM Agent和Middlebox之间接口采用MIDCOM协议完成互通。MIDCOM技术的优势在于可扩展性强,新增应用只需对MIDCOM Agent进行扩展,而不会导致MIDBOX重新升级。然而,MIDCOM技术的实施需要对服务器和现有的NAT需要同时进行MIDCOM协议的升级扩展,因此该方案的实施不可避免带来了现有设备升级的困难。同时,MIDCOM协议尚处于不断完善的阶段,设备制造商提供的产品种类有限,因而现阶段MIDCOM方式的实际应用并不多见。但可以预见的是,随着MIDCOM协议的不断成熟和发展,该方式将获得越来越多的应用前景。
使用MidCom需要对现有设备升级改造。
3、STUN(Simple Traversalof UDP Through Network)
IETF RFC 3489定义了如何确定由NAT分配的公网地址和端口,不需要改造现有NAT。
主要特色:
- 能够让客户端发现NAT的存在以及类型;
- 能够让客户端发现NAT的绑定生命周期;
- 可以工作在多NAT串联环境下;
- 非常简单的协议,易于实现,负载低;
- STUN服务器可以位于公网任何地方。
适用范围:
- 不适用于Symmetric NAT;
- 对于Non- Symmetric NAT都适用;
- 如果双方都位于同一个NAT之后,就不适用。
4、SBC(Session Border Controller)
SBC是VoIP接入层设备,它通过在网络的边界处对会话进行控制来实现NAT/防火墙穿透功能,同时还可以进行带宽限制、会话管理、流量统计等。其次,SBC还可以被看作支持VoIP的代理服务器,可以识别第五层和第七层的消息,并且还可以处理第五层以上的众多会话信令协议,修改数据包头的地址,从而实现SBC内外网地址变换。
SBC的穿透过程遵循一定的通信模型,在模型中可将会话分解成若干信道。在信道层面,通过对信道进行建立、维护和删除等操作保证信道的可用性,在会话层面,将不同信道进行连接和释放等操作,可以实现整个会话穿透过程。SBC位于两个网络的边界,其架构一般包括两个主要的功能模块:Signaling Proxy 和Media Proxy。其中Signaling Proxy 负责处理SIP会话信令,而Media Proxy负责对媒体流进行控制,Signaling Proxy和Media Proxy之间使用特定的协议和接口(例如Megaco 协议)来交换信息,如下图
–Signaling Proxy
Signaling Proxy是一个高性能的B2BUA(Back to Back User Agent),负责对所有经过此节点的双向SIP会话信令进行必要的处理。在B2BUA中,其中一个作为UAS(User Agent Server)负责接收并处理主叫终端的会话请求,而另一个就作为UAC(User Agent Client)向下一跳发出会话请求。与代理服务器不同,B2BUA必须维护各个会话的状态,并参与到会话建立的信令交互过程中。
为了确保SIP会话信令通过SBC,可以修改域名服务器中对应于呼叫服务器(Call Server)的条目,将SBC的IP地址作为呼叫服务器的IP地址响应给进行DNS查询的终端,终端就会把发往呼叫服务器的信令都直接发到SBC。这些改动对终端用户是透明的,但SBC可以获得所有的呼叫信息,并能够参与到呼叫建立的过程中去具体实施控制。其次,Signaling Proxy也必须对SIP会话信令中与信令和媒体有关的地址信息进行修改。
(1)SIP用户注册消息处理,Signaling Proxy在截获SIP的用户注册消息之后,将使用自己的IP地址和端口号改写SIP头标中的Via和Contact域,然后再发往呼叫服务器(SIP注册服务器),这样就可以把SIP用户的当前位置绑定在SBC上,当该SIP用户作为被叫的时候,信令都会首先发至SBC。同时,因为NAT服务器会在比较短的间隔内清除地址/端口映射表中的UDP无效表项,所以当终端使用UDP来传输SIP信令的时候,位于NAT服务器之后的终端必须周期性(大概几十秒)的向外部的呼叫服务器发送注册消息,才能够使NAT服务器中对应于该终端的地址/端口映射表项保持有效。
(2)SIP消息改写,为了确保Signaling Proxy始终位于信令通路上,Signaling Proxy必须使用本地的地址和端口号来改写SIP消息中的Via和Contact域。当使用内部地址的终端用户向呼叫服务器发送信令的时候,经过Firewall/NAT之后的IP分组将使用NAT服务器分配的源地址和源端口。收到此信令的Signaling Proxy就会在本地建立一个映射关系,NAT服务器将为此终端分配的地址和端口号,以及Signaling Proxy为此会话分配的地址和端口号绑定在一起。这样,当反向信令到达Signaling Proxy的时候,Signaling Proxy将透过Firewall/NAT上正确的地址和端口号将信令发送给终端。
(3)修改SDP,为了将Media Proxy加入到媒体通路中,SIP消息中的SDP部分也应当被改写。SDP中包括了终端准备用来收发媒体的地址和端口信息。当终端位于Firewall/NAT之后的时候,这些信息如果原封不动的送达通信对端,就会导致通信对端发送媒体流失败。Signaling Proxy将通过Media Proxy分配本地的地址和端口号,并使用本地的地址和端口号改写这些信息,就可以保证双向媒体流的建立。
Signaling Proxy只对特定SIP信令消息中的特定域进行修改,其他的消息和域都将维持不变。
–Media Proxy
Media Proxy接受Signaling Proxy的控制,是会话双方之间RTP/RTCP媒体流的转换点。因为所有的媒体流都要经过Media Proxy,所以应当具有控制媒体流的能力,对服务质量进行管理,获取计费信息及动态的网络地址/端口转换等。
经过SBC信令和媒体流整个过程如图2所示。当主叫的用户代理(UA)发起呼叫的时候①,Signaling Proxy会在收到INVITE消息之后向Media Proxy申请分配本地的NAT地址和端口(呼叫服务器侧)②,并使用Media Proxy 返回的地址和端口号③,改写信令消息中携带的SDP,然后再发往呼叫服务器④,最终由呼叫服务器送达被叫方⑤。当反向信令到达Signaling Proxy的时候⑥⑦,Signaling Proxy会再次向Media Proxy申请分配本地的NAT地址和端口(主叫用户侧)⑧,并使用返回的地址和端口号⑨改写反向信令中携带的SDP,然后再发往主叫的用户代理⑩。
经过这样的信令处理之后,主叫和被叫都会将媒体流发往Media Proxy上指定地址和端口,此时Media Proxy就可以通过读取媒体流的源地址和源端口来确定位于NAT之后的主叫/被叫在其Firewall/NAT上所使用的全局地址和端口,进而把通信对端的媒体流发往该地址/端口。因为Firewall/NAT上已经存在了对应此全局地址/端口的映射关系,Firewall/NAT会将此媒体流转发给内部的终端,至此双向的媒体连接建立成功。因此,SBC在不降低网络安全性的前提下,为Firewall/NAT后的用户提供了安全的双向通信。
(1)动态的网络地址/端口转换(NAPT),Media Proxy所具备的NAPT功能不仅可以解决运营商网络或用户网络的IPv4地址短缺问题,还隐藏了运营商网络和用户网络的拓扑信息,增强了对拒绝服务(Denial of Service)攻击的防御能力,也保证了运营商网络拓扑的机密性。
(2)产生计费信息,Media Proxy 是媒体流的必经之处,因此可以对会话的时长、会话的类型(语音、视频等)以及双向的数据流量进行监视和统计,是产生CDR(Charge Detail Records)的合适位置。
(3)网间的QoS映射,IP头标中的ToS域(Type Of Service)/DS域(Differentiated Service)指示了分组所应获得的QoS(Quality of Service)级别。为了保证端到端的服务质量,必须在两个网络的边缘完成QoS映射。当会话的IP分组在经过Media Proxy的时候,都携带了来源网络所做的ToS/DS标记,Media Proxy可以根据事先配置好的映射规则改变这些标记,再送入目的网络中,从而保证该会话的QoS 在不同运营商的网络内保持一致,也就是保证其端到端的QoS。
(4)IPv4到IPv6的协议转换,当处在两个异种网络(IPv4/IPv6)边缘的时候,Media Proxy还可以提供这两种IP协议的转换。Media Proxy由于其所处的特殊位置成为部署IPv4/IPv6协议转换的理想设备。
5、rport机制
获得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机制需要终端支持该种机制,因此应用情况比较受限。
–实例
下面举一个发送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