核心概述

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 esp

9.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。


外部参考