1. 背景 IETF的IP安全协议工作组(IP Security Protocol Working Group)标准化了一个叫做IPSec NAT Traversal(NAT-T)的新技术,并在RFC3947和RFC3948中进行了定义。IPSec NAT-T定义了在协商过程中的变化和各种不同的发送由IPSec保护的数据的方法。 在IPSec协商阶段,,可能实施IPsec NAT-T的对等端自动检查: • 是否IPSEC的发起端和响应端都能实施IPsec NAT-T • 在他们之间的路径中是否存在NAT 如果都是,对等端自动使用NAT-T在NAT上进行IPsec保护的通信。如果有一端不能支持IPsec NAT-T,则进行普通的IPsec协商。如果两端都支持IPsec NAT-T并且没有NAT在他们之间,那还是施行普通的IPsec保护。 Windows server 2003和Windows XP SP2支持IPsec NAT-T,Windows 2000和Windows XP(SP1或无SP)可以通过安装L2TP/IPsec NAT-T Update for Windows XP and Windows 2000来支持IPsec NAT-T,Windows 98/ME/NT4.0可以通过安装Microsoft L2TP/IPsec VPN Client来支持IPsec NAT-T。 IPsec NAT-T只为ESP通信定义。 2. 在NAT上使用IPsec的主要问题 2.1 NAT不能更新高层协议的校验和。 TCP与UDP的校验和会用到IP源和目的地址。ESP中对TCP与UDP的加密使得校验和不能在NAT过程中改变,从而在目的端出现问题 2.2 NAT不能分发IPsec数据流 ESP保护的IPsec通信没有一个可见的TCP或UDP头。所以,TCP或UDP端口号不能用来分配多重通信到NAT内部的私有网络主机上。ESP头内有个叫SPI(Security Parameters Index)的域。SPI和目标IP(在明文显示的IP头内)地址一起用来确定一个IPsec SA。 对于NAT来说,向内通信的IP地址必须被映射为一个NAT内的私有IP地址。如果NAT内部有多重的IPsec端,则向内的多重ESP数据流的目的地址是相同的。为了能区别它们,目标地址和SPI必须要么被追踪要么被映射到一个内部的IP地址和SPI对。 由于SPI是一个32位的数,不同的私有网络客户端使用相同的SPI的几率是很底的。问题就是很难将向外的SPI与向内的SPI对应起来。NAT不能影射SPI,因为ESP包含一个HASH认证码(HMAC)来确认ESP协议数据单元的完整性,在HMAC有效的情况下,SPI不能被改变。 2.3 IKE UDP端口号不能被改变有些IPsec的实现使用UDP 500端口作为源和目的端口。但是,对于NAT内部的一个IPsec端,NAT改变了IKE主模式包的源地址。根据实现,非500端口的IKE通信将被丢弃。 2.4 NAT的IKE UDP端口映射超时会出问题 NAT中UDP映射经常会很快被删除。发起者的IKE通信创建了一个UDP端口映射,这个映射将用于主模式和快速模式的IKE协商。但是,如果应答者在UDP端口映射已经不存在后才发送应答,应答将被NAT丢弃。 2.5 ID(Identification)载荷包含嵌入的IP地址对于主模式和快速模式的协商,每个IPsec端发送一个包含了发送端IP地址的ID载荷。由于发送端的源地址已经被NAT改变了,嵌入的地址与IKE包的源地址不匹配。一个验证ID载荷中的IP地址的IPsec端将丢弃这个包,并放弃IKE协商。 3. NAT-T对IPsec的修改 3.1 UDP封装ESP 在IP头和ESP头之间加入一个UDP头,封装ESP PDU(协议数据单元)。UDP封装的ESP通信使用与IKE相同的端口。 3.2 修改IKE头格式 IPsec NAT-T的IKE头包含一个新的Non-ESP标识域。这个标识域使得一个接受者能够区分UDP封装的ESP PDU和IKE信息。 3.3 新的NAT-Keepalive包一个使用与IKE相同的端口的UDP消息中包含一个字节(0xFF)来刷新NAT中的UDP端口映射