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

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

文章导航

分类入口
networksecurity
标签入口
#ipsec#ikev2#esp#xfrm#strongswan#spd#sad#vpn#rfc7296

目录

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

适合谁看

这个领域最值得关注的 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-sasip 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 篇

目录

第一部分:架构与协议

  1. 系列索引(本文)
  2. 架构:SPD、SAD 与「正确分层」
    • 看点:RFC 4301 策略模型、SA 三维、transport/tunnel、相对 cryptokey routing 的公理对照。
  3. IKEv2 握手:IKE_SA_INIT 与 IKE_AUTH
    • 看点:RFC 7296 两交换、载荷布局、PSK/证书 AUTH、Cookie 抗 DoS 边界。
  4. 密钥派生与 Child SA
    • 看点:SKEYSEED / prf+ 密钥树、CREATE_CHILD_SA、TS 选择器与 rekey。
  5. ESP、AH 与 NAT-T
    • 看点:ESP 头与 AEAD、AH 边缘化、UDP 封装、anti-replay 窗口。

第二部分:实现与运维

  1. Linux xfrm:从策略查找到加解密
    • 看点:Linux 6.6 policy/state、output/input 钩子、ip xfrm 观测面。
  2. strongSwan:从 swanctl 到内核 SA
    • 看点:charon、VICI、kernel-netlink、proposal 协商落点。
  3. 使用与运维:netns 实测与故障模式
    • 看点:双 netns PSK 隧道实测、TS/policy 配错复现、排障命令台账。

第三部分:争论与边界

  1. 深度探讨:形式化证明、密码敏捷性与后量子
    • 看点: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 争议里检验。

与已有文章的关系

参考主来源(系列共用)

同主题继续阅读

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

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】架构:SPD、SAD 与「正确分层」

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

2026-07-21 · network / security

【IPSec】strongSwan:从 swanctl 到内核 SA

拆解 strongSwan 的 charon、VICI/swanctl 与 kernel-netlink:配置里的 connections/children/proposals 如何变成 Linux xfrm 的 policy 与 state,并与 VPN 对比文中的站点示例对齐。

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 .