一、IPSec 是什么
IPsec(Internet Protocol Security)是一组在 IP 层提供机密性、完整性与身份验证的协议集合。它通过建立安全关联(Security Association, SA)并使用加密与/或认证来保护端点之间的 IP 流量。常见用途包括站点到站点 VPN(路由器/防火墙之间)和远程访问 VPN(客户端到网关)。
IP 层的安全框架,目标是给 IP 提供:
- 加密(Confidentiality)
- 完整性(Integrity)
- 身份认证(Authentication)
- 重放保护(Anti-replay)
它不是一个单独的协议,是一组协议与机制的组合。
IPsec 的核心由三类协议组成:
- AH(Authentication Header):只验证,不加密
- ESP(Encapsulating Security Payload):加密 + 验证
- IKE(Internet Key Exchange):协商密钥、算法、参数
现在实际工作中几乎全部使用 ESP + IKEv2。
二、IKE SA + IPsec SA
IKE SA = 控制平面的安全隧道
- 在 UDP/500(或 NAT-T 时 4500)
- 用来建立、重键、删除 Child SA(数据 SA)
- IKEv1(Phase 1)和 IKEv2(IKE_SA_INIT + IKE_AUTH)建立这个 SA
IPsec SA = 数据平面的安全隧道
- 承载真正的数据(ESP)
- 单向:一个方向一条 SA
- 在 SAD 中存放其 key、SPI、算法等
先建 IKE SA,再建 IPsec SA。 IKE SA用于协商一个加密隧道(部分加密), IPsec SA会真正开始传数据(完全加密)。可以理解为一个结构体,里面存储了必要的加密数据。
三、IPsec主要组成
SPD(Security Policy Database)
它是“要不要对某个流量套 IPsec”的决定器。
一条 SPD 项包括:
- 源/目的 IP
- 源/目的 port
- 协议(TCP/UDP/ICMP)
- 动作:
- bypass(直接放行)
- discard(拒绝)
- protect(需要 IPsec 保护) SPD 会触发 IKE 协商。
SAD(Security Association Database)
存放已建立的 SA,包括:
- SPI
- 加密算法(AES-CBC/GCM/…)
- 完整性算法(SHA-256/HMAC/…)
- 密钥
- 隧道或传输模式
- 重放窗口
- 生命周期(字节数、时间) 一旦 SAD 安装完,数据就由 ESP/AH 按规则处理。
PAD(Peer Authorization Database,IKEv2)
用于 IKEv2 验证对端身份与授权(证书/ID 匹配规则)。 (IKEv1 没有 PAD 的正式结构)
AH(几乎不用)
- 对整个 IP 包认证(包括 IP header)
- 不加密
- 会破坏 NAT(因为 NAT 修改 IP 会导致认证失败) 几乎只在军事设备中出现。
ESP(实际使用)
ESP 完成:
- 加密(AES-GCM/AES-CBC/…)
- 完整性认证(AES-GCM 内建 + HMAC-SHA)
- 重放保护(序列号 + 窗口)
- 隧道封装(Tunnel Mode)
ESP 报文结构
[ ESP Header: SPI + Seq ]
[ Encrypted Payload (IP or Transport layer) ]
[ Integrity Check Value ]
IKE(Internet Key Exchange)
IKE 负责:
- 协商算法(加密/验证/DH)
- 进行 Diffie–Hellman
- 身份认证(PSK/证书/EAP)
- 派生密钥(用于 IPsec SA)
- 管理 SA 生命周期、重键、删除
两个版本:
IKEv1
分两阶段:
Phase 1(建立 IKE SA)
- Main Mode(6 报文)
- Aggressive Mode(3 报文)
Phase 2(Quick Mode)
- 3 报文
- 建立 IPsec SA 缺点:
- 模式多、混乱
- NAT 支持弱
- 状态机不清晰
- 容易故障
IKEv2
流程极简:
- IKE_SA_INIT(交换 DH + Nonce + SA)
- IKE_AUTH(身份认证 + 建 Child SA)
- CREATE_CHILD_SA(重键或额外 Child SA)
- INFORMATIONAL(删除 SA、DPD 等) 优势:
- 重传机制干净可靠
- 内部支持 NAT、分片、移动性(MOBIKE)
- 消息格式更清晰
- DoS 防护更先进(COOKIE)
NAT-T(NAT Traversal)
在IKE SA的建立阶段,使用NAT-D(NAT-Discovery)探测双方是否存在nat。NAT-D里包含一个hash值```
HASH( IP地址 || UDP端口 || SPI-I || SPI-R )
计算两个hash:
- 本端地址/端口的 hash
- 对端地址/端口的 hash 双方比较时发现 hash 对不上 → NAT 存在。
一旦启用NAT-T,双方就会从UDP500改为使用UDP4500,包括后续的IPsec SA都会使用UDP4500。
四、Tunnel Mode vs Transport Mode
IPsec有两种模式
Transport Mode
- 只加密 L4 payload
- 外层 IP 不变 适合:
- Host-to-Host
- L2TP/IPsec(某些实现)
Tunnel Mode(最常用)
- 整个原始 IP 包被加密并封装在新的 IP header 中 适合:
- VPN
- 路由器互连、企业站点互连(Site-to-Site)
五、ESP完整性认证
ESP 使用 HMAC(或其它 AEAD 内建的 Integrity) 来保证:
- 报文内容是否被篡改
- 报文是否来自正确的对端(合法性)
ESP报文结构
ESP Header:
SPI 4 bytes
Sequence 4 bytes
Encrypted Payload:
IV
Encrypted Payload Data
Encrypted Padding
Encrypted Pad Length
Encrypted Next Header
Authentication Data:
HMAC (not included in hash input itself)
整个 ESP 报文(除了最后的 HMAC 字段本身)都被 HMAC 覆盖。
HMAC 的算法
常见算法:
- HMAC-SHA1-96(老旧)
- HMAC-SHA256-128(现代)
- AES-GMAC(如果使用 AES-GCM)
- AES-GCM 本身是 AEAD,加密 + 完整性一体
如果使用 GCM/CCM,ESP 不会再有 HMAC,而是:
ESP Header + Ciphertext + Auth Tag
Auth Tag 相当于 HMAC。
完整性认证的流程
发送端:
- 构建 ESP Header(SPI + Sequence)
- 加密 Payload(AES、3DES等)
- 用密钥计算 HMAC = HMAC(ESP header + ciphertext)
- 把 HMAC 追加到末尾 → Authentication Data
接收端:
- 用 SPI 查找正确的 SA(Security Association)
- 使用 SA 中的密钥计算 HMAC’
- 比较 HMAC’ 与 HMAC
- 不一致 ⇒ 报文丢弃(完整性失败) 完整性失败 ≠ 解密失败。完整性先检查,失败直接丢,不会尝试解密。
六、ESP重放保护
黑客抓到你一个 ESP 包,然后不停重发,让对端重复处理同一包。 IPsec 用 Sequence Number + 滑动窗口 来防止重放。
Sequence Number(发送序号)
- 每个 ESP SA 都有一个 32-bit 序号
- 每发一个 ESP 报文,序号自增 1,不允许回滚
- 用于检测重复报文 序号不能用完,否则必须重新协商 SA(否则溢出是安全隐患)。
滑动窗口机制(Replay Window)
接收端维持一个滑动窗口(典型大小:64 或 128) 窗口记录:
- 哪些序号已经收到
- 哪些还能接收
- 哪些必须拒绝
重放检查流程
发送端:
- 每次发送时序号+1
接收端做如下检查:
- 序号是否太小(窗口左侧)→ 直接丢弃(旧包)
- 序号是否落在窗口范围内并且已经收到过?→ 重放攻击,丢弃
- 序号比最大序号大?→ 向前移动窗口,接受
- 完整性验证成功 → 接受,失败 → 丢弃
七、IPsec工作流程
下面以「主机 A 要给主机 B 发送一个 IP 包」并需要建立 IPsec 隧道为例,说明典型流程。
- 检查策略(SPD)
发送端网络栈看到要发送的包,查 SPD:如果有匹配的 IPsec 策略(比如“到 B 的流量必须使用 ESP,隧道模式”),就进入 IPsec 路径;否则按正常 IP 路由发送。 - 查找现有 SA(SAD)
如果已有满足方向和对端的 SA(密钥、SPI 等),进入加密/封装步骤;若没有,则需要建立 SA。 - 建立 SA — IKE 协商(通常 UDP/500;在 NAT 情况下 UDP/4500)
- 发起方和接收方进行密钥交换(Diffie–Hellman)并协商加密、认证算法、密钥寿命等。
- 双方进行身份认证(预共享密钥 PSK、证书、公钥等)。
- IKEv1 分为 phase1(建立 IKE SA)和 phase2(建立 IPsec SA);IKEv2 把这些步骤合并得更清晰:建立 IKE SA,然后建立一个或多个 Child SA(用于实际的数据保护)。
- 成功后,在双方的 SAD 中分别安装双向的 IPsec SA(通常为一对 SPI,分别用于两个方向)。
- 对流量进行封装与加密(出站)
- 根据 SA 指定的模式和算法,把原始 IP 包封装。
- 若Tunnel 模式:原始 IP 包被加密后作为 ESP 负载,再加上 ESP header/trailer,然后外面套上新的外层 IP 头(目的为对端网关的 IP)。
- 若Transport 模式:保留原 IP 头,只加 ESP header/trailer(加密的是有效载荷部分)。
- 如果使用完整性认证,会计算并附加 ICV(Integrity Check Value)。
- 发送出网。
- 根据 SA 指定的模式和算法,把原始 IP 包封装。
- 接收端解包(入站)
- 接收端找到外层 IP header(若是隧道),根据 SPI 找到对应的 SA(在 SAD)。
- 验证完整性(ICV),解密载荷,检查序号以防重放(anti-replay)。
- 解出原始 IP 包并按通常路径交付到本地网络栈。
- 重协商与重键(Rekey)
SA 有生命周期(时间或流量限制),到期前双方用 IKE 进行重键以更新密钥,保证长期安全。