土法炼钢兴趣小组的算法知识备份

【IPSec】ESP、AH 与 NAT-T

文章导航

分类入口
networksecurity
标签入口
#esp#ah#rfc4303#nat-t#rfc3948#anti-replay#aead#tunnel-mode

目录

控制面谈妥 Child SA 之后,用户数据包走 ESP(RFC 4303)或极少见的 AH(RFC 4302)。本文钉数据面封装、完整性与加密的组合顺序、抗重放,以及 NAT 穿越(RFC 3948)对外层的改写。策略与 SA 概念见 架构篇;内核挂载点见 xfrm 篇

一、为什么现代部署几乎只用 ESP

协议 提供 现代地位
ESP 机密性(可选)、完整性、抗重放;隧道/传输模式 默认数据面
AH 完整性与抗重放;加密;校验覆盖可变 IP 头字段需特殊处理 边缘;NAT 不友好

AH 要认证部分 IP 头,与 NAT 改写地址/校验和冲突;ESP 把原包(隧道模式)或载荷(传输模式)放进可加密区域,外层 IP 头可被 NAT 改写。AEAD(如 AES-GCM)进一步把加密与完整性合成单一变换,减少「先加密后 HMAC」的算法拼装错误。站内 MAC 篇 对 Encrypt-then-MAC 的论述与经典 ESP(非 AEAD)一致:先密文再 ICV。

二、ESP 头与隧道模式

隧道模式下,网关发出的包形态可示意为:

外层 IP(网关 → 网关)
  ESP hdr: SPI | Sequence Number
  IV(若算法需要)
  加密覆盖: 内层 IP + 上层 + Padding + Pad Len + Next Header
  ICV / AEAD tag
字段 作用
SPI 接收方在 SAD 中定位 SA
Sequence Number 抗重放;每 SA 单向递增
IV 分组密码 / AEAD 所需随机或计数器材料
Padding / Next Header 对齐与指明内层协议(隧道模式常为 IPv4/IPv6)
ICV / tag 完整性;AEAD 时与密文耦合

传输模式不新建外层 IP,ESP 插在原 IP 头与上层协议之间;原 IP 头仍暴露源宿地址——威胁模型与隧道不同。

MTU:ESP 增加 SPI、序列号、IV、填充、ICV 与(隧道)外层 IP。站点互联必须处理 PMTU 或 MSS 钳制;VPN 对比文 给过数量级估计,具体字节数随算法与是否 NAT-T 变化,以实测 tcpdump/ip 为准。

三、Anti-replay

每个入站 SA 维护序列号窗口(RFC 4303 §3.4.3)。窗口外的重复或过旧包丢弃。窗口大小是实现/配置参数:过大占内存、过小在乱序严重路径上误杀。

故障表现:单向丢包、日志中 replay 计数上升。与「TS 配错」不同——replay 问题在 state 上,策略表可能完全正确。排障时同时看 ip xfrm state 的 replay 字段与 IKE 是否意外建立了多条重叠 SA(多 SPI 争用)。

四、NAT-T(RFC 3948)

当路径上有 NAT 时,ESP 的协议号 50 常被丢弃或无法做端口映射。NAT Traversal:

  1. IKE_SA_INIT 中交换 NAT 检测 Notify,发现地址/端口被改写。
  2. 后续 IKE 与 ESP 改走 UDP/4500(ESP-in-UDP)。
  3. UDP 载荷内是 ESP 包;对 NAT 设备表现为普通 UDP 流。

外层五元组变了,SPI 查找语义不变:解封装后仍用 SPI(+ 目的地址等)找 SA。Keepalive(RFC 3948 / IKE NAT keepalive)防止 NAT 映射超时。

WireGuard 用固定 listen port + endpoint 学习解决类似问题,没有「ESP 协议号 vs UDP 封装」分叉;IPsec 必须显式完成 NAT 检测与封装切换。

五、选择器与封装的咬合

出站路径(概念):

  1. 路由决定把包送向某出口;策略引擎用内层(或主机)五元组查 SPD。
  2. PROTECT → 找/建 SA → ESP 封装(隧道则加外层头)。
  3. 若该 SA 标记 UDP 封装,再套 UDP/4500。

入站路径:

  1. UDP/4500 或 ESP 进入 → 解 UDP(若有)→ 按 SPI 找 SA → 解密认证 → anti-replay。
  2. 得到内层包后,用 SPD 检查是否允许该 SA 保护该内层选择器。
  3. 再交路由/本地交付。

任一步选择器与 SA 绑定不一致,就会出现「外层 ESP 计数在涨,内网 ping 不通」或「明文泄漏」(策略 BYPASS 误配)。

六、本文边界

下一篇把上述步骤映射到 Linux xfrm

参考资料

规范

站内

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-07-21 · network / security

【IPSec】架构:SPD、SAD 与「正确分层」

RFC 4301 把「要不要保护」与「用哪把密钥」拆成 SPD 与 SAD。本文钉住安全关联、选择器、传输/隧道模式,并与 WireGuard cryptokey routing 做公理对照——不复述选型口号。

2026-07-21 · network / security

【IPSec】Linux xfrm:从策略查找到加解密

把 RFC 4301 的 SPD/SAD 映射到 Linux 6.6 的 xfrm policy/state:查看出站 xfrm_lookup、入站策略检查与 ip xfrm 观测面,并给出本机 netns 下手工安装 ESP 的对照实验入口。

2026-07-21 · network / security

IPSec / IKEv2 深度系列:从正确分层到 Linux xfrm

作为 WireGuard 系列的对照续作:拆解 RFC 4301 的 SPD/SAD、IKEv2 握手与密钥树、ESP/NAT-T、Linux 6.6 xfrm 与 strongSwan 落盘,并以形式化分析与后量子混合 KE 收束选型边界。

2026-07-21 · network / security

【IPSec】IKEv2 握手:IKE_SA_INIT 与 IKE_AUTH

RFC 7296 用两个交换、四条消息建立 IKE SA 并捎带首个 Child SA。本文按载荷语义拆开 IKE_SA_INIT / IKE_AUTH,说明 PSK 与证书 AUTH、Cookie 抗 DoS 边界,以及和 WireGuard 1.5 RTT 确认的差异。


By .