在IPSecVPN部署中,如果发起者位于私网内部(如下图FWC),而它希望与FWA之间直接建立一条IPSec隧道,这种情况下NAT会对部署IPSecVPN网络造成障碍。 PC2发业务报文给PC1,IPSec先对IP包头或端口信息进行验证,报文到达NAT设备时,IP地址或端口号会被转换,报文到达FWA的时候,FWA进行IPSec数据包的验证,下面分别看一下IPSec使用AH和ESP两种安全协议时报文能否通过。AH协议:因为AH对数据进行完整性检查,会对包括IP地址在内的整个IP包进行Hash运算。而NAT改变IP地址,从而破坏AH的Hash值。因此AH报文无法通过NAT网关。ESP协议:ESP对数据进行完整性检查,不包括外部的IP头,IP地址转换不会破坏ESP的Hash值。但ESP报文中TCP的端口已经加密无法修改,那么NAT设备读不到端口号,不能进行正常的地址转换。 为了解决这个问题,必须在建立IPSec隧道的两个网关上同时开启NAT穿越功能(对应命令行nattraversal)。开启NAT穿越功能后,当需要穿越NAT设备时,ESP报文会被封装在一个UDP头中,源和目的端口号均是4500。有了这个UDP头就可以正常进行转换。 NAT设备对于私网用户来说是不可见的,这里就有个问题,网络设备怎么知道是否有NAT的存在,什么时候该添加UDP报头,什么时候不该添加? IPSec一般要先经过IKE协商,交互密钥之后才发送数据。NATT(NATTraversal)技术在IKE协商阶段通过某种机制来发现是否有NAT的存在。有NAT存在的时候添加UDP报头,没有NAT的时候就不添加。 下面分别介绍一下采用IKEv1和IKEv2时是如何进行NAT穿越。 IKEv1协商NAT穿越开启NAT穿越时,IKEv1协商第一阶段的前两个消息会发送标识NAT穿越(NATTraversal,简称NATT)能力的VendorID载荷(主模式和野蛮模式都是)。用于检查通信双方是否支持NATT。当双方都在各自的消息中包含了该载荷时,才会进行相关的NATT协商。 主模式消息3和消息4(野蛮模式消息2和消息3)中发送NATD(NATDiscovery)载荷。NATD载荷用于探测两个要建立IPSec隧道的网关之间是否存在NAT网关以及NAT网关的位置。 通过协商双方向对端发送源和目的的IP地址与端口的Hash值,就可以检测到地址和端口在传输过程中是否发生变化。若协商双方计算出来的Hash值与它收到的Hash值一样,则表示它们之间没有NAT。否则,则说明传输过程中对IP或端口进行了NAT转换。第一个NATD载荷为对端IP和端口的Hash值,第二个NATD载荷为本端IP和端口的Hash。 发现NAT网关后,后续ISAKMP消息(主模式从消息5、野蛮模式从消息3开始)的端口号转换为4500。ISAKMP报文标识了NonESPMarker。 在第二阶段会启用NAT穿越协商。在IKE中增加了两种IPSec报文封装模式:UDP封装隧道模式报文(UDPEncapsulatedTunnel)和UDP封装传输模式报文(UDPEncapsulatedTransport)。通过为ESP报文封装UDP头,当封装后的报文通过NAT设备时,NAT设备对该报文的外层IP头和增加的UDP头进行地址和端口号转换。UDP报文端口号修改为4500。 IKEv2协商NAT穿越开启NAT穿越后,IKE的发起者和响应者都在IKESAINIT消息对中包含类型为NATDETECTIONSOURCEIP和NATDETECTIONDESTINATIONIP的通知载荷。这两个通知载荷用于检测在将要建立IPSec隧道的两个网关之间是否存在NAT,哪个网关位于NAT之后。如果接收到的NATDETECTIONSOURCE通知载荷没有匹配数据包IP头中的源IP和端口的Hash值,则说明对端位于NAT网关后面。如果接收到的ATDETECTIONDESTINATIONIP通知载荷没有匹配数据包IP头中的目的IP和端口的Hash值,则意味着本端位于NAT网关之后。 检测到NAT网关后,从IKEAUTH消息对开始ISAKMP报文端口号改为4500。报文标识NonESPMarker。 IKEv2中也使用UDP封装ESP报文,当封装后的报文通过NAT设备时,NAT设备对该报文的外层IP头和增加的UDP头进行地址和端口号转换。UDP报文端口号修改为4500。