本页目录
IPsec 与 IKEv2
最"企业级"的 VPN 协议——深度嵌入内核网络栈,支持硬件卸载,广泛用于站点互连。IKEv2 用两次 exchange 建立 SA,MOBIKE 支持连接迁移。复杂度高,错误配置常表现为静默失败而非显式报错。
概述
IPsec 是最"企业级"的 VPN 协议——深度嵌入内核网络栈,支持硬件卸载,广泛用于站点互连和远程接入。但复杂度也最高:IKEv2 协商需要完整的状态机,错误配置往往表现为静默失败。IKEv2(2014)大幅简化了 IKEv1 的协商过程(2 个 exchange 建立 SA),并原生支持 MOBIKE(连接迁移)。strongSwan 和 libreswan 是 Linux 上的主要实现。
IPsec 数据平面
ESP (IP protocol 50) 提供加密+完整性:
ESP Packet:
[SPI (4B)][Sequence Number (4B)]
[Encrypted: Payload + Padding + Pad Length + Next Header]
[ESP Auth (ICV, variable, 12B for GCM)]
SPI: Security Parameter Index — 查接收方 SA
Sequence Number: 单调递增 (防重放)
Next Header: 封装的协议 (4=IPv4-in-IP tunnel, 6=TCP transport mode)
两种操作模式:
Transport Mode:
[Original IP Header][ESP Header][TCP][Payload]
原始 IP header 保留 (修改 Protocol field = 50)
→ 用于主机到主机, 节省额外 IP header
Tunnel Mode:
[New IP Header][ESP Header][Original IP Header][TCP][Payload]
→ 用于网关到网关, 新 IP header 封装整个包
→ 原始包可以是 IPv4/IPv6 (IPsec 可以传输 IPv6 over IPv4)
IKEv2 控制平面
IKEv2 (Internet Key Exchange v2, RFC 7296) 比 IKEv1 简单: 两个 exchange 建立 IKE SA + 第一个 Child SA。
IKE_SA_INIT (1 RTT, 明文):
Initiator → Responder: SAi1, KEi, Ni
SAi1: 提议的加密算法 (ENCR, PRF, INTEG, DH group)
KEi: Diffie-Hellman public value
Ni: nonce
Responder → Initiator: SAr1, KEr, Nr, [CERTREQ]
SAr1: 选定的算法 (从提议中选择)
KEr: DH public value
Nr: nonce
双方各自: DH(KEi, KEr) → g^ir → SKEYSEED = prf(Ni | Nr, g^ir)
→ 派生: SK_d, SK_ai, SK_ar, SK_ei, SK_er, SK_pi, SK_pr
IKE_AUTH (1 RTT, 全部加密!):
Initiator → Responder: IDi, [CERT], [CERTREQ], AUTH, SAi2, TSi, TSr
IDi: 身份 (FQDN, email, IP, ...)
AUTH: 对 IKE_SA_INIT 消息的签名 (用证书私钥)
SAi2: 提议 Child SA
TSi/TSr: Traffic Selector (哪些流量走此 Child SA)
Responder → Initiator: IDr, [CERT], AUTH, SAr2, TSi, TSr
双向认证完成
CREATE_CHILD_SA (< 0.5 RTT):
用于: 创建更多 Child SA, 或 rekey 现有 SA (定期换 session key)
密钥派生
IKE SA:
SKEYSEED = prf(Ni | Nr, g^ir)
7 个密钥 = prf+(SKEYSEED, Ni | Nr | SPIi | SPIr)
SK_d: 用于派生 Child SA 密钥
SK_ai/ar: IKE_AUTH 消息的完整性密钥
SK_ei/er: IKE_AUTH 消息的加密密钥
SK_pi/pr: 生成 AUTH payload (签名)
Child SA (ESP):
KEYMAT = prf+(SK_d, Ni | Nr | [g^ir_new]) ← for PFS: 新 DH 可选
参考
- RFC: 7296 (IKEv2), 4303 (ESP), 4301 (IPsec Architecture)
- 实现: strongSwan (C), libreswan
- 工具:
ipsec status,swanctl --list-sas
Keywords: IPsec, ESP, IKEv2, IKE_SA_INIT, IKE_AUTH, CREATE_CHILD_SA, strongSwan, tunnel mode, transport mode