IPSec 协议全栈详解:AH/ESP/IKE 工作机制与 strongSwan 实战

0 阅读12分钟

摘要:IPSec(Internet Protocol Security)是企业级 VPN 建设的基石技术。本文将从协议栈架构、密钥协商机制、数据包封装格式等多个维度深度解析 IPSec 工作原理,并结合生产环境配置实践。

关键词:IPSec、IKE、ESP、AH、SA、VPN、网络安全


一、IPSec 概述

1.1 什么是 IPSec?

IPSec(Internet Protocol Security)是由 IETF 制定的一套开放的网络安全协议标准,定义在 RFC 4301~4309 系列文档中。它在网络层(OSI 第 3 层)为 IP 通信提供加密、认证和完整性保护,无需修改上层应用即可实现端到端的安全传输。

核心特性:

  • 🔐 机密性:通过加密算法(AES、3DES 等)保护数据内容
  • 完整性:通过哈希算法(SHA-256、MD5 等)防止数据篡改
  • 🆔 身份认证:验证通信双方身份,防止中间人攻击
  • 🔄 抗重放:序列号机制防止数据包重放攻击

1.2 IPSec 应用场景

场景类型典型应用安全需求
Site-to-Site VPN企业分支机构互联隧道模式、高吞吐量
Remote Access VPN移动办公接入用户认证、动态 IP
Cloud Connect混合云专线备份高可用性、多路径
IoT Secure Link工业设备安全通信低延迟、抗干扰

二、IPSec 协议架构

2.1 协议栈组成

IPSec 不是单一协议,而是由多个协议协同工作的协议族:

IPSec 协议栈架构

2.2 三大核心协议

2.2.1 AH(Authentication Header,认证头)

协议号:51

AH 提供数据完整性校验和身份认证,但不提供加密

AH 头部结构: AH 头部结构

AH 保护范围:

  • ✅ IP 头部(部分字段除外,如 TTL、Checksum)
  • ✅ AH 头部本身
  • ✅ 上层载荷(TCP/UDP 数据)

⚠️ 注意:由于 AH 保护外层 IP 头,与 NAT 不兼容,实际部署中较少使用。

2.2.2 ESP(Encapsulating Security Payload,封装安全载荷)

协议号:50

ESP 提供加密、完整性校验和身份认证,是 IPSec 最常用的协议。

ESP 头部结构: ESP 头部结构

ESP 保护范围(隧道模式):

  • ❌ 外层 IP 头部(不保护)
  • ✅ ESP 头部
  • ✅ 原始 IP 包(完整加密)
  • ✅ ESP 尾部

2.2.3 IKE(Internet Key Exchange,互联网密钥交换)

UDP 端口:500 (IKE)、4500 (IKE NAT-T)

IKE 负责自动协商和建立安全联盟(SA),目前主流版本是 IKEv2(RFC 7296),IKEv1 定义于 RFC 2409/RFC 4306。

IKE 核心功能:

  1. 双向身份认证(预共享密钥/证书)
  2. 动态密钥生成和更新
  3. SA 生命周期管理
  4. NAT 穿越检测

三、安全联盟(SA)机制

3.1 什么是 SA?

安全联盟(Security Association,SA) 是 IPSec 的基础概念,定义为"发送者和接收者之间共享的安全属性集合"。

每个 SA 由三元组唯一标识:

SA = (SPI, 目标 IP 地址, 安全协议)
  • SPI(Security Parameter Index):32 位标识符,由接收方分配
  • 目标 IP 地址:SA 的目的端地址
  • 安全协议:AH 或 ESP

3.2 SA 的单向性

IPSec SA 是单向的,双向通信需要两个 SA:

双向 SA 示意图

3.3 SAD 和 SPD

IPSec 维护两个核心数据库:

数据库全称功能
SADSecurity Association Database存储所有活跃 SA 的参数
SPDSecurity Policy Database定义哪些流量需要 IPSec 保护

