WireGuard 用一张 cryptokey routing 表把身份与地址绑死;设计哲学篇
说得很清楚——IPsec 的
SPD/SAD「正确分层」在教科书上站得住,在运维上常把正确部署变成多命名空间的拼图。本系列不反驳那条批评,而是把被批评的那套分层讲清楚:策略如何选包、SA
如何绑密钥、IKEv2 如何把 Child SA 装进 Linux
xfrm,以及证书合规与算法协商在什么前提下仍然值得付这份复杂度。
已有 VPN 技术工程对比 给出选型与最小 swanctl;本系列做机制与内核路径加深,不重复粘贴配置百科。
系列状态:正文 8 篇 + 索引(2026-07-21)。 规范锚定 RFC 4301 / 4303 / 7296 / 3948(PQ 扩展见 RFC 9370);内核锚定 Linux 6.6
net/xfrm/;用户态主线 strongSwan(与第 75 篇方言一致)。规划见 PLAN.md。
适合谁看
- 网络 / 安全工程师:要讲清 IPSec 相对 WireGuard 的边界,而不是只会贴配置。
- 内核 / 平台工程师:要顺着 SPD 查找读到 xfrm output/input。
- 读完 WireGuard 系列的读者:想理解「故意拒绝的那套分层」如何工作。
- 架构师:要在证书合规、互通、ZTNA 数据面之间做隧道选型。
这个领域最值得关注的 5 个问题
1. SPD/SAD 分层解决什么、制造什么调试地狱?
回答在:01(架构)、05(xfrm)
RFC 4301 把「要不要保护」与「用哪把密钥保护」拆开:SPD 按选择器做策略决定,SAD 用 SPI 等定位具体 SA。灵活互通的代价是:握手成功却 ping 不通时,必须同时核对 IKE、policy 方向与 state。
2. IKE_SA_INIT / IKE_AUTH 如何在 2 个交换内谈妥 IKE SA 与首个 Child SA?
回答在:02(握手)、03(密钥与 Child SA)
IKEv2(RFC 7296)用 IKE_SA_INIT 建立加密通道与 DH 材料,再用 IKE_AUTH 完成身份认证并携带首个 Child SA 的 SA 与 TS 载荷——四条消息、两个交换,不是 IKEv1 的多模式迷宫。
3. ESP、anti-replay、NAT-T 如何与流量选择器咬合?
回答在:04(ESP/NAT-T)、05(xfrm)
数据面几乎总是 ESP(AEAD 或加密+ICV);NAT 后 UDP/4500 封装改变外层五元组,但内层选择器与 SPI 查找语义不变。anti-replay 窗口挂在 SA 上,与策略表是不同故障面。
4.
strongSwan 如何把 swanctl 变成 ip xfrm 可见的
state/policy?
回答在:06(strongSwan)、07(运维)
charon 经 VICI 吃配置,经 netlink 向内核安装
xfrm policy/state。排障时
swanctl --list-sas 与
ip xfrm state/policy
必须对得上,否则就是用户态与内核脱节。
5. 证书合规、算法协商、后量子下何时仍选 IPSec?
回答在:08(深度)
Cremers(ESORICS 2011)指出会话密钥保密大体稳、认证属性有边界;RFC 9370 给出混合 KE 框架。需要 X.509 生命周期、广泛互通或监管认可栈时,IPSec 仍是默认答案——但要把协商面与扩展组合爆炸算进成本,并与 WireGuard 深度篇 对照。
篇目依赖关系与推荐阅读路径
flowchart TD
A["01 Architecture SPD/SAD"] --> B["02 IKEv2 Handshake"]
B --> C["03 Keys and Child SA"]
C --> D["04 ESP and NAT-T"]
D --> E["05 Linux xfrm"]
C --> F["06 strongSwan"]
E --> F
F --> G["07 Ops netns"]
E --> G
B --> H["08 Deep formal PQ"]
G --> H
W["wireguard series"] -.-> A
V["network/75 VPN"] -.-> G
只想理解「为何比 WireGuard 复杂」→ 3 篇
01 → 05 → 08(可选补读 WireGuard 哲学)
要读协议字段 → 4 篇
01 → 02 → 03 → 04
要落地部署与排障 → 3 篇
01 → 06 → 07(先扫 VPN 对比 IPSec 节)
完整路线 → 全部 8 篇
01 → 02 → 03 → 04 → 05 → 06 → 07 → 08,并对照 WireGuard 系列与第 75 篇
目录
第一部分:架构与协议
- 系列索引(本文)
- 架构:SPD、SAD
与「正确分层」
- 看点:RFC 4301 策略模型、SA 三维、transport/tunnel、相对 cryptokey routing 的公理对照。
- IKEv2
握手:IKE_SA_INIT 与 IKE_AUTH
- 看点:RFC 7296 两交换、载荷布局、PSK/证书 AUTH、Cookie 抗 DoS 边界。
- 密钥派生与
Child SA
- 看点:SKEYSEED / prf+ 密钥树、CREATE_CHILD_SA、TS 选择器与 rekey。
- ESP、AH 与
NAT-T
- 看点:ESP 头与 AEAD、AH 边缘化、UDP 封装、anti-replay 窗口。
第二部分:实现与运维
- Linux
xfrm:从策略查找到加解密
- 看点:Linux 6.6 policy/state、output/input
钩子、
ip xfrm观测面。
- 看点:Linux 6.6 policy/state、output/input
钩子、
- strongSwan:从
swanctl 到内核 SA
- 看点:charon、VICI、kernel-netlink、proposal 协商落点。
- 使用与运维:netns
实测与故障模式
- 看点:双 netns PSK 隧道实测、TS/policy 配错复现、排障命令台账。
第三部分:争论与边界
- 深度探讨:形式化证明、密码敏捷性与后量子
- 看点:Cremers 2011、RFC 9370 与 PQ 形式化、敏捷性 vs WireGuard、选型收束。
每篇一句话价值
| 篇 | 价值点 |
|---|---|
| 01 | 讲清 SPD/SAD 不是配置废话,而是与 cryptokey routing 对立的安全隧道公理。 |
| 02 | 把 IKEv2 四消息钉到可核对的交换与载荷语义。 |
| 03 | 用 prf+ 密钥树说明 Child SA 密钥从哪来、rekey 改什么。 |
| 04 | 把数据面收束到 ESP + NAT-T + anti-replay,而不是协议名词表。 |
| 05 | 用 Linux 6.6 路径把策略/状态映射到具体查找与钩子。 |
| 06 | 讲清用户态守护进程如何把配置变成内核 xfrm
对象。 |
| 07 | 用真实 netns 实验把「能握手不通」变成可复现现象。 |
| 08 | 把「企业默认选 IPSec」放进证明边界、敏捷性与 PQ 争议里检验。 |
与已有文章的关系
- 【网络工程】VPN 技术工程对比 —— 选型与最小配置。本系列默认读者已读或会回头对照。
- WireGuard 深度系列 —— 反分层对照轴;本系列 01/08 显式对话,不重写 Noise。
- 【网络工程】WireGuard 内部实现 —— WireGuard 单篇全景。
- 密钥派生函数 —— prf+ / HKDF 通识;本系列 03 钉 IKEv2 使用。
- MAC 与 HMAC —— EtM;本系列 04 钉 ESP 组合。
参考主来源(系列共用)
- RFC 4301, 4303, 7296, 3948, 9370。
- Cremers, C. Key Exchange in IPsec revisited. ESORICS 2011.
- Gazdag, S.-L., et al. A formal analysis of IKEv2’s post-quantum extension. 2021.
- Linux
net/xfrm/(本系列默认 Linux 6.6)。 - strongSwan 文档与 swanctl 配置模型。
- Donenfeld, J. A. WireGuard. NDSS 2017(对照,不替代本系列)。
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【IPSec】Linux xfrm:从策略查找到加解密
把 RFC 4301 的 SPD/SAD 映射到 Linux 6.6 的 xfrm policy/state:查看出站 xfrm_lookup、入站策略检查与 ip xfrm 观测面,并给出本机 netns 下手工安装 ESP 的对照实验入口。
【IPSec】架构:SPD、SAD 与「正确分层」
RFC 4301 把「要不要保护」与「用哪把密钥」拆成 SPD 与 SAD。本文钉住安全关联、选择器、传输/隧道模式,并与 WireGuard cryptokey routing 做公理对照——不复述选型口号。
【IPSec】strongSwan:从 swanctl 到内核 SA
拆解 strongSwan 的 charon、VICI/swanctl 与 kernel-netlink:配置里的 connections/children/proposals 如何变成 Linux xfrm 的 policy 与 state,并与 VPN 对比文中的站点示例对齐。
【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 确认的差异。