在IPSec VPN部署中,如果发起者位于私网内部(如下图FW_C),而它希望与FW_A之间直接建立一条IPSec隧道,这种情况下NAT会对部署IPSec VPN网络造成障碍。
PC2发业务报文给PC1,IPSec先对IP包头或端口信息进行验证,报文到达NAT设备时,IP地址或端口号会被转换,报文到达FW_A的时候,FW_A进行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 穿越功能(对应命令行 nat traversal)。开启 NAT 穿越功能后,当需要穿越 NAT 设备时, ESP 报文会被封装在一个 UDP 头中,源和目的端口号均是 4500。有了这个 UDP 头就可以正常进行转换。
NAT设备对于私网用户来说是不可见的,这里就有个问题,网络设备怎么知道是否有NAT的存在,什么时候该添加UDP报头,什么时候不该添加?
IPSec一般要先经过IKE协商,交互密钥之后才发送数据。NAT-T(NAT Traversal)技术在IKE协商阶段通过某种机制来发现是否有NAT的存在。有NAT存在的时候添加UDP报头,没有NAT的时候就不添加。
下面分别介绍一下采用 IKEv1 和 IKEv2 时是如何进行 NAT 穿越。
IKEv1 协商 NAT 穿越
-
开启 NAT 穿越时, IKEv1 协商第一阶段的前两个消息会发送标识 NAT 穿越(NAT Traversal,简称 NAT-T)能力的 Vendor ID 载荷(主模式和野蛮模式都是)。用于检查通信双方是否支持 NAT-T。
当双方都在各自的消息中包含了该载荷时,才会进行相关的 NAT-T 协商。 -
主模式消息 3 和消息 4(野蛮模式消息 2 和消息 3)中发送 NAT-D(NAT Discovery)载荷。NAT-D 载荷用于探测两个要建立 IPSec 隧道的网关之间是否存在 NAT 网关以及 NAT网关的位置。
通过协商双方向对端发送源和目的的 IP 地址与端口的 Hash 值,就可以检测到地址和端口在传输过程中是否发生变化。若协商双方计算出来的 Hash 值与它收到的 Hash 值一样,则表示它们之间没有 NAT。否则,则说明传输过程中对 IP 或端口进行了 NAT 转换。第一个 NAT-D 载荷为对端 IP 和端口的 Hash 值,第二个 NAT-D 载荷为本端 IP 和端口的 Hash。
-
发现 NAT 网关后,后续 ISAKMP 消息(主模式从消息 5、野蛮模式从消息 3 开始)的端口号转换为 4500。ISAKMP 报文标识了“Non-ESP Marker”。
-
在第二阶段会启用 NAT 穿越协商。在 IKE 中增加了两种 IPSec 报文封装模式:UDP 封装 隧 道 模 式 报 文 ( UDP-Encapsulated-Tunnel ) 和 UDP 封 装 传 输 模 式 报 文(UDP-Encapsulated-Transport)。通过为 ESP 报文封装 UDP 头,当封装后的报文通过NAT 设备时, NAT 设备对该报文的外层 IP 头和增加的 UDP 头进行地址和端口号转换。UDP 报文端口号修改为 4500。
IKEv2 协商 NAT 穿越
-
开启 NAT 穿越后, IKE 的发起者和响应者都在 IKE_SA_INIT 消息对中包含类型为NAT_DETECTION_SOURCE_IP 和 NAT_DETECTION_DESTINATION_IP 的通知载荷。这两个通知载荷用于检测在将要建立 IPSec 隧道的两个网关之间是否存在 NAT,哪个网关位于 NAT 之后。如果接收到的 NAT_DETECTION_SOURCE 通知载荷没有匹配数据包 IP 头中的源 IP 和端口的 Hash 值,则说明对端位于 NAT 网关后面。如果接收到的AT_DETECTION_DESTINATION_IP 通知载荷没有匹配数据包 IP 头中的目的 IP 和端口的 Hash 值,则意味着本端位于 NAT 网关之后。
-
检测到 NAT 网关后,从 IKE_AUTH 消息对开始 ISAKMP 报文端口号改为 4500。报文标识“Non-ESP Marker”。
-
IKEv2 中也使用 UDP 封装 ESP 报文,当封装后的报文通过 NAT 设备时, NAT 设备对该报文的外层 IP 头和增加的 UDP 头进行地址和端口号转换。UDP 报文端口号修改为 4500。