一、PSec穿越NAT存在的兼容性问题
IPSec作为一种重要的安全技术得到越来越广泛的应用,但客户网络边缘大量使用的NAT地址翻译操作可能影响到IPSec的正常操作。目前,NAT和IPSec之间存在的不兼容性问题可以分为以下三类:
1.NA(P)T固有的问题
这类不兼容问题是直接由NA(P)T与IPSec协议本身不兼容造成的,因此并不是所有的NA(P)T设备都存在。NA(P)T协议固有的不兼容性包括IPSec AH和NAT不兼容、NAT与校验和不兼容、IPSec SPI选择和NAT不兼容、IKE地址标识符和NAT不兼容、固定IKE目的端口和NAPT之间不兼容、重叠(Overlap)SPD条目和NAT间不兼容、嵌套IP地址和NAT不兼容以及NA(P)T隐含的方向性问题等。
2.NA(P)T实现方面的问题
这类不兼容问题虽然不是NA(P)T协议所固有的,但却在大量的NA(P)T实现中存在。它们不是NA(P)T协议的固有问题,因此原则上在以后的NA(P)T设计实现中可以避免其产生。但由于这些问题已经广泛存在,因此在NA(P)T穿越方案中必须予以考虑。NA(P)T实现方面带来的不兼容性包括不能处理非UDP/TCP通信流、NAT映射超时、不能处理输出和输入分片等。
3.辅助功能引入的问题
这类不兼容问题出现在那些拟解决IPSecNA(P)T穿越问题的NA(P)T设备中。在这些NAT设备中,由于设计部分穿越辅助功能而产生了新的不兼容性,造成更难于解决的问题。虽然不是所有的NA(P)T设备都提供这种所谓的辅助功能,但鉴于该类问题的普遍性,在NA(P)T穿越方案中也需要考虑这类问题。在IPSec和NAT的辅助功能之间存在的不兼容问题包括ISAKMP头部检查、对端口500的特殊处理及ISAKMP载荷检查等。
二、IPSec穿越NAT的兼容性要求
1.可部署性
IPSec-NAT兼容性解决方案必须比IPv6易于部署,还应满足只需修改主机,无需改变路由器的要求。为了在短时间内实现穿越方案的部署,必须要求兼容性解决方案能与现存的路由器和NA(P)T产品协同工作。
2.协议兼容性
IPSec-NAT穿越方案不解决某些协议与NAT的兼容性问题。这些协议是指用IPSec协议不能进行安全保护且无法穿越NA(P)T的协议。因此,即使有了IPSec-NAT穿越方案,ALG仍需要支持其它协议的穿越方案。
3.方向性
NA(P)T的方向性也是一种安全功能,所以IPSec穿越方案不应允许NA(P)T后面的主机接收来自任意IP地址随意发送的IPSec或IKE通信流。一旦双向IKE和IPSec通信已经建立,则地址转换的映射即告连接。
4.远程访问
IPSec的一个重要应用是远程访问公司的内部网络。NA(P)T穿越方案必须支持通过IPSec隧道模式或者L2TPoverIPSec的NAT穿越,故要求穿越方案必须考虑远程客户端与VPN网关之间存在多个NA(P)T的情况。
5.防火墙兼容性
目前,防火墙已经广为应用,IPSec-NAT兼容性方案必须能使防火墙管理员创建简单的静态访问规则,以决定是否允许IKE及IPSec-NAT的穿越。原则上,应该避免IKE或者IPSec目的端口的动态分配。
6.可扩展性
IPSec-NAT兼容性方案应具有良好的扩展性,可部署在大规模远程访问的环境中。在大量远程接入的环境下,不可能在同一时间段内只有一个主机使用同一个给定的地址进行通信。因此,在兼容性方案中,必须解决SPD条目重叠和接收包解复用的问题。
7.模式支持
IPSec-NAT方案必须支持IPSecESP模式的穿越。例如IPSec安全网关必须支持ESP隧道模式的NA(P)T穿越,IPSec主机必须支持IPSec传输模式的NA(P)T穿越。
AH的目的是保护IP头部中不变的区域(包括地址域),而NA(P)T必须转换地址,从而使AH完整性检验失效。因此,NA(P)T和AH从根本上就是不兼容的。在IPSec-NAT兼容性方案中,没有必要支持AH传输或隧道模式。
8.后向兼容和互操作性
IPSec-NAT兼容性方案中必须能与已有的IKE/IPSec实现互操作,与不经过NA(P)T的IKE/IPSec进行通信,即IPSec-NAT穿越方案必须能后向兼容RFC2401定义的IPSec和RFC2409定义的IKE。穿越方案应该能自动检测是否存在NAT,使通信双方只在必要时才使用NA(P)T穿越支持。兼容方案应能判断通信对方的IKE实现是否支持NA(P)T穿越,以协商双方可否只进行标准的IKE会话。也就是说,虽然IKE在发起协商时,目的端口只能使用500端口,但并没有对源端口提出特殊要求,因此UDP源端口可以使用500或非500的端口。
9.安全性
IPSec-NAT兼容性解决方案的引入不得对IKE或IPSec的安全带来影响。例如,一个可行的方案必须能证明,它没有引入新的拒绝服务攻击和欺骗攻击。IKE必须允许双向方式的密钥能够重生成。
三、IPSec穿越NAT的解决方法
在IPSec中,SA的管理既可手工进行,也可通过IKE自动协商来完成。如果采用IKE方式,需要IKE协商和UDP封装两种方法配合起来使用,以完成IPSec穿越NAT。
1.IKE协商
在阶段l协商中,需要针对NAT执行两种探测。一是探测是否支持NAT穿越,二是探测在通信路径中是否存在NAT。NAT可能会改变IKEUDP的源端口,因而接收方必须能处理源端口不是500的IKE报文。
(1)通过Vendor ID载荷交换来确定远程主机是否支持NAT穿越。如果协商双方支持NAT穿越,则协商双方在阶段1的前两条消息中应加入一个Vendor ID载荷,载荷的内容是对特定字串进行MD5运算得出的散列值。该字串需标明它所支持的NAT穿越方法应遵循的要求。
(2)NAT-D(NAT Discovery)载荷不仅用于探测两个IKE实体之间是否存在NAT,也用于探测NAT所处的位置。Keepalive消息能从位于NAT后面的实体发出。为了探测出两台主机之间的NAT,需要检查IP地址和端口是否沿着传输路径发生改变。协商双方只需各自向对端发送源方和目的方的IP地址与端口的散列值,就可以检测地址和端口在传输过程中是否发生改变。如果协商双方计算出的散列值与其收到的散列值相同,则表示它们之间没有NAT。反之,则是在传输中对地址或端口进行了转换,说明所通过的IPSec报文进行了NAT穿越的处理。如果发送者不能确定自己的IP地址(比如拥有多个网络接口,并且不能确定包路由选择到哪一个接口),它可以在报文中包含多个本地IP地址的散列值。在这种情况下,仅当所有的散列值均不匹配时,才表明NAT的存在。
对IPSec进行特殊处理的NAT设备可能会导致问题的发生。NAT后有多个客户端,即使某些NAT不改变500的源端口号,也能将IKE Cookie值映射到分解的通信流,而不必使用源端口。对IKE来说,很难发现NAT是否具有上述能力。对NAT的透明性而言,这些方法均存在弊端。最好的办法是使IKE通信流简单地离开500端口,以避免对任何IPSec-awareNAT进行特殊处理。
在阶段l完成后,协商双方都已明确,在它们之间是否存在NAT。至于是否使用NAT穿越,则由快速模式协商决定。NAT穿越的使用在快速模式的SA载荷中协商,协商双方可向对端传送IPSec报文的原始地址(传输模式情况下),从而使对端有可能在NAT转换之后,对TCP/IP进行校验和修正。为了执行增量TCP校验和修正,协商双方可能需要知道对端在构造报文时所使用的原始IP地址。对于发起方,其原始发起方地址定义为发起方的IP地址,而原始响应方地址定义为当前所知道的对端的IP地址。对于响应方,原始发起方地址定义为当前所知道的对端IP地址,原始响应方地址定义为响应方的IP地址。
2.UDP封装
(1)在进行UDP封装时,要进行一些辅助处理。当使用隧道模式传送报文时,内部IP头中会包含不适合当前网络的地址。以下说明将其转换成适合当前网络地址的处理方法。根据本地策略,必须完成下列任务之一:
?如果在策略中,已为对端的封装报文定义了一个有效的源IP地址空间,则应根据策略检查在内部报文中的IP源地址是否属于有效范围。
?如果已经为远程对端分配了一个地址,则应检查内部报文中的IP源地址是否与该地址一致。对报文执行NAT转换,使其适合在本地网络中传输。
(2)当使用传输模式传送报文时,如果在传输中IP头部发生变化,TCP或UDP头部将包含错误的校验和。根据本地策略必须完成以下任务之一:
?如果在ESP头部之后的协议头部是一个TCP/UDP头,并且已经获得对端的真实源/目的IP地址,则应增量计算TCP/UDP校验和,包括:
――从校验和中减去接收包的IP源地址;
――在校验和中增加通过IKE获得的真实的IP源地址(从NAT-OA中获得);
――从校验和中减去接收包的IP目的地址;
――在校验和中增加通过IKE获得的真实的IP目的地址(从NAT-OA中获得)。
如果接收到的地址和真实地址是相同的,则取消相关操作。
?如果在ESP头后面的协议头IPv4是TCP/UDP头,则应重新计算TCP/UDP头中的校验和字段。
?如果ESP头后面的协议头是UDP头,应将UDP头中的校验和字段置O。如果在ESP头后面的协议头是TCP头,并且存在一个选项,该选项用于指示协议栈,而不用检查TCP效验和,则可以使用该选项。仅在传输模式中,对报文进行了完整性保护时,才能使用这种方法。对隧道模式的TCP校验和必须进行验证。因为校验和由发送方产生并由接收方验证,该校验和是对整个IPSec处理的报文的完整性检验。
(3)在实现中,可以对被NAT破坏的包含协议进行修正。传输模式下,ESP封装的报文格式如图1,图2所示。传输模式下ESP封装的步骤为:
?普通的ESP封装处理。插入一个适当格式的UDP头部;编辑IP头中的总长域、协议域以及校验和字段,使之与所得报文相匹配。