SPD 处理逻辑: SPD 处理逻辑


四、封装模式:隧道模式 vs 传输模式

4.1 传输模式(Transport Mode)

特点:只加密 IP 载荷,保留原始 IP 头

ESP 封装:传输模式 vs 隧道模式

适用场景:

  • ✅ 端到端加密(主机到主机)
  • ✅ 需要保留原始源/目的 IP
  • ❌ 不支持 NAT 穿越

4.2 隧道模式(Tunnel Mode)

特点:加密整个原始 IP 包,添加新 IP 头

适用场景:

  • ✅ Site-to-Site VPN(网关到网关)
  • ✅ Remote Access VPN
  • ✅ 支持 NAT 穿越
  • ✅ 隐藏内部网络拓扑

4.3 模式对比

特性传输模式隧道模式
加密范围仅载荷整个 IP 包
IP 头开销无额外开销增加新 IP 头(20 字节)
NAT 兼容❌ 不支持✅ 支持(NAT-T)
典型应用主机间加密网关间 VPN
路由可见性原始 IP 可见仅网关 IP 可见

五、IKE 密钥协商详解

5.1 IKEv1 两阶段协商

IKEv1 采用两阶段协商模型:

阶段 1:建立 IKE SA(ISAKMP SA)

目标:在网关之间建立安全的控制通道

交换模式:

模式消息数特点
主模式(Main Mode)6 条身份保护,抗 DoS
积极模式(Aggressive Mode)3 条快速,但泄露身份

主模式消息流: IKEv1 主模式消息流

阶段 2:建立 IPSec SA(Child SA)

目标:协商实际数据传输的安全参数

快速模式(Quick Mode):

发起方                              响应方
  │                                    │
  │ ── HASH + SA 提案 + Nonce ──────→ │
  │ ←── HASH + SA 提案 + Nonce ────── │
  │                                    │
  │ ── HASH (确认) ─────────────────→ │
  │                                    │
  ▼                                    ▼
      IPSec SA 建立完成

5.2 IKEv2 简化协商

IKEv2 将协商过程简化为 4 条消息:

IKEv2 简化协商

IKEv2 改进:

  • ✅ 减少消息往返(4 条 vs 6 条)
  • ✅ 内置 NAT 穿越检测
  • ✅ 支持 MOBIKE(移动多宿主)
  • ✅ 更好的错误处理

5.3 密钥派生过程

IKE 使用 Diffie-Hellman 算法生成共享密钥:

Diffie-Hellman 密钥交换

派生密钥用途:

  • SK_e:加密密钥(用于 IKE 消息加密)
  • SK_a:认证密钥(用于 IKE 消息完整性)
  • SK_d:派生子密钥(用于 IPSec SA 密钥派生)

六、NAT 穿越(NAT-T)

6.1 问题背景

传统 IPSec 与 NAT 不兼容的原因:

  1. AH 保护 IP 头,NAT 修改 IP 地址导致完整性校验失败
  2. ESP 加密传输层端口,NAT 无法进行端口转换

6.2 NAT-T 解决方案

RFC 3947 定义了 NAT 穿越机制:

检测机制: NAT-T 检测在 IKE_SA_INIT 交换中完成,双方交换 NAT-DETECTION-NONCE 载荷:

  • 比较哈希值判断是否存在 NAT 设备
  • 如发现 NAT,后续通信切换到 UDP 4500 端口

封装机制: NAT-T 封装格式


七、生产环境配置实践

7.1 典型拓扑

Site-to-Site IPSec VPN 网络拓扑

7.2 Linux strongSwan 完整配置示例

本节提供基于 strongSwan 的完整配置,包含中心端(Hub)和分支端(Branch)的双向配置。

环境信息

角色公网 IP内网网段主机名
中心端(Hub)1.2.3.4192.168.1.0/24vpn-hub
分支端(Branch)5.6.7.8192.168.2.0/24vpn-branch

