「IPSec/ESP」- NAT Traversal(NAT 穿越问题)

  CREATED BY JENKINSBOT

问题描述

在穿越时,AH 的行为

IPSec <---(AH)---> Router (with NAT) <------> Router

不管是隧道模式还是传输模式,最外层的 IP-ADDR 都会参与 AH 的校验,这样带来的问题便是:当 NAT Traversal 时,SRC-IP-ADDR 发生变化,而 Auththtication Data 还是原始 Header 的计算结果,当对端收到该数据包时,校验将失败。

所以,对于 AH 协议,不管是隧道模式还是传输模式,都无法进行 NAT Traversal 的;

在穿越时,ESP 的行为

IPSec <---(AH)---> Router (with NAT) <------> Router

鉴于 NAT Traversal 仅修改 IP-ADDR,而 ESP 不会对最外层 IP-ADDR 进行校验,所以 NAT 不会导致 ESP 校验失败;

但是,传输模式,会导致传输层 checksum 字段校验失败:
1)TCP.Checksum 的伪首部校验会包含 IP Header 的 SRC-IP-ADDR 与 DST-IP-ADDR)当 NAT 穿越时,NAT 修改其中的 Checksum 参数;
2)但是 ESP 将四层数据加密,导致 NAT 无法修改 Checksum,进而导致对端 TCP 校验失败;
3)相比隧道模式,隧道模式将原始的 IP Header 直接封装到 ESP 之中,即使经过 NAT 也不会修改原始地址,而原始校验和依旧有效;

所以,隧道模式 + ESP 能够进行 NAT 穿越

但是 ESP 对载荷加密而引发的问题:
1)ESP 会加密原始数据包传输层数据,进导致端口号不可见,且 ESP 为传输层协议,所以无法支持 NAPT 特性;
2)这样导致仅能使用一对一的 NAT 转换;

所以,为了解决该问题,提出 NAT Traversal 技术

解决方案

NAT Traversal,该技术将为 IP Header 与 ESP Header 间增加 UDP(Port 4500) Header 以允许使用 NAPT 特性;

原始报文:                         | IP Header | ESP | TCP | Payload |
穿越报文:            | IP Header | UDP | ESP | TCP | Payload |

推荐配置:Name 验证方式 + Pre-sharekey + 子策略/策略模板;

Q:当 NAT 存在时,IPSec 必须使用野蛮模式?
A:鉴于经过 NAT 而导致 IP-ADDR 是变化的,所以无法使用 IP-ADDR 来标识身份,而导致无法使用主模式(Main Mode 不支持以对等体 Name 的方式进行身份表示),只能使用野蛮模式。其实也能使用主模式,即使用经过 NAT 地址的地址作为身份表示,但是这将降低灵活性,所以很少使用该方式。

穿越的协商过程

第一阶段、穿越能力协商

在 IKE Phase 1 中,通过 Vender ID 来确定双方是否支持 NAT Traversal 特性;

第二阶段、检测 NAT 存在

在 IKE Phase 1 中,通过 NAT-D 载荷来检测是否存在 NAT 设备;

这两个 HASH 分别是(源地址:源端口)和(目的地址:目端口)的哈希值,如果接收到发现 HASH 不匹配,则认为存在 NAT 设备,并能通过与之不匹配的 HASH 值检测到 NAT 设备的位置。

第三阶段、检测端口可用性

在 IKE Phase 1 中,检测 UDP 4500 端口是否可用。

第四阶段、穿越启用协商

在 IKE Phase 2 的 SA 载荷中,协商是否使用 NAT Traversal 特性;

使用 UDP 封装 IPSec ESP 报文穿越 NAT(其实,第五个和第六个报文已经开始使用 UDP 封装)
后续,封装 ESP 报文端口号与 IKE 所用端口号一致,都为 4500 端口(为了区分两类报文:如果是 ESP 报文,SPI 不能为 0;如果为 IKE 报文,在 UDP 报文,存在 No ESP Mark 字段,全部为 0(四个字节););

参考文献

https://www.synopsys.com/dw/dwtb/ethernet_mac/ethernet_mac.html%20
networking – Router/NAT and IP/TCP header checksum – Super User