IPsec 安全扩展
为什么需要 IPsec
IP 协议设计之初没有考虑安全:
- 源地址可以伪造(IP Spoofing)
- 数据内容明文传输,任何人抓包都能看
- 数据可能被篡改(中间人修改包内容)
IPsec(IP Security) 是网络层的安全框架,为 IP 通信提供认证、完整性校验、加密三种保护。它不依赖应用层,对上层透明——TCP、UDP、ICMP 等应用无需修改就能享受安全保护。
IPsec 的核心协议
IPsec 由三个核心协议组成:
| 协议 | RFC | 功能 | 类比 |
|---|---|---|---|
| AH | 4302 | 认证 + 完整性校验 | 封条(防拆,但不保密) |
| ESP | 4303 | 加密 + 认证 + 完整性 | 保险箱(防拆又保密) |
| IKEv2 | 7296 | 密钥协商与管理 | 保险箱密码的交换协议 |
AH(Authentication Header)
AH 提供:
- 数据源认证:确认包确实来自声称的发送方
- 完整性校验:确保传输过程中未被篡改
- 防重放攻击:通过序列号机制
AH 不加密数据,所以抓包者仍能看到内容,只是无法伪造。
AH 在 IPv6 中作为扩展首部(Next Header=51)插入,在 IPv4 中作为协议号 51 的载荷。
ESP(Encapsulating Security Payload)
ESP 是 IPsec 的主力,提供:
- 加密:用 AES、ChaCha20 等算法加密数据,抓包者看到的是乱码
- 认证和完整性:同 AH
- 可选的防重放
ESP 在 IPv6 中作为扩展首部(Next Header=50),在 IPv4 中作为协议号 50 的载荷。
为什么 ESP 可以替代 AH? 因为 ESP 已经包含了认证功能,现代部署几乎只用 ESP,AH 很少单独使用。
两种工作模式
传输模式(Transport Mode)
原始 IP 首部 + [ESP 首部 + 加密(TCP/UDP 数据) + ESP 尾部] + 原始 IP 首部(修改 Protocol=50)
- 只加密/认证上层数据(Payload),IP 首部不变
- 用于端到端通信(两台主机之间直接建立 IPsec)
- 优点:开销小,原始 IP 地址可见(适合 QoS 路由)
生活例子:你给朋友的信套一个透明信封,信封上有防伪标记(AH)或把信纸折成密文(ESP),但外面的收件地址还是明文。
传输模式只保护上层数据,IP 首部不变,适合端到端主机通信;隧道模式加密整个原始 IP 包并套新首部,适合 VPN 网关之间保护整个网络。
隧道模式(Tunnel Mode)
新 IP 首部(隧道端点)+ [ESP 首部 + 加密(原始 IP 首部 + TCP/UDP 数据) + ESP 尾部]
- 加密整个原始 IP 包,外面套一个新的 IP 首部
- 用于 VPN(虚拟专用网):两个网关之间建立隧道,保护内部网络通信
- 优点:隐藏原始 IP 地址,保护整个网络
生活例子:你把信装进一个铁盒,铁盒上写"寄给上海分公司",上海分公司收到后打开铁盒,取出里面的信(原始 IP 包)再转发给真正的收件人。
IKEv2 的两阶段设计分离了"密钥协商"和"身份认证":第一阶段用 Diffie-Hellman 建立临时加密通道,第二阶段在保护通道内完成身份认证和 IPsec 参数协商。即使第二阶段被截获,攻击者也无法解密第一阶段的内容。
IKEv2 密钥交换
IPsec 需要双方约定:
- 用什么加密算法(AES-256?ChaCha20?)
- 用什么认证算法(HMAC-SHA256?)
- 密钥怎么生成
- 密钥多久换一次
手动配置这些参数不现实,IKEv2(Internet Key Exchange v2) 自动完成:
IKEv2 两阶段
第一阶段(IKE_SA_INIT):
- 双方交换支持的算法列表
- 用 Diffie-Hellman 算法协商出共享密钥
- 建立 IKE 安全关联(IKE SA)
第二阶段(IKE_AUTH):
- 双方用证书或预共享密钥(PSK)认证身份
- 协商 IPsec 参数(加密算法、SPI、序列号窗口)
- 建立 Child SA(即 IPsec SA)
SA(Security Association,安全关联)
SA 是 IPsec 的核心数据结构,定义了"如何保护通信"。每个方向一个 SA:
SPI(Security Parameter Index,32 位):SA 的唯一标识
目的 IP 地址
安全协议(AH 或 ESP)
加密算法 + 密钥
认证算法 + 密钥
序列号计数器
生存时间
SPI 的作用:接收方收到 ESP 包后,看 SPI 值就能找到对应的 SA,知道用哪个密钥解密。
IPsec 在 IPv6 中的位置
IPv6 强制要求支持 IPsec(虽然实际不一定启用)。AH 和 ESP 作为扩展首部插入链中:
[IPv6 首部, Next=50] → [ESP 首部] → [加密的数据] → [ESP 尾部]
Wireshark 中可以看到:
- Next Header: 50 (ESP)
- SPI: 0x12345678
- Sequence Number: 1234
如果 Wireshark 配置了密钥,还能解密查看内部内容。
NAT 与 IPsec 的冲突
ESP 加密了 TCP/UDP 的端口号,NAT 设备无法修改端口号做端口映射。AH 认证了整个 IP 首部(包括 IP 地址),NAT 修改地址后认证失败。
解决方案:
- NAT-T(NAT Traversal):检测到有 NAT 时,用 UDP 4500 端口封装 ESP 包
- ESP 不认证外层 IP:隧道模式下外层 IP 是 NAT 后的公网地址,内层 IP 不变
本篇小结
- IPsec 提供网络层安全:认证、完整性、加密
- AH(51)只认证不加密;ESP(50)加密+认证,现代主流
- 传输模式保护端到端;隧道模式保护整个网络(VPN)
- IKEv2 自动协商算法和密钥,建立 SA
- SPI 标识 SA,接收方据此选择解密密钥
- NAT 与 IPsec 冲突,用 NAT-T(UDP 4500)解决
动手实践
Wireshark 抓取 VPN 流量,过滤
esp或udp.port == 4500,观察 SPI 和 Sequence Number在 Linux 上配置 IPsec(StrongSwan),建立主机到主机的传输模式隧道:
# 安装 strongswan sudo apt install strongswan # 配置 /etc/ipsec.conf对比抓包:未加密 ping 和 IPsec 保护后的 ping,观察 ESP 包的内容是否为乱码
思考:为什么 AH 在现代网络中很少使用?如果 ESP 已经提供认证,AH 还有什么独立价值?