1 NAT和防火墙的功能
1.1 NAT
按照NAT的定义,内部本地地址表示分配给内部网络中的计算机的IP地址;内部合法地址表示对外进行IP通信时,代表一个或多个内部本地地址的合法IP地址。
NAT的地址转换方式如下:
(1)静态地址转换
静态地址转换将内部本地址与内部合法地址进行一对一的转换,且需要指定和哪个合法地址进行转换。如果内部网络有E-mail服务器或文件传输协议 (FTP)服务器等,可以为外部用户提供公用的服务。通过发送数据包到内部主机的映射地址,任何外部主机可以发送数据包到内部主机。
(2)动态地址转换
动态地址转换也是将内部本地地址与内部合法地址一对一的转换,但是从内部合法地址池中动态地选择一个未使用的地址对内部本地地址进行转换。只有当内部主机曾经发送了数据包到外部主机时,外部主机才可以发送数据包到内部主机。
(3)复用动态地址转换
复用动态地址转换首先是一种动态地址转换,但是它可以允许多个内部本地地址共用一个内部合法地址。对只申请到少量IP地址却经常有多个用户同时上外部网络 的情况,这种转换极为有用。只有内部主机发送数据包到具有IP地址和端口的外部主机上,外部主机才能发送数据包到内部主机。
(4)对称地址转换
对称地址转换是指从内部主机的同样的内部本地地址和端口发送的数据包到外部一个指定的IP地址和端口,将会映射到同样的内部合法地址和端口。如果同样的内 网主机内部本地地址和端口发送到不同的目的地址,NAT就会使用不同的内部合法地址,而且只有收到数据包的外网主机才能发送数据报协议(UDP)数据包到 内网主机。
1.2 防火墙
为了网络的安全性,企业内部网一般都安装了防火墙,它是一个放置于私有网内的设备,用来保护网络资源免受外部的恶意破坏。
防火墙检查从外部进来的每个数据包的IP地址和目的端口号,它经常如此设置:如果防火墙内的一台计算机A向防火墙外的一台计算机B主动发出请求要数据,防 火墙会让外部计算机B的数据包通过,而且数据包的目的地址和端口号必须与防火墙内发起请求的计算机A的地址和端口号相同;如果计算机B发来的数据包仅仅目 的地址是防火墙内发起请求的计算机A的地址,而端口号不是计算机A发出请求的那个端口号,防火墙将会丢弃那个外来的数据包。
防火墙总是被配置过滤掉所有不请自到的网络通信,有一个例外是在防火墙内提供Web服务器供外部访问。在这种情况下,企业内部网会配置防火墙允许目的地址 是Web服务器的IP地址且目的端口号为80的数据包通过,这就使得企业外部用户可以主动向企业的Web服务器发起请求得到一些企业放在服务器上的数据。
2 H.323穿越NAT/防火墙遇到的问题
2.1 H.323协议不能穿越NAT[1]
局域网内的终端之间进行呼叫和通信时不会有任何问题,但这些终端与外网终端进行H.323通信时就会有问题产生,原因是局域网中的IP地址是私有的,在 Internet中是不可路由的。当局域网内的终端呼叫外部终端时可以建立连接,但局域网内的终端不能收到网外终端发送的语音和视频数据包;局域网内的终 端也不能收到网外终端的呼叫。
2.2 H.323协议不能穿越防火墙[2]
H.323协议要求终端之间彼此使用IP地址和端口建立数据信道,由于防火墙通常被设置成限制未经请求的外部数据包进入,因此防火墙内部的终端不能接收外 部的呼叫,即使防火墙打开一个端口接收呼叫的初始数据包,H.323协议还要求动态分配一些端口用来接收呼叫控制信息和建立语音、视频数据通道,因此除非 打开防火墙的所有端口,才可以进行H.323通信,而防火墙也就失去了意义。
3 H.323协议穿越NAT的方案
针对H.323协议的特点和NAT/防火墙的特性,人们提出了不同的解决方案,归纳起来主要有H.323代理、应用网关、MIDCOM几种方式。
3.1 H.323代理方式
如图1所示,这种解决方案的典型应用是在防火墙后放一个H.323代理,代理需要被分配公有IP地址。防火墙被配置允许代理和外部进行多媒体通信。
从使用者的角度看,H.323代理服务器对用户、设备和网络是透明的。
H.323代理是一个基于H.323协议的代理服务器,可以实现对H.323实体(MCU/终端)和媒体的代理功能。
H.323代理对外的接口都采用标准的H.323协议。H.323代理接口如图2所示。
3.2 应用层网关方式
应用层网关(ALG)是被设计能识别指定IP协议(如H.323)的NAT设备或者防火墙。它不是简单地察看包头信息来决定数据包是否可以通过,而是更深 层地分析数据包负载内的数据,也就是应用层的数据。H.323协议在负载中放入了重要的控制信息,例如语音和视频终端使用哪一个数据端口来接收别的终端的 语音和视频数据。通过分析哪一个端口需要打开,NAT设备/防火墙动态地打开那些被应用的端口,而所有别的端口依然安全地保持关闭状态。
如果一个NAT被应用来屏蔽内部IP地址,这时ALG就需要一个代理,一些防火墙生产厂商把代理结合到ALG上越过NAT。
主要的路由器、防火墙厂商像Cisco、Checkpoint都对他们的NAT设备/防火墙产品提供H.323 ALG升级功能,但市场上很多防火墙还不支持ALG。
这种解决方案有如下缺点:
(1)由于要分析数据包负载,加重了NAT/防火墙的处理任务,影响网络的运行,形成潜在的网络“瓶颈”。
(2)当配置多级NAT设备/防火墙时,在呼叫路径上的每个NAT/防火墙都必须被升级来支持ALG功能。
3.3 MIDCOM方式
IETF RFC3303描述了中间盒通信(MIDCOM)协议,其主要思想是引入逻辑功能实体MIDCOM代理,并通过MIDCOM协议对Middlebox进行 控制。其中,MIDCOM代理识别和解析与应用相关的协议(如H.323),并根据协议数据的内容,利用MIDCOM协议与Middlebox进行通信。 Middlebox与MIDCOM代理之间通信的唯一接口是MIDCOM协议,因此应用协议对Middlebox而言是透明的。采用MIDCOM协议构架 的下一代网络(NGN)结构如图3所示。
H.323的信令消息的协议数据单元(PDU)中包含了与传输地址相关信息,这些地址可能外部的网络实体不能够访问到。如果不对H.323消息的载荷中的传输地址信息进行相应的更新,那么H.323网络中的H.245信令流和RTP媒体流不能穿越NAT/防火墙。
采用MIDCOM方式的实现原理是在网络中引入MIDCOM代理功能实体,检测和解析与应用相关的
H.323协议,当需要建立内部 网络与外部网络的传输地址映射关系时,MIDCOM代理向NAT/防火墙发MIDCOM请求消息,NAT设备/防火墙分配一个或者多个外部网络可以访问的 传输地址(IP地址和端口号),建立NAT映射关系,并向MIDCOM代理发出MIDCOM响应消息作为响应。MIDCOM代理根据响应消息的内容,对 H.323消息的载荷中的传输地址信息进行相应的更新。通过这种方式,保证H.323信令流能顺利穿越。由于MIDCOM代理解析了H.323信令流中的 媒体流的传输地址信息并请求NAT/MIDCOM建立内外部网络传输地址的映射关系,所以通信双方发出的媒体流信息也可以顺利地穿越NAT/防火墙。呼叫 释放时,MIDCOM代理利用MIDCOM消息指示NAT/防火墙释放相关的传输地址映射关系。
3.4 隧道方式
隧道方式的H.323穿越如图4所示,隧道穿透解决方案由两个组件构成,服务器软件和客户机软件。客户机放在防火墙后的私有网中,它同时具有网守功能和代 理功能,私有网内的终端注册到客户机上,它和防火墙外的服务器创建一个信令和控制通道,可以把所有的注册和呼叫控制信令转发到服务器,也把音、视频数据转 发到服务器。在转发时它将内部终端发送的和外部发往终端的数据包的地址和端口号替换为自己的地址和端口号。服务器放在防火墙外的公众空间,可以位于服务提 供商网络或者位于企业网的非保护区域(DMZ),服务器扮演网守的角色,从客户机收到的所有注册和呼叫信令都被服务器转发到中心网守。
当私网内客户机启动时,客户机与服务器上的侦听端口建立一个固定连接用来传送控制和状态信息,监听私网内H.323网守注册和请求信息。
当一个终端启动时,终端通过客户机/服务器之间的连接发送注册信息到中心网守,服务器分配给每一个注册的终端一个唯一的端口号(与服务器的IP地址对应)。
当一个终端呼叫防火墙外的另一个终端时,所有的数据包都通过客户机路由到服务器,返回的数据也从服务器通过客户机路由回到终端。当呼叫被建立后,客户机确保所有必需的经过防火墙的音、视频通道保持开放,这样音、视频数据可以通过这些防火墙上开放的通道进行传输。
使用这种方法IP地址信息可以被很好地屏蔽,因为所有的数据包通过服务器来转发,每个终端看起来好像直接在和服务器进行通信,而不是和别的终端,保证了终端的IP地址在网络外不可被得到。而且这种方法在大多数情况下不用对防火墙的配置进行修改。
3.5 扩展协议方式
扩展协议方式通过在公网上放置一个NATSWITCH设备,在GK上采用一定的策略,当有私有网络的端点参于呼叫时,把呼叫转接到NATSWITCH上, 通过NATSWITCH和NAT端点的消息交互,实现NATSWITCH和NAT后端点的互通,然后通过NATSWITCH实现私网和公网端点的互通。
NATSWITCH方式实现穿越优势如下:
(1)在私网内的终端没有进入呼叫状态时,只发送注册消息,不额外增加NAT设备的负担。
(2)NATSWITCH和公网的MCU/终端之间采用标准H.323协议。
(3)不修改网络结构,兼容各种NAT方式。
(4)仅在H.323协议上扩展,对系统改动小。
NATSWITCH接口如图5所示,NATSWITCH是一个基于H.323协议的代理服务器,通过添加扩展消息实现和NAT设备后的H.323实体互通,而它和公网的H.323实体的消息又是标准的H.323接口,具有兼容性。
3.6 STUN方式[3]
STUN是一个轻型协议,它可以使得应用程序发现它和公网之间的NAT类型。它也可以使得应用程序知道NAT为其分配的公网地址。
典型的STUN配置如图6所示。STUN客户端在私网1内,该网络通过NAT连接到私网2。私网2通过NAT连接到公网。STUN服务器被连接到公网。
STUN是一个简单的客户端/服务器协议。客户端发送一个请求到服务器侧,服务器返回一个响应。有两种类型的请求:绑定请求(基于UDP)、共享密码请求 (基于TCP)。共享密码请求用于请求服务器返回一个临时用户名和密码。用户名和密码绑定请求和响应,用于认证。绑定请求用于发现NAT分配的地址。客户 端发送一个UDP绑定请求到服务器,服务器检查请求的源IP地址和端口,然后复制到响应消息中返回给客户端。请求中有几个参数允许客户端请求响应消息发送 到其他地址,或者服务器从不同的地址和端口发送。
使用STUN协议主要是为了发现NAT,获得自身绑定的端口。
STUN客户端嵌入到应用程序中,获得一个公网的IP地址和端口来接收数据。例如,它需要获得一个地址和端口来接收RTP数据。当应用开始时,应用中的STUN客户端发送一个STUN共享密码请求给服务器,获得一个用户名和密码,然后发送一个绑定请求。
STUN绑定请求用来发现存在的NAT,发现NAT映射的公网地址和端口。
当客户端接收到STUN绑定应答时,比较数据包中的IP地址和端口,并和发送请求包的本地IP地址和端口进行比较。如果不匹配,说明STUN客户端在一个 或者多个NAT后。对于静态NAT,STUN应答中的地址和端口是公网的,公网上的主机可以发送数据包到发送STUN请求的应用程序。应用程序只需要侦听 发送请求的地址和端口,就会收到从公网主机向该公网地址和端口发送的数据包。
当然,主机可能不是在静态NAT后。事实上,应用程序本身不知道它自己位于哪种NAT后。为了判断NAT类型,客户端会发送其他的STUN绑定请求。客户 端发送第二个STUN绑定请求,请求会从同样的源地址和端口发往不同的IP地址,如果应答数据包中的IP地址和端口与第一次应答包中的地址和端口不同,客 户端就可以知道其位于对称NAT后。为了判断是否是在静态NAT后,客户端可以在STUN绑定请求中设置标志告诉STUN服务器从与接收数据包的IP地址 和端口不同的IP地址和端口发送应答包。换句话说,客户端在源地址和端口向目的地址发送STUN绑定请求,服务器使用地址和端口应答。如果客户端接收到了 该应答,那么它就是在静态NAT后。STUN也可以允许客户端请求服务器从接收请求的地址发送STUN应答,但端口是不同的,从而可以发现客户端是在动态 NAT还是在PAT后。STUN存在的问题如下:
(1)不能解决NAT穿越的所有问题。
(2)不能使TCP穿越NAT。由于H.323中包含了基于TCP的信令,因此H.323穿越不能通过STUN完全解决。
(3)能够使得UDP数据包穿越NAT,但是只支持NAT类型的子集,特别是STUN不支持对称类型的NAT穿越,而该类型在很多企业中的应用是很普遍的。
(4)STUN的发现过程基于NAT处理UDP的方式,可能对某些新型的NAT设备是不正确的。当STUN服务器不是位于一个公共的地址域时,STUN不能正常工作。
4 结束语
上述每种穿越由于有各自不同的特点和限制,适用的场合也不同:代理方式和其他系统之间的接口都是标准的,互通性好,但需要固定IP地址;应用层网关可以分 析应用层数据,过程对应用是透明的,但加重了NAT设备负担,同时如果多级NAT环境下需要NAT设备都支持应用协议;隧道方式穿越方式简单,可以利用 HTTP代理方式实现,对NAT/防火墙配置改动较小,但需要终端/MCU/GK的支持;协议扩展方式对网络环境没有要求,但需要终端和GK的支持; STUN方式由于自身协议的限制,不能完全解决H.323问题。