在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。