【中心端】配置步骤

步骤 1:安装 strongSwan

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y strongswan strongswan-pki libstrongswan-standard-plugins

# CentOS/RHEL
sudo yum install -y strongswan

步骤 2:配置 /etc/ipsec.conf

# /etc/ipsec.conf - 中心端配置
config setup
    charondebug="ike 2, knl 2, cfg 2"
    uniqueids=never
    strictcrlpolicy=no
    cachecrls=no

# 中心端到分支端的隧道连接
conn hub-to-branch
    type=tunnel
    keyexchange=ikev2
    authby=secret
    
    # 中心端(本地)配置
    left=1.2.3.4
    leftid=@vpn-hub
    leftsubnet=192.168.1.0/24
    leftfirewall=yes
    
    # 分支端(远程)配置
    right=5.6.7.8
    rightid=@vpn-branch
    rightsubnet=192.168.2.0/24
    
    # IKEv2 加密算法(阶段 1)
    ike=aes256gcm16-prfsha256-ecp256!
    
    # ESP 加密算法(阶段 2)
    esp=aes256gcm16-ecp256!
    
    # 启用完美前向保密
    dpdaction=clear
    dpddelay=30s
    dpdtimeout=120s
    
    # 生命周期
    ikelifetime=8h
    lifetime=1h
    rekey=yes
    reauth=no
    
    # 自动启动
    auto=start
    
    # 标记连接(用于路由)
    mark=100/0xff

步骤 3:配置 /etc/ipsec.secrets

# /etc/ipsec.secrets - 中心端密钥
: PSK "HubBranch@StrongKey2026!"

步骤 4:配置防火墙(UFW 示例)

# 放行 IPSec 相关端口
sudo ufw allow 500/udp    # IKE
sudo ufw allow 4500/udp   # NAT-T
sudo ufw allow proto esp  # ESP 协议 50
sudo ufw allow proto ah   # AH 协议 51(可选)

# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

步骤 5:配置路由(可选,用于多分支场景)

# 添加静态路由(如果内网有多个网段)
sudo ip route add 192.168.2.0/24 dev ipsec0

【分支端】配置步骤

步骤 1:安装 strongSwan

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y strongswan strongswan-pki libstrongswan-standard-plugins

# CentOS/RHEL
sudo yum install -y strongswan

步骤 2:配置 /etc/ipsec.conf

# /etc/ipsec.conf - 分支端配置
config setup
    charondebug="ike 2, knl 2, cfg 2"
    uniqueids=never
    strictcrlpolicy=no
    cachecrls=no

# 分支端到中心端的隧道连接
conn branch-to-hub
    type=tunnel
    keyexchange=ikev2
    authby=secret
    
    # 分支端(本地)配置
    left=5.6.7.8
    leftid=@vpn-branch
    leftsubnet=192.168.2.0/24
    leftfirewall=yes
    
    # 中心端(远程)配置
    right=1.2.3.4
    rightid=@vpn-hub
    rightsubnet=192.168.1.0/24
    
    # IKEv2 加密算法(阶段 1)
    ike=aes256gcm16-prfsha256-ecp256!
    
    # ESP 加密算法(阶段 2)
    esp=aes256gcm16-ecp256!
    
    # 启用完美前向保密
    dpdaction=clear
    dpddelay=30s
    dpdtimeout=120s
    
    # 生命周期
    ikelifetime=8h
    lifetime=1h
    rekey=yes
    reauth=no
    
    # 自动启动
    auto=start
    
    # 标记连接(用于路由)
    mark=100/0xff

步骤 3:配置 /etc/ipsec.secrets

# /etc/ipsec.secrets - 分支端密钥
: PSK "HubBranch@StrongKey2026!"

步骤 4:配置防火墙

# 放行 IPSec 相关端口
sudo ufw allow 500/udp
sudo ufw allow 4500/udp
sudo ufw allow proto esp

# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

启动与验证

两端执行以下命令:

# 1. 重启 strongSwan 服务
sudo ipsec restart

# 2. 查看连接状态
sudo ipsec status

# 3. 查看详细状态
sudo ipsec statusall

# 4. 查看流量统计
sudo ipsec trafficstatus

# 5. 测试连通性(从中心端 ping 分支端内网)
ping -I 192.168.1.1 192.168.2.1

# 6. 查看日志
sudo tail -f /var/log/charon.log

预期输出示例:

Security Associations (1 up, 0 connecting):

hub-to-branch[1]: ESTABLISHED 2 minutes ago, 1.2.3.4[vpn-hub]...5.6.7.8[vpn-branch]
hub-to-branch{1}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: c8f3a100_i c2d4b200_o
hub-to-branch{1}:  192.168.1.0/24 === 192.168.2.0/24

多分支扩展配置(中心端)

如果中心端需要连接多个分支,可以在中心端配置多个 conn:

# /etc/ipsec.conf - 中心端多分支配置

conn hub-to-branch1
    type=tunnel
    keyexchange=ikev2
    authby=secret
    
    left=1.2.3.4
    leftid=@vpn-hub
    leftsubnet=192.168.1.0/24
    
    right=5.6.7.8
    rightid=@vpn-branch1
    rightsubnet=192.168.2.0/24
    
    ike=aes256gcm16-prfsha256-ecp256!
    esp=aes256gcm16-ecp256!
    auto=start
    mark=101/0xff

conn hub-to-branch2
    type=tunnel
    keyexchange=ikev2
    authby=secret
    
    left=1.2.3.4
    leftid=@vpn-hub
    leftsubnet=192.168.1.0/24
    
    right=9.10.11.12
    rightid=@vpn-branch2
    rightsubnet=192.168.3.0/24
    
    ike=aes256gcm16-prfsha256-ecp256!
    esp=aes256gcm16-ecp256!
    auto=start
    mark=102/0xff

对应的密钥配置:

# /etc/ipsec.secrets
: PSK "HubBranch1@Key2026!"
: PSK "HubBranch2@Key2026!"

7.3 故障排查命令汇总

strongSwan 状态检查

ipsec status          # 查看连接状态
ipsec statusall       # 详细状态信息
ipsec trafficstatus   # 流量统计

IKE SA 和 Child SA 信息

ipsec statusall | grep -A 20 "Security Associations"

查看日志

tail -f /var/log/charon.log

重启 IPSec 服务

ipsec restart

强制重新协商

sudo ipsec initiate site-to-site --rekey

八、性能优化建议

8.1 加密算法选择

算法安全性性能推荐场景
AES-GCM-256⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐现代硬件(支持 AES-NI)
AES-CBC-256⭐⭐⭐⭐⭐⭐⭐⭐⭐通用场景
ChaCha20-Poly1305⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐移动设备、无 AES-NI
3DES⭐⭐⭐⭐遗留系统兼容
DES⭐⭐⭐已废弃,禁用

8.2 PFS(完美前向保密)

建议配置:

# IKEv2 启用 PFS
ike=aes256gcm16-prfsha256-ecp256!
esp=aes256gcm16-ecp256!
# DH Group 14 (2048-bit) 或更高

PFS 优势:

  • ✅ 即使长期密钥泄露,历史会话仍安全
  • ✅ 每次 Child SA 重新协商生成新密钥
  • ⚠️ 增加 CPU 开销(额外 DH 交换)

8.3 生存时间(Lifetime)设置

# 推荐配置
ikelifetime=8h      # IKE SA 生命周期
lifetime=1h         # IPSec SA 生命周期
rekeymargin=9m      # 提前 9 分钟重新协商

设置原则:

  • 短 lifetime → 更高安全性,更多协商开销
  • 长 lifetime → 更低开销,密钥暴露风险增加
  • 生产环境建议:IKE SA 8h,IPSec SA 1h

