从第 5 个数据包开始,在 IPSec 协商的第 1 阶段切换端口 4500 上的流量有什么意义?由于 NAT 已在数据包 3 和 4 本身中检测到,我们不能简单地继续在端口 500 上并在 ESP 数据包中包含 udp 标头吗?
由于检测到了 NAT,我们可以继续使用端口 500,并在 ESP 数据包中包含 UDP 标头。这将允许中间 NATing 设备执行端口寻址转换而不会出现任何问题。
答案1
问题在于在同一个 UDP 端口上多路复用 IKE 和 ESP。为了区分这两种协议,必须以某种方式标记其中一种(否则必须采用一些可能容易出错的启发式方法)。
因此,继续使用 UDP 端口 500 意味着将 ESP 数据包标记为非 IKE 数据包,以便接收方能够正确决定是否将数据包作为 ESP 处理或将其交给 IKE 进程。前两稿的IPsec ESP 数据包的 UDP 封装(RFC 3948) 实际上就是这样定义的。在 IKE 数据包中存储发起方 IKE SPI 的位置,一个全零的八字节非 IKE 标记被定义为实际 ESP 数据包的前缀(在 UDP 报头和 ESP 报头之间)。
当然,这样做的问题是,ESP 数据包通常比 IKE 数据包多得多,并且对每个数据包施加 8 个字节的开销(除了 UDP 标头)并不理想。
另一种方法是标记 IKE 数据包,这就是版本 02草案的定义,并最终在射频功能函数库. 在 ESP 数据包中存储 SPI 的位置处,插入一个四个字节的全零非 ESP 标记,该标记被插入到 UDP 和 IKE 头之间。
但是,这意味着端口 500 不能用于此类数据包,因为所有 IKE 消息(甚至是第一个消息)都必须以这种方式标记,而这无法向后兼容不支持 NAT-Traversal 的 IKE/IPsec 实现。相反,UDP 封装的 ESP 和带有非 ESP 标记的 IKE 使用单独的端口。并且,为了在传输任何 UDP 封装的 ESP 数据包之前在 NAT 上创建映射(即,即使在发送任何出站流量之前也可以处理入站流量),只要 IKE 检测到存在 NAT,就会切换到端口 4500。