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

💡 原文中文,约3800字,阅读约需9分钟。
📝

内容提要

本文介绍IPsec安全架构(RFC 4301),涵盖其保护对象、安全关联(SA)、SPD/SAD数据库、传输与隧道模式,并与WireGuard的cryptokey routing对比。文章指出IPsec分层表达力强但部署复杂,WireGuard简化设计但功能有限,并预告后续将深入IKEv2握手及Linux xfrm实现。

🔎

延伸解读

策略先于变换:IPsec 的核心设计

RFC 4301 强调策略先于变换,即先决定包是否受保护及如何保护,再查找具体 SA。这与 WireGuard 将公钥与 AllowedIPs 直接绑定形成对比。理解这一分层有助于排查问题:当 IKE 已建立但业务不通时,往往需要分别检查 SPD 和 SAD 是否同步,而非仅看 SA 状态。

SPD 与 SAD 的工程断层

管理员在 strongSwan 的 swanctl 中配置连接和流量选择器,而内核中对应的是 policy(SPD)和 state(SAD)。两套视图不同步时,会出现 IKE 已建立但业务不通的典型故障。排查时需沿 IKE → policy → state 三条链逐一核对,这是 IPsec 部署复杂性的主要来源。

传输模式与隧道模式的取舍

传输模式保留原 IP 头,仅加密载荷,MTU 更友好,但要求两端以主机身份直接对话;隧道模式封装整个 IP 包,适合网关到网关或远程接入。WireGuard 仅支持 L3 隧道语义,没有与传输模式同构的主路径,这是架构分叉而非功能缺失。

IPsec 与 WireGuard 的适用边界

Donenfeld 批评 IPsec 的工程可部署性,但 SPD/SAD 能表达更细粒度的策略。当合规要求 X.509、多厂商互通或按端口/子网精细分割策略时,IPsec 的分层表达力成为优势;而 WireGuard 的简化设计更适合快速部署和审计。选择取决于具体需求。

Q&A

IPsec 安全架构(RFC 4301)主要保护哪些方面?

IPsec 为选定的 IP 流量提供机密性、完整性、抗重放,以及在策略允许时提供有限的流量流机密性。

IPsec 中的安全关联(SA)是什么?为什么是单向的?

安全关联(SA)是 IPsec 中关于使用哪套算法和密钥保护哪些方向/选择器的约定。SA 是单向的,因此双向通信通常需要至少一对 SA(进/出)。

SPD 和 SAD 在 IPsec 中分别起什么作用?

SPD(安全策略数据库)决定一个包是否需要 IPsec 保护以及使用哪类保护,动作包括丢弃、绕过或保护。SAD(安全关联数据库)存储 SPI 对应的密钥和算法等运行时状态,用于数据面的快速查找。

IPsec 的传输模式和隧道模式有什么区别?

传输模式保护原 IP 包的载荷,原 IP 头大体保留,适用于主机到主机;隧道模式保护整个原 IP 包,外面再套新 IP 头,适用于网关到网关或远程接入。

IPsec 与 WireGuard 在身份和策略管理上有何不同?

IPsec 使用 IKE 身份(如证书、PSK)与 SA 分离,策略通过 SPD/TS 选择器表达,可多对多;WireGuard 使用 Curve25519 公钥作为身份,并通过 AllowedIPs 绑定公钥和地址,管理更简单。

为什么说 IPsec 分层表达力强但部署复杂?

IPsec 的分层(SPD/SAD、IKE、策略)能表达精细的策略,但部署时需要在 IKE、policy、state 三条链上排查问题,且管理员配置与内核视图可能不同步,导致故障难以定位。

🏷️

标签

➡️

继续阅读