九、安全加固建议

9.1 最小化配置

# ❌ 避免弱算法
ike=3des-md5-modp1024!  # 已破解,禁用

# ✅ 使用强算法
ike=aes256gcm16-prfsha256-ecp256!
esp=aes256gcm16-ecp256!

9.2 预共享密钥管理

密钥强度要求:

  • 长度 ≥ 20 字符
  • 包含大小写字母、数字、特殊字符
  • 定期轮换(建议 90 天)
  • 不同隧道使用不同密钥

生成强密钥:

# Linux 生成随机密钥
openssl rand -base64 32

# 输出示例:Kj8mN2pQ5rT9vW3xY7zA1bC4dE6fG0hI

9.3 防重放攻击

确保启用序列号检查:

# strongSwan 默认启用
# 检查配置
grep -i replay /etc/ipsec.conf

9.4 日志与监控

关键监控指标:

  • IKE 协商失败次数
  • IPSec SA 状态变化
  • 加密/解密数据包计数
  • 完整性校验失败计数

告警阈值建议:

  • IKE 失败 > 10 次/分钟 → 可能遭受暴力破解
  • 完整性失败 > 0 → 可能存在中间人攻击

十、常见问题 FAQ

Q1: IPSec 隧道建立成功但无法 ping 通?

排查步骤:

  1. 检查两端 ACL/感兴趣流配置是否对称
  2. 验证路由表,确保回程路由正确
  3. 检查防火墙是否放行 ESP (协议 50) 或 UDP 4500
  4. 确认 NAT 设备正确配置了 IPSec Passthrough

Q2: 隧道频繁断开重连?

可能原因:

  • DPD(Dead Peer Detection)超时设置过短
  • 网络不稳定导致 keepalive 丢失
  • SA lifetime 设置过短

解决方案:

# 调整 DPD 参数
dpddelay=30s
dpdtimeout=120s
dpdaction=hold  # 或 clear/restart

Q3: 如何通过 NAT 设备建立 IPSec?

必须条件:

  1. 使用 ESP(不能用 AH)
  2. 启用 NAT-T(UDP 4500)
  3. 防火墙放行 UDP 500 和 4500

Q4: IKEv1 还是 IKEv2?

推荐 IKEv2,原因:

  • ✅ 更少的消息往返(建立更快)
  • ✅ 内置 NAT-T 支持
  • ✅ 更好的移动性支持(MOBIKE)
  • ✅ 更健壮的错误处理
  • ⚠️ 仅在不支持 IKEv2 的老旧设备上使用 IKEv1

十一、总结

IPSec 作为成熟的网络层安全协议,在企业 VPN 建设中仍占据重要地位。理解其核心机制对于正确配置和故障排查至关重要:

核心要点回顾:

  1. 协议选择:优先使用 ESP + IKEv2,避免 AH
  2. 封装模式:Site-to-Site 用隧道模式,主机间用传输模式
  3. 算法强度:AES-GCM-256(加密 + 认证)+ PRF-SHA256 + DH Group 14+
  4. 密钥管理:启用 PFS,定期轮换预共享密钥
  5. NAT 穿越:确保启用 NAT-T,放行 UDP 4500

随着零信任架构和 SASE 的兴起,IPSec 也在与新技术融合。掌握 IPSec 原理,将为理解现代网络安全架构打下坚实基础。


参考文献

  1. RFC 4301 - Security Architecture for the Internet Protocol
  2. RFC 4303 - IP Encapsulating Security Payload (ESP)
  3. RFC 4302 - IP Authentication Header (AH)
  4. RFC 7296 - Internet Key Exchange Protocol Version 2 (IKEv2)
  5. RFC 2409/RFC 4306 - The Internet Key Exchange (IKEv1)
  6. RFC 3947 - Negotiation of NAT-Traversal in the IKE
  7. strongSwan Documentation - docs.strongswan.org/