控制面谈妥 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:
- IKE_SA_INIT 中交换 NAT 检测 Notify,发现地址/端口被改写。
- 后续 IKE 与 ESP 改走 UDP/4500(ESP-in-UDP)。
- UDP 载荷内是 ESP 包;对 NAT 设备表现为普通 UDP 流。
外层五元组变了,SPI 查找语义不变:解封装后仍用 SPI(+ 目的地址等)找 SA。Keepalive(RFC 3948 / IKE NAT keepalive)防止 NAT 映射超时。
WireGuard 用固定 listen port + endpoint 学习解决类似问题,没有「ESP 协议号 vs UDP 封装」分叉;IPsec 必须显式完成 NAT 检测与封装切换。
五、选择器与封装的咬合
出站路径(概念):
- 路由决定把包送向某出口;策略引擎用内层(或主机)五元组查 SPD。
- PROTECT → 找/建 SA → ESP 封装(隧道则加外层头)。
- 若该 SA 标记 UDP 封装,再套 UDP/4500。
入站路径:
- UDP/4500 或 ESP 进入 → 解 UDP(若有)→ 按 SPI 找 SA → 解密认证 → anti-replay。
- 得到内层包后,用 SPD 检查是否允许该 SA 保护该内层选择器。
- 再交路由/本地交付。
任一步选择器与 SA 绑定不一致,就会出现「外层 ESP 计数在涨,内网 ping 不通」或「明文泄漏」(策略 BYPASS 误配)。
六、本文边界
- 不展开 ESN(Extended Sequence Numbers)与硬件 offload 寄存器级细节。
- 不写 AH 头字段逐项手册。
- 不做未标注环境的加密吞吐排名。
下一篇把上述步骤映射到 Linux xfrm。
参考资料
规范
- RFC 4303, IP Encapsulating Security Payload (ESP).
- RFC 4302, IP Authentication Header(对照)。
- RFC 3948, UDP Encapsulation of IPsec ESP Packets.
站内
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【IPSec】架构:SPD、SAD 与「正确分层」
RFC 4301 把「要不要保护」与「用哪把密钥」拆成 SPD 与 SAD。本文钉住安全关联、选择器、传输/隧道模式,并与 WireGuard cryptokey routing 做公理对照——不复述选型口号。
【IPSec】Linux xfrm:从策略查找到加解密
把 RFC 4301 的 SPD/SAD 映射到 Linux 6.6 的 xfrm policy/state:查看出站 xfrm_lookup、入站策略检查与 ip xfrm 观测面,并给出本机 netns 下手工安装 ESP 的对照实验入口。
IPSec / IKEv2 深度系列:从正确分层到 Linux xfrm
作为 WireGuard 系列的对照续作:拆解 RFC 4301 的 SPD/SAD、IKEv2 握手与密钥树、ESP/NAT-T、Linux 6.6 xfrm 与 strongSwan 落盘,并以形式化分析与后量子混合 KE 收束选型边界。
【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 确认的差异。