核心概述
IPsec (Internet Protocol Security) 是一套协议族,用于在 IP 层提供安全服务:
- 历史:1990年代 IETF 标准化,为 IPv6 设计,后移植到 IPv4
- 组成:AH(认证头)+ ESP(封装安全载荷)+ IKE(密钥交换)
- 特点:功能完备、兼容性强、配置复杂
- 代码量:约 400,000+ 行(内核 + 用户态)
1. IPsec 架构概述
1.1 协议族组成
┌─────────────────────────────────────────────────────────────────────────┐
│ IPsec 协议族架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 用户态 (User Space) │ │
│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │
│ │ │ IKE 守护进程 │ │ 证书管理 │ │ 策略配置 │ │ │
│ │ │ (strongSwan) │ │ (PKI) │ │ (ipsec.conf) │ │ │
│ │ │ (Libreswan) │ │ │ │ │ │ │
│ │ └───────┬───────┘ └───────────────┘ └───────────────┘ │ │
│ │ │ │ │
│ │ │ 密钥协商、证书验证 │ │
│ │ │ │ │
│ └──────────┼──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 内核态 (Kernel Space) │ │
│ │ │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ IPsec 协议实现 │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │ │
│ │ │ │ AH 协议 │ │ ESP 协议 │ │ 策略引擎 │ │ │ │
│ │ │ │ (认证头) │ │ (封装安全 │ │ (SPD/SAD) │ │ │ │
│ │ │ │ RFC 4302 │ │ 载荷) │ │ │ │ │ │
│ │ │ │ │ │ RFC 4303 │ │ │ │ │ │
│ │ │ └─────────────┘ └─────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 组件说明: │
│ ├─ AH (Authentication Header):只提供认证,不加密 │
│ ├─ ESP (Encapsulating Security Payload):认证 + 加密 │
│ ├─ IKE (Internet Key Exchange):密钥协商协议 │
│ ├─ SPD (Security Policy Database):安全策略数据库 │
│ └─ SAD (Security Association Database):安全关联数据库 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
1.2 核心概念
┌─────────────────────────────────────────────────────────────────────────┐
│ IPsec 核心概念 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Security Association (SA) - 安全关联 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ SA 是单向的连接状态,包含: │ │
│ │ ├─ SPI (Security Parameter Index):唯一标识符 │ │
│ │ ├─ 目的 IP 地址 │ │
│ │ ├─ 安全协议 (AH/ESP) │ │
│ │ ├─ 加密算法和密钥 │ │
│ │ ├─ 认证算法和密钥 │ │
│ │ ├─ 序列号计数器 │ │
│ │ └─ 生命周期 │ │
│ │ │ │
│ │ 双向通信需要两个 SA(每个方向一个) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 2. Security Policy (SP) - 安全策略 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 定义哪些流量需要 IPsec 保护: │ │
│ │ ├─ 选择器:源/目的 IP、端口、协议 │ │
│ │ ├─ 动作:apply(加密)、bypass(绕过)、discard(丢弃) │ │
│ │ └─ 指向的 SA │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 3. IKE SA vs IPsec SA │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ IKE SA(Phase 1): │ │
│ │ ├─ 保护 IKE 协议本身的通信 │ │
│ │ ├─ 用于协商 IPsec SA │ │
│ │ └─ 生命周期较长(数小时到数天) │ │
│ │ │ │
│ │ IPsec SA(Phase 2): │ │
│ │ ├─ 保护实际数据流量 │ │
│ │ ├─ 由 IKE SA 协商建立 │ │
│ │ └─ 生命周期较短(分钟到小时) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
2. IPsec 模式
2.1 传输模式 (Transport Mode)
┌─────────────────────────────────────────────────────────────────────────┐
│ 传输模式 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 特点: │
│ ├─ 只加密载荷,保留原始 IP 头 │
│ ├─ 端到端加密 │
│ ├─ 开销较小 │
│ └─ 无法穿越 NAT(IP 头不可变) │
│ │
│ 数据包结构: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 原始数据包: │ │
│ │ ┌─────────────┬─────────────┬─────────────────────────────┐ │ │
│ │ │ IP 头 │ TCP/UDP 头 │ 数据 │ │ │
│ │ │ (20 bytes) │ (20 bytes) │ (variable) │ │ │
│ │ └─────────────┴─────────────┴─────────────────────────────┘ │ │
│ │ │ │
│ │ AH 传输模式: │ │
│ │ ┌─────────────┬─────────┬─────────────┬─────────────────┐ │ │
│ │ │ IP 头 │ AH 头 │ TCP/UDP 头 │ 数据 │ │ │
│ │ │ (修改过) │ (12B) │ │ │ │ │
│ │ └─────────────┴─────────┴─────────────┴─────────────────┘ │ │
│ │ │ │
│ │ ESP 传输模式: │ │
│ │ ┌─────────────┬─────────┬─────────────┬───────────┬───────┐ │ │
│ │ │ IP 头 │ ESP 头 │ TCP/UDP 头 │ 数据 │ ESP尾 │ │ │
│ │ │ (20 bytes) │ (8 B) │ 加密 │ 加密 │ +ICV │ │ │
│ │ └─────────────┴─────────┴─────────────┴───────────┴───────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 适用场景: │
│ └─ 端到端加密(同一主机上的两个进程,或两个直接通信的主机) │
│ │
└─────────────────────────────────────────────────────────────────────────┘
2.2 隧道模式 (Tunnel Mode)
┌─────────────────────────────────────────────────────────────────────────┐
│ 隧道模式(最常用) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 特点: │
│ ├─ 加密整个原始 IP 包 │
│ ├─ 添加新的外层 IP 头 │
│ ├─ 站点到站点 VPN │
│ ├─ 可以穿越 NAT │
│ └─ 开销较大 │
│ │
│ 数据包结构: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 原始数据包: │ │
│ │ ┌─────────────┬─────────────┬─────────────────────────────┐ │ │
│ │ │ 内层 IP 头 │ TCP/UDP 头 │ 数据 │ │ │
│ │ │ 10.0.0.1 │ │ │ │ │
│ │ └─────────────┴─────────────┴─────────────────────────────┘ │ │
│ │ │ │
│ │ ESP 隧道模式: │ │
│ │ ┌─────────────┬─────────┬─────────────┬─────────────┬────────┐ │ │
│ │ │ 外层 IP 头 │ ESP 头 │ 内层 IP 头 │ TCP/UDP 头 │ 数据 │ │ │
│ │ │ 203.0.113.1 │ (8 B) │ 10.0.0.1 │ │ │ │ │
│ │ │ │ │ 加密 │ 加密 │ 加密 │ │ │
│ │ └─────────────┴─────────┴─────────────┴─────────────┴────────┘ │ │
│ │ ┌────────────────────────────────┬────┐ │ │
│ │ │ 加密部分 │ICV │ │ │
│ │ └────────────────────────────────┴────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 隧道示意图: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 内部网络 A 内部网络 B │ │
│ │ 10.0.0.0/24 10.0.1.0/24 │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌───────┐ │ │
│ │ │ Host A │──────▶VPN 网关A│══════▶VPN 网关B│──────▶│Host B │ │ │
│ │ │10.0.0.5 │ │203.0. │ IPsec│198.51. │ │10.0.1 │ │ │
│ │ │ │ │ 113.1 │ 隧道 │ 100.1 │ │ .5 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └───────┘ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌────────────────────────┐ │ │
│ │ │ 公网/不可信网络 │ │ │
│ │ └────────────────────────┘ │ │
│ │ │ │
│ │ Host A 看到:直接到 10.0.1.5 │ │
│ │ 公网看到:203.0.113.1 → 198.51.100.1 (加密数据) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
3. AH 与 ESP 协议
3.1 AH (Authentication Header)
┌─────────────────────────────────────────────────────────────────────────┐
│ AH 协议 (RFC 4302) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 功能:只提供认证,不提供加密 │
│ ├─ 完整性验证:确保数据未被篡改 │
│ ├─ 来源认证:验证发送者身份 │
│ └─ 防重放:序列号机制 │
│ │
│ AH 头格式: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 0 1 2 3 │ │
│ │ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Next Header | Payload Len | RESERVED │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Security Parameters Index (SPI) │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Sequence Number Field │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | │ │
│ │ │ Integrity Check Value │ │
│ │ │ (variable length) │ │
│ │ │ │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 认证范围(包括 IP 头中不可变字段): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 认证的 IP 头字段: │ │
│ │ ├─ 版本、头长度、总长度 │ │
│ │ ├─ 协议、源地址、目的地址 │ │
│ │ └─ 不包括:TTL、TOS、校验和(这些会变化) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 限制: │
│ ├─ 不加密数据(内容可见) │
│ ├─ 无法穿越 NAT(IP 头被认证,NAT 会修改 IP 头) │
│ └─ 现在很少单独使用 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
3.2 ESP (Encapsulating Security Payload)
┌─────────────────────────────────────────────────────────────────────────┐
│ ESP 协议 (RFC 4303) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 功能:认证 + 加密(最常用) │
│ ├─ 机密性:加密数据内容 │
│ ├─ 完整性:可选的认证 │
│ ├─ 来源认证:验证发送者 │
│ └─ 防重放:序列号机制 │
│ │
│ ESP 包格式: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 0 1 2 3 │ │
│ │ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Security Parameters Index (SPI) │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Sequence Number │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Initialization Vector (IV) │ │
│ │ | (variable length) │ │
│ │ +-+-+-+-+-+-+-+-+-────+-----------------+------------------------+│ │
│ │ | | Pad Len │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Next Header | │ │
│ │ +-+-+-+-+-+-+-+-+ │ │
│ │ | Payload Data (variable) │ │
│ │ | (encrypted) │ │
│ │ | │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Padding │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ | Integrity Check Value (ICV, optional) │ │
│ │ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+│ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 字段说明: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 字段 │ 大小 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ SPI │ 4 bytes │ 安全参数索引,标识 SA │ │
│ │ Sequence │ 4 bytes │ 序列号,防重放 │ │
│ │ IV │ 8-16 bytes │ 初始化向量,加密用 │ │
│ │ Payload Data │ variable │ 加密的数据 │ │
│ │ Padding │ 0-255 bytes │ 填充,对齐块大小 │ │
│ │ Pad Length │ 1 byte │ 填充长度 │ │
│ │ Next Header │ 1 byte │ 下一个协议类型 │ │
│ │ ICV │ 8-16 bytes │ 完整性校验值(可选) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ESP vs AH: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 功能 │ AH │ ESP │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 加密 │ ❌ │ ✅ │ │
│ │ 认证 │ ✅ │ ✅ (可选) │ │
│ │ NAT 穿透 │ ❌ │ ✅ │ │
│ │ IP 头认证 │ ✅ │ ❌ │ │
│ │ 使用频率 │ 低 │ 高 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
4. IKE 协议
4.1 IKE 概述
┌─────────────────────────────────────────────────────────────────────────┐
│ IKE 协议概述 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ IKE (Internet Key Exchange) 用于: │
│ ├─ 身份认证(双方互相验证) │
│ ├─ 协商加密算法和密钥 │
│ ├─ 建立 Security Association │
│ └─ 密钥轮换 │
│ │
│ IKE 版本: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 版本 │ RFC │ 特点 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ IKEv1 │ 2409 │ 复杂,6-9 条消息握手 │ │
│ │ IKEv2 │ 7296 │ 简化,4 条消息握手,推荐使用 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ IKE 协议栈: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ IKE 消息 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ IKE 载荷 (Payloads) │ │ │
│ │ │ SA, KE, Ni/Nr, IDi/IDr, AUTH, TS, CP, EAP... │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ UDP 500 / 4500 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ IP │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
4.2 IKEv2 握手流程
┌─────────────────────────────────────────────────────────────────────────┐
│ IKEv2 握手流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Initiator (发起方) Responder (响应方) │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ │ │ │ │
│ │ IKE SA Init │ │ │ │
│ │ ┌───────────────┐ │ │ │ │
│ │ │ HDR, SAi1, │ │ │ │ │
│ │ │ KEi, Ni │──┼────────────────▶│ │ │
│ │ └───────────────┘ │ Message 1 │ │ │
│ │ │ │ │ │
│ │ │ │ 计算 DH 共享密钥 │ │
│ │ │ │ │ │
│ │ │ ┌───────────────┐ │ │
│ │ │ │ HDR, SAr1, │ │ │
│ │ │◀─┤ KEr, Nr │ │ │
│ │ │ └───────────────┘ Message 2 │ │
│ │ │ │ │ │
│ │ 计算 DH 共享密钥 │ │ │ │
│ │ │ │ │ │
│ │ IKE AUTH │ │ │ │
│ │ ┌───────────────┐ │ │ │ │
│ │ │ HDR, SK {IDi, │ │ │ │ │
│ │ │ AUTH, SAi2, │──┼────────────────▶│ │ │
│ │ │ TSi, TSr} │ │ Message 3 │ │ │
│ │ └───────────────┘ │ (加密) │ │ │
│ │ │ │ │ │
│ │ │ │ 验证身份 │ │
│ │ │ │ 建立 IPsec SA │ │
│ │ │ │ │ │
│ │ │ ┌───────────────┐ │ │
│ │ │ │ HDR, SK {IDr,│ │ │
│ │ │◀─┤ AUTH, SAr2, │ │ │
│ │ │ │ TSi, TSr} │ │ │
│ │ │ └───────────────┘ Message 4 │ │
│ │ │ (加密) │ │ │
│ │ │ │ │ │
│ │ ======== IPsec SA 建立完成,开始加密通信 ======== │ │
│ │ │ │ │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
│ 消息说明: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 载荷 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ HDR │ IKE 头,包含 SPI 等 │ │
│ │ SAi/SAr │ Security Association 提议/响应 │ │
│ │ KEi/KEr │ Key Exchange,Diffie-Hellman 公钥 │ │
│ │ Ni/Nr │ Nonce,随机数 │ │
│ │ IDi/IDr │ Identity,身份标识 │ │
│ │ AUTH │ 认证数据(签名或 MAC) │ │
│ │ TSi/TSr │ Traffic Selector,流量选择器 │ │
│ │ SK {} │ 加密的载荷 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
4.3 认证方式
┌─────────────────────────────────────────────────────────────────────────┐
│ IKE 认证方式 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 预共享密钥 (Pre-Shared Key, PSK) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 优点: │ │
│ │ ├─ 配置简单 │ │
│ │ ├─ 不需要 PKI 基础设施 │ │
│ │ └─ 适合小型部署 │ │
│ │ │ │
│ │ 缺点: │ │
│ │ ├─ 扩展性差(每对peer需要一个密钥) │ │
│ │ ├─ 密钥管理困难 │ │
│ │ └─ 不适合大规模部署 │ │
│ │ │ │
│ │ 配置示例: │ │
│ │ /etc/ipsec.secrets: │ │
│ │ 203.0.113.1 198.51.100.1 : PSK "mysecretkey123" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 2. 证书 (Certificates / RSA) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 优点: │ │
│ │ ├─ 可扩展性好 │ │
│ │ ├─ 支持撤销(CRL/OCSP) │ │
│ │ ├─ 身份验证强 │ │
│ │ └─ 适合大规模部署 │ │
│ │ │ │
│ │ 缺点: │ │
│ │ ├─ 需要 PKI 基础设施 │ │
│ │ ├─ 证书管理复杂 │ │
│ │ └─ 配置较繁琐 │ │
│ │ │ │
│ │ 配置示例: │ │
│ │ leftcert=serverCert.pem │ │
│ │ rightcert=clientCert.pem │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 3. EAP (Extensible Authentication Protocol) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 支持的 EAP 方法: │ │
│ │ ├─ EAP-TLS(证书) │ │
│ │ ├─ EAP-TTLS(隧道 TLS) │ │
│ │ ├─ EAP-MSCHAPv2(用户名/密码) │ │
│ │ ├─ EAP-RADIUS(RADIUS 服务器) │ │
│ │ └─ EAP-SIM/EAP-AKA(移动网络) │ │
│ │ │ │
│ │ 优点: │ │
│ │ ├─ 灵活的认证方式 │ │
│ │ ├─ 可集成现有认证系统(AD、RADIUS) │ │
│ │ └─ 支持多因素认证 │ │
│ │ │ │
│ │ 适用场景: │ │
│ │ └─ 远程访问 VPN(企业用户) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
5. 加密算法
5.1 支持的加密算法
┌─────────────────────────────────────────────────────────────────────────┐
│ IPsec 加密算法 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 对称加密算法(用于 ESP 数据加密): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 算法 │ 密钥长度 │ 状态 │ 性能 │ 推荐 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ NULL │ 0 │ 已弃用 │ N/A │ ❌ │ │
│ │ DES │ 56 bits │ 已弃用 │ 慢 │ ❌ │ │
│ │ 3DES │ 168 bits │ 过时 │ 慢 │ ⚠️ │ │
│ │ AES-CBC │ 128/256 │ 活跃 │ 中 │ ✅ │ │
│ │ AES-CTR │ 128/256 │ 活跃 │ 快 │ ✅ │ │
│ │ AES-GCM │ 128/256 │ 活跃 │ 最快 │ ✅✅ │ │
│ │ ChaCha20- │ 256 bits │ 活跃 │ 快 │ ✅ │ │
│ │ Poly1305 │ │ │ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 认证算法(用于 AH 和 ESP 完整性): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 算法 │ 输出长度 │ 状态 │ 推荐 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ HMAC-MD5 │ 96 bits │ 已弃用 │ ❌ │ │
│ │ HMAC-SHA1 │ 96 bits │ 过时 │ ⚠️ │ │
│ │ HMAC-SHA256 │ 128 bits │ 活跃 │ ✅ │ │
│ │ HMAC-SHA384 │ 192 bits │ 活跃 │ ✅ │ │
│ │ HMAC-SHA512 │ 256 bits │ 活跃 │ ✅ │ │
│ │ AES-GMAC │ 128 bits │ 活跃 │ ✅ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ DH 组(密钥交换): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 组号 │ 名称 │ 密钥长度 │ 状态 │ 推荐 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ 1 │ MODP 768 │ 768 │ 已弃用 │ ❌ │ │
│ │ 2 │ MODP 1024 │ 1024 │ 已弃用 │ ❌ │ │
│ │ 5 │ MODP 1536 │ 1536 │ 过时 │ ❌ │ │
│ │ 14 │ MODP 2048 │ 2048 │ 活跃 │ ✅ │ │
│ │ 15 │ MODP 3072 │ 3072 │ 活跃 │ ✅ │ │
│ │ 16 │ MODP 4096 │ 4096 │ 活跃 │ ✅ │ │
│ │ 19 │ ECP 256 │ 256 │ 活跃 │ ✅✅ │ │
│ │ 20 │ ECP 384 │ 384 │ 活跃 │ ✅✅ │ │
│ │ 21 │ ECP 521 │ 521 │ 活跃 │ ✅ │ │
│ │ 31 │ Curve25519 │ 256 │ 活跃 │ ✅✅✅ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
5.2 推荐的加密套件
┌─────────────────────────────────────────────────────────────────────────┐
│ 推荐的加密套件配置 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 推荐配置(现代、安全、高效): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ # IKE (Phase 1) 加密套件 │ │
│ │ ike=aes256gcm16-sha384-modp3072! │ │
│ │ 或 │ │
│ │ ike=aes256-sha384-modp3072! │ │
│ │ │ │
│ │ # ESP (Phase 2) 加密套件 │ │
│ │ esp=aes256gcm16-sha384! │ │
│ │ 或 │ │
│ │ esp=aes256-sha384! │ │
│ │ │ │
│ │ 说明: │ │
│ │ ├─ aes256gcm16: AES-256-GCM,16 字节 ICV │ │
│ │ ├─ sha384: SHA-384 哈希 │ │
│ │ ├─ modp3072: 3072 位 DH 组 │ │
│ │ └─ !: 仅使用此套件,不协商其他 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 兼容性配置(最大兼容): │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ # IKE 加密套件(包含多种选项) │ │
│ │ ike=aes256-sha256-modp2048,aes128-sha256-modp2048,3des-sha1 │ │
│ │ │ │
│ │ # ESP 加密套件 │ │
│ │ esp=aes256-sha256,aes128-sha1,3des-sha1 │ │
│ │ │ │
│ │ 警告:包含弱算法,仅用于兼容旧系统 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
6. NAT 穿透
6.1 NAT 穿透机制
┌─────────────────────────────────────────────────────────────────────────┐
│ NAT 穿透 (NAT-T) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 问题:ESP 是 IP 协议 50,不是 TCP/UDP,NAT 设备通常无法处理 │
│ │
│ 解决方案:NAT Traversal (NAT-T),RFC 3947/3948 │
│ │
│ 原理: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 检测 NAT: │ │
│ │ ├─ 发送方在 IKE 消息中添加 NAT-D 载荷 │ │
│ │ ├─ 包含源 IP:Port 的哈希 │ │
│ │ └─ 对方比较哈希值,检测是否有 NAT │ │
│ │ │ │
│ │ NAT 存在时的处理: │ │
│ │ ├─ 将 ESP 包封装在 UDP (端口 4500) │ │
│ │ ├─ NAT 设备可以正常处理 UDP │ │
│ │ └─ 保持 NAT 映射活跃 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 数据包封装: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 无 NAT: │ │
│ │ [IP 头: 协议=ESP] [ESP 头] [加密数据] [ICV] │ │
│ │ │ │
│ │ 有 NAT (NAT-T): │ │
│ │ [IP 头: 协议=UDP] [UDP 头: 4500] [ESP 头] [加密数据] [ICV] │ │
│ │ │ │
│ │ 端口 4500 用于 NAT-T 的 ESP over UDP │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Keepalive: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ NAT 映射超时问题: │ │
│ │ ├─ NAT 设备通常在几分钟无活动后删除映射 │ │
│ │ └─ 需要定期发送 keepalive 包 │ │
│ │ │ │
│ │ 配置: │ │
│ │ dpdaction=clear │ │
│ │ dpddelay=30s │ │
│ │ dpdtimeout=120s │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
7. 配置示例
7.1 站点到站点 VPN (strongSwan)
# /etc/ipsec.conf - 站点到站点 VPN
config setup
charondebug="ike 2, knl 2, cfg 2"
uniqueids=yes
conn site-to-site
# 基本配置
keyexchange=ikev2
authby=secret
left=%defaultroute
leftid=@site-a.example.com
leftsubnet=10.0.0.0/24 # 本地网络
right=203.0.113.2 # 对端公网 IP
rightid=@site-b.example.com
rightsubnet=10.0.1.0/24 # 对端网络
# 加密套件
ike=aes256gcm16-sha384-modp3072!
esp=aes256gcm16-sha384!
# 生命周期
ikelifetime=24h
lifetime=8h
# NAT 穿透
forceencaps=yes
dpdaction=restart
dpddelay=30s
dpdtimeout=120s
# 其他
auto=add
type=tunnel# /etc/ipsec.secrets
# 预共享密钥
@site-a.example.com @site-b.example.com : PSK "your-secure-psk-here"7.2 远程访问 VPN (证书认证)
# /etc/ipsec.conf - 远程访问 VPN
config setup
uniqueids=no
conn remote-access
# 基本配置
keyexchange=ikev2
left=%any
leftid=@vpn.example.com
leftcert=serverCert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0 # 全流量隧道
# 客户端配置
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24 # 分配给客户端的 IP 池
rightdns=8.8.8.8,8.8.4.4
# 加密套件
ike=aes256-sha384-modp3072!
esp=aes256-sha384!
# EAP 配置
eap_identity=%identity
# 其他
auto=add# /etc/ipsec.secrets
# 服务器私钥
: RSA serverKey.pem
# EAP 用户认证
user1 : EAP "password1"
user2 : EAP "password2"8. 常见实现
┌─────────────────────────────────────────────────────────────────────────┐
│ IPsec 常见实现 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Linux: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 实现 │ 特点 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ strongSwan │ 功能最全,模块化,支持 IKEv1/v2 │ │
│ │ Libreswan │ 从 Openswan 分支,简单稳定 │ │
│ │ Openswan │ 历史悠久,维护较少 │ │
│ │ wireguard │ 不是 IPsec,但可作为替代方案 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Windows: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 实现 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ Windows 内置 │ 支持 IKEv2,原生客户端 │ │
│ │ RRAS │ 路由和远程访问服务,服务器端 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 硬件设备: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 厂商 │ 产品线 │ │
│ ├─────────────────────────────────────────────────────────────────┤ │
│ │ Cisco │ ASA, IOS routers, Firepower │ │
│ │ Juniper │ SRX, SSG, Netscreen │ │
│ │ Palo Alto │ Next-Gen Firewalls │ │
│ │ Fortinet │ FortiGate │ │
│ │ Check Point │ Quantum Security Gateways │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
9. 故障排查
9.1 常用命令
# 查看 IPsec 状态
ipsec statusall
# 查看 SA 状态
ip xfrm state
ip xfrm policy
# strongSwan 特定命令
swanctl --list-sas
swanctl --list-certs
# 查看连接
ipsec status
# 测试连接
ipsec up site-to-site
ipsec down site-to-site
# 查看日志
journalctl -u strongswan-starter
tail -f /var/log/syslog | grep -i ipsec
# 抓包分析
tcpdump -i eth0 udp port 500 or udp port 4500 or esp9.2 常见问题
┌─────────────────────────────────────────────────────────────────────────┐
│ 常见问题排查 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 握手失败 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 检查项: │ │
│ │ ├─ 网络连通性 (ping) │ │
│ │ ├─ UDP 500/4500 端口是否开放 │ │
│ │ ├─ 防火墙规则 │ │
│ │ ├─ 加密套件是否匹配 │ │
│ │ └─ 认证凭据是否正确 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 2. SA 建立但无流量 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 检查项: │ │
│ │ ├─ 路由配置 │ │
│ │ ├─ SPD 策略是否正确 │ │
│ │ ├─ 子网配置 (leftsubnet/rightsubnet) │ │
│ │ └─ iptables 规则 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 3. 连接中断 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 检查项: │ │
│ │ ├─ DPD 配置 │ │
│ │ ├─ NAT 映射超时 │ │
│ │ ├─ SA 生命周期 │ │
│ │ └─ rekey 配置 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 4. 性能问题 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 优化: │ │
│ │ ├─ 使用 AES-GCM(比 CBC 快) │ │
│ │ ├─ 确保 AES-NI 可用 │ │
│ │ ├─ 增加MTU,减少分片 │ │
│ │ └─ 调整 SA 生命周期,减少 rekey │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
10. 总结
10.1 IPsec 特点总结
┌─────────────────────────────────────────────────────────────────────────┐
│ IPsec 优缺点总结 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 优点: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ├─ 标准化:IETF 标准,跨厂商互操作 │ │
│ │ ├─ 兼容性:几乎所有网络设备都支持 │ │
│ │ ├─ 功能完备:企业级功能齐全 │ │
│ │ ├─ 灵活性:多种加密算法、认证方式 │ │
│ │ ├─ 认证:支持证书、EAP、RADIUS 集成 │ │
│ │ └─ 安全:内核态实现,性能好 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 缺点: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ├─ 复杂:配置复杂,学习曲线陡峭 │ │
│ │ ├─ 代码量大:难以审计 │ │
│ │ ├─ 调试困难:错误信息不直观 │ │
│ │ ├─ 可能配置错误:灵活性带来安全风险 │ │
│ │ └─ NAT 问题:需要额外配置 NAT-T │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
10.2 适用场景
┌─────────────────────────────────────────────────────────────────────────┐
│ IPsec 适用场景 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ✅ 推荐使用 IPsec: │
│ ├─ 企业站点到站点 VPN │
│ ├─ 需要与现有硬件设备集成 │
│ ├─ 需要用户认证/AD 集成 │
│ ├─ 合规要求(特定加密算法) │
│ ├─ 跨厂商环境 │
│ └─ 传统/旧系统环境 │
│ │
│ ⚠️ 考虑其他方案: │
│ ├─ 新项目,追求简单 → WireGuard │
│ ├─ 不需要企业功能 → WireGuard │
│ ├─ 容器网络 → Cilium + WireGuard │
│ └─ 快速部署 → WireGuard │
│ │
└─────────────────────────────────────────────────────────────────────────┘
10.3 一句话总结
IPsec 是功能完备、兼容性强的 VPN 协议族,适合企业级场景和传统环境,但配置复杂。新项目建议优先考虑 WireGuard。