IPSec数据包在穿越NAT时会遇到一个很严重的问题,因为NAT机制会修改数据包的IP及TCP或UDP包头内容,而IPSec为了确保数据包的安全性,也会逐一检查每个IPSec的数据包,一旦数据包内容(包含包头)有任何变动,这些数据包就会被IPSec机制丢弃,所以IPSec数据包是无法穿越NAT的。但如果真是这样,那IPSec在使用上将受到严重限制,IPSec协议终于可以穿越NAT了,这项技术规范是在rfc3947中定义的,称为“NAT-Traversal”,简称为NAT-T。
从以上两个IPSec数据包的结构图,可以很清楚看到图16-77中在ESP及IP包头之间多了一个UDP包头,这是IPSec数据包可以穿越NAT的关键之处。当IPSec数据包有了这个UDP包头之后,IPSec数据包再穿越NAT主机时,NAT主机便可以修改IP包头及UDP包头的内容,但IPSec数据包的接收端并不会检查IP包头及UDP包头的内容,因而使得IPSec数据包可以正常穿越NAT主机。 那要如何在racoon下启用NAT-T的功能。以图16-78及配置文件为例,可以看到racoon的配置文件与以前的内容并无太大差异。主要差别在第5行到第16行及第20行,其中第9行及第10行的IP是L2TP服务器在因特网的公网IP,除此之外,其他设置步骤与之前的示例完全相同即可。
IPSec数据包在穿越NAT时会遇到一个很严重的问题,因为NAT机制会修改数据包的IP及TCP或UDP包头内容,而IPSec为了确保数据包的安全性,也会逐一检查每个IPSec的数据包,一旦数据包内容(包含包头)有任何变动,这些数据包就会被IPSec机制丢弃,所以IPSec数据包是无法穿越NAT的。但如果真是这样,那IPSec在使用上将受到严重限制,幸运的是在大家的努力下,IPSec协议终于可以穿越NAT了,这项技术规范是在rfc3947中定义的,称为“NAT-Traversal”,简称为NAT-T。那NAT-T到底是如何让IPSec数据包可以穿越NAT的呢
从以上两个IPSec数据包的结构图,我们可以很清楚看到图16-77中在ESP及IP包头之间多了一个UDP包头,这是IPSec数据包可以穿越NAT的关键之处。当IPSec数据包有了这个UDP包头之后,IPSec数据包再穿越NAT主机时,NAT主机便可以修改IP包头及UDP包头的内容,但IPSec数据包的接收端并不会检查IP包头及UDP包头的内容,因而使得IPSec数据包可以正常穿越NAT主机。 那我们要如何在racoon下启用NAT-T的功能呢?以图16-78及配置文件为例,可以看到racoon的配置文件与以前的内容并无太大差异。主要差别在第5行到第16行及第20行,其中第9行及第10行的IP是L2TP服务器在因特网的公网IP,除此之外,其他设置步骤与之前的示例完全相同。
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端口映射(将IKE和UDP封装的ESP通信映射到NAT内私有网络主机) 3.4 新的Vendor ID IKE载荷这个新的载荷包含一个众所周知的Hash值,表示这个IPsec端可以施行IPsec NAT-T。 3.5 新的NAT-Discovery(NAT-D)IKE载荷这个新的载荷包含一个hash值,它是对一个IP地址和端口号的散列。在主模式协商中,一个IPsec端包含两个NAT-D载荷——一个是目标地址与端口的,另一个是源地址和端口。接受方使用NAT-D载荷来分析是否有NAT翻译了地址和端口号,并且检查是哪个地址和端口被改变了,哪一端在NAT后面。 3.6 UDP封装的ESP传输模式和隧道模式使用新的封装模式这两种新的封装模式在快速模式中被指定,从而告诉IPsec端点应该使用UDP封装的ESP PDU。 3.7 新的NAT-Original Address(NAT-OA)IKE载荷这个新载荷包括原始的(未被转换的)IPsec端地址。对于UDP封装ESP的传输模式,每一个IPsec端在快速模式协商中发送NAT-OA IKE载荷。接受端将这个地址存储在SA的参数中。 4. IPsec NAT-T对IPsec在NAT上问题的解决 4.1 问题:NAT不能更新高层协议的校验和解决方法:通过在NAT-OA中发送原始地址,接受端就拥有了足够的信息来验证高层协议的校验和。 4.2 问题:NAT不能分发IPsec数据流解决方法:通过用UDP来封装ESP PDU,NAT可以使用UDP的端口来分发IPsec数据流
ipsec_vpn隧道穿越nat设备