网络安全协议IPSec(IP Security)和网络地址转换NAT(Network Address Translation)已经得到了广泛的应用,但是如果一起运行的话,会遇到很多问题。
1 引 言
从IP的角度来看,NAT对IP的低层进行了修改,对IP协议来说是一种背离;而从应用的角度来看,网络管理人员必须要处理网络地址的问题,NAT使用户可以采取多种方式把自己的网络和主机对外部公共网络隐藏起来,是一种好的工具,现在,无论是大企业还是中小企业都在使用。与NAT、类似,IPSec:也是一种好工具,他使用户可以安全地通过Internet连接到远程终端。然而,由于IPSec协议架构本身以及缺乏支持IPSec的NAT设备,当IPSec和NAT在一起运行时就会出现很多问题。要解决两者共存的问题,就必须对IPSec和NAT有一定的了解。
2 IPSec和NAT的工作原理
2.1 NAT技术简介
NAT(Network Address Translation,网络地址转换)实现的核心是把内部子网中的数据报文的保留IP地址报头信息转换为外部合法的IP地址再向外部网络发送,在收到外部数据报文后,根据NAT设备维护的地址映射表用内部保留地址反向替换外部合法IP地址,使得内部子网中机器能收到数据报文信息。
NAT有3种类型:静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)。但不管如何,NAT协议都会分析IP数据报的报头,匹配地址转换表中的规则,修改满足匹配规则的IP数据报报头。并根据协议的需要重新计算IP数据报的校验和。例如:对TCP包,由于存在TCP报头伪头,其内包含相应的地址信息,NAT还必须修改TCP报头并重新计算其校验和。
2.2 IPSec协议
IPSec:协议不是一个单独的协议,他给出了应用于IP层上网络数据安全的一整套体系结构,包括网络认证协议Authentication Header(AH)、封装安全载荷协议Encapsulating Security Payload(ESP)、密钥管理协议Internet KeyExchange(IKE)和用于网络认证及加密的一些算法等。
其中AH协议定义了认证的应用方法,提供数据源认证和完整性保证;ESP协议定义了加密和可选认证的应用方法,提供可靠性保证。AH和ESP可以单独使用,也可以同时使用。IPSec模式有两种,分别是传输模式和隧道模式,图1是用ESP在两种不同的模式下对IP数据报进行封装。
3 IPSec与NAT的兼容性问题
NAT与IPSec的兼容性问题主要有以下几个方面:
(1)IPSec的AH与NAT。
AH封装对IP包的完整性保护包括了最外层IP头中的IP地址域。而NAT需要修改IP地址域以进行地址转换,这样就会导致AH包无效。由于ESP封装并不对最外层IP头进行加密,完整性计算也不包括最外层IP头中的域,因此,这种修改并不会影响ESP封装。
(2)校验和与NAT。
在传输模式中,如果IP包中封装的上一层协议(传输层)是TCP或者UDP,在这些协议的协议头中都有一个校验和字段,他和IP头中的IP地址有关。在NAT的处理中,当NAT更改了IP头中的源地址或者目的地址后,会重新计算并修改传输层的校验和字段。这样NAT如果按普通的处理更改该字段,这个IP包就会被对方的IPSec丢弃。如果不修改该字段的值,在接收端,虽然IPSec不会丢弃这个包,但传输层在进行校验和校验时会出错,这个报文还是会被传输层丢弃。对于隧道模式,不存在这个问题。
(3)IPSec:
与NAPT(NAT端口映射)。NAPT需要更改传输层的端口号。如果一个IP包受到了IPSec的保护,传输层的端口号一定会受到完整性保护,在NAPT对端口号进行修改后,该IP包就会被接收方的IPSec丢弃。
(4)IKE协商时的固定目标端口和NAPT。
NAPT的工作原理是通过不同的端口号来区分不同的连接。IKE协商时,进行的UDP通信的端口号一般是固定的(通常是500),这时就会出现问题。
(5)在隧道模式的ESP情况下,TCP/UDP报头是不可见的,因此不能被用于进行内外地址的转换,而此时静态NAT和ESF IPSec可以一起工作,因为只有IP地址要进行转换,对高层协议没有影响。
4.IPSec穿越NAT的解决方案
在IPSec:中,SA的管理可通过IKE自动协商来完成。需要IKE协商和UDP封装两种方法配合起来使用,以完成IPSec穿越NAT。
4.1 IKE协商
4.1.1阶段一
(1)探测是否支持IPSec-_NAT穿越
在IKE的第一阶段协商(主模式)中的前两条消息中应加入一个Vendor ID载荷,通过Vendor ID载荷交换来确定远程主机是否支持NAT穿越。
(2)探测在通信路径中是否存在NAT
NAT-D(NAT Discovery)载荷不仅用于探测两个IKE实体之间是否存在NAT,也用于探测NAT所处的位置。所以需要在第三与第四个IKE协商消息中各包含2个NAT-D载荷,第一个NAT-D载荷包含远端主机的地址与端口的散列值,第二个NAT-D载荷包含本地主机的地址与端口的散列值。
为了探测出两台主机之间的NAT,需要检查IP地址和端口是否沿着传输路径发生改变。协商双方只需各自向对端发送源方和目的方的IP地址与端口的散列值,就可以检测地址和端口在传输过程中是否发生改变。如果协商双方计算出的散列值与其收到的散列值相同,则表示他们之间没有NAT。反之,则是在传输中对地址或端口进行了转换,说明所通过的IPSec:报文进行了NAT穿越的处理。
4.1.2 阶段二
(1)协商是否使用NAT穿越(在SA载荷中协商)
在快速模式中进行IPSec SA的协商,确定是否采用UDP封装的方式,为此在原来的传输模式和隧道模式的基础上,添加了两种另外的模式:UDP封装隧道模式和UDP封装传输模式。
(2)IPSec SA协商成功后,就可以利用协商好的安全参数,采用所选择的UDP封装模式,发送ESP保护的数据包,成功地穿越NAT设备,进行通信。
4.2 UDP封装
ESP协议对数据包的上层(TCP/UDP)数据封装后,上层数据被加密保护,这样NAT无法获取正确的端口信息,从而使得转换发生失败。
用IPv4协议中标准UDP协议头封装IPSec:数据包,构成一个UDP隧道,通信路径上的设备看到的是UDP数据包。其端口值对NAT可见,就可以进行正确的转换。因此,在这种方式下,不需要改变网络的基础设施,
只需在IPSec网关或实现有IPSec:的主机上进行IPSec和NAT协同工作处理。图2和图3是两种传输模式下UDP对。ESP包的封装。
由于UDP封装的ESP包使用了IKE协商端口500,因此必须对IKE协商包的格式进行修改以区别这两种不同的包。具体的做法是在IKE数据包中的UDP头和IKE头之间添加4 B的Non-ESP标志。其值设为全O,而在ESP头中的前4 B是SPI字段,在实现过程中该字段不为0。这样就能有效的区分UDP封装的ESP包和IKE协商包了。
NAT将一个私有IP地址映射为一个公有IP地址(或者还有端口)的时间是有限度的,要是在这个限度内没有被使用,就会被释放掉,这样就删除该IPSec SA。表示对等方NAT穿越的映射关系已经被删除。这样会使后续的IPSec通信中断。所以专门设计了一个UDP的Keepalive数据包,定时发送,保证NAT设备中的映射关系不被释放。接收方接收到Keepalive数据包后,不对Keepalive数据包进行处理,而是直接将其丢弃。这样做的目的是NAT中的映射关系在IPSec通信的过程中不会被过早地释放掉。
图4是UDP封装的IPSec的处理流程。
5 结 语
NAT技术和IPSec:技术在目前都得到了较为广泛的应用。NAT的核心是修改IP头中的IP地址。而IPSec却要保护IP包,因此同时使用这两种技术会出现很多问题,解决他们之间的不兼容问题变得非常迫切。本文介绍的UDP封装方法无需修改NAT网关和路由器,比较简单地解决了IPSec的NAT穿越,具有一定的现实意义。