上一篇讲了 IPSec 用什么协议、什么模式。这一篇讲它怎么动起来——密钥怎么协商出来,数据包进去出来各走哪条路。
为什么 IKE 要分两个阶段
核心原因一句话:第二阶段本身也需要被保护。
如果只有一个阶段,那么协商「用什么密钥加密数据」这件事本身就是明文发的——攻击者直接截获就完了。所以 IKE 先建立一个受保护的协商通道(Phase 1 的 IKE SA),再在这个通道里协商真正加密数据的密钥(Phase 2 的 IPSec SA)。
Phase 1:两种模式,安全性和速度的取舍
| 主模式(Main Mode) | 野蛮模式(Aggressive Mode) | |
|---|---|---|
| 报文数 | 6 个(3 组交换) | 3 个 |
| 身份保护 | 有,身份在加密后传递 | 没有,身份明文发出 |
| 协商速度 | 慢 | 快 |
| 适用场景 | 两端都有固定 IP | 一端是动态 IP(如分支机构拨号、L2TP over IPSec) |
| 华为关键字 | 默认 | exchange-mode aggressive |
为什么动态 IP 要用野蛮模式?因为主模式需要按 IP 地址来查 PSK,而野蛮模式可以用 local-id / remote-id(比如域名或字符串)来识别对端。这是实际项目里选野蛮模式的主要理由,不是因为它快。
IKE v1 与 v2
| IKEv1 | IKEv2 | |
|---|---|---|
| 报文开销 | 大(主模式 6 报文) | 小(4 报文) |
| NAT 穿越 | 需要额外检测 | 原生支持 |
| 可靠性 | 无重传机制 | 有窗口/重传 |
| 现状 | 存量设备多 | 新部署首选(华为 ike peer xxx v2) |
数据包进出设备各走什么路
原始报文(192.168.1.10 → 192.168.2.10)
│
├─ ① 匹配感兴趣流:拿源/目的地址去查 ACL 3000
│ 没命中 → 直接按普通路由转发,不进隧道
│ 命中 → 继续往下
│
├─ ② 查 IPSec SA:按「感兴趣流 + 对端」找到对应的 SA
│ 没有 SA → 触发 IKE 协商(这就是"流量触发建隧道")
│
├─ ③ 加密封装:
│ 隧道模式 → 整个原报文加密,前面加 ESP 头 + 新 IP 头
│ 新 IP 头:源 = 本端隧道地址,目的 = 对端隧道地址
│
└─ ④ 查路由发送:按新 IP 头查路由表,发往对端
收到 ESP 报文
│
├─ ① 判断是不是 IPSec 报文:看 IP 协议号是不是 50(ESP)
│
├─ ② 查 SA:用报文里的 SPI + 目的 IP + 协议号 组成三元组查表
│ 查不到 → 丢弃(并可能回一个 notify 告诉对端重建)
│
├─ ③ 校验:抗重放窗口检查 → 完整性校验(HMAC)
│ 不通过 → 丢弃 + 计数
│
├─ ④ 解密 + 拆封装:得到原始内网报文
│
└─ ⑤ 按内网报文的目的地址查路由,转发到内网
★ 注意:入方向【不查 ACL】。命中 SA 就放行 —— 这也是为什么
"只配了单向 ACL 也能通"的原因(但那是不规范的做法)
生存期与重协商
SA 不是永久的,有生存期(lifetime),可以按时间也可以按流量算:
| SA 类型 | 默认生存期(华为) | 到点后 |
|---|---|---|
| IKE SA | 约 24 小时 | 重新走 Phase 1(主模式 6 报文) |
| IPSec SA | 约 1 小时(或指定流量) | 在 IKE SA 保护下重新走 Phase 2 |
关键点:重协商是「先建新的、再删旧的」,中间有一小段时间新旧 SA 并存,所以业务不会断。如果配置不当(比如两端生存期差太多),可能出现「一端删了旧 SA 而另一端还在用」导致短暂丢包。
DPD:怎么知道对端还活着
IPSec 是单向的、无连接的。如果对端设备重启了,本端的 SA 还在,但发出去的包全部石沉大海。所以需要 DPD(Dead Peer Detection)定期探测:
ike peer peer1 v2
dpd dpd-name # 关联一个 dpd 模板
dpd interval 10 retransmit 3 # 每 10 秒探测,3 次无响应就认为对端死了
# → 主动删除本地 SA
# ★ 不配 DPD 的后果:
# 对端重启后,本端 SA 表里还有旧表项,新流量继续用旧 SA 加密发出去
# → 全部丢包,而且不会自动恢复,必须手工 reset ike sa
# 这是"隧道莫名其妙不通了"最常见的根因之一
排错
display ike sa # IKE SA 状态
display ike sa verbose # 详细:对端 ID、加密算法、剩余时间
display ike peer # IKE peer 配置
display ike proposal # IKE 提议
display ipsec sa # IPSec SA
display ipsec sa verbose # SPI、算法、包计数(★ 看加解密包数对不对)
display ipsec statistics # 全局统计(丢包/校验失败计数)
display acl 3000 # 感兴趣流命中计数
display ipsec policy # 策略配置与绑定关系
reset ike sa # 重建(改配置后必做)
reset ipsec sa
按现象定位:
- 隧道建不起来,日志说 no proposal chosen → 两端 IKE 或 IPSec proposal 没有交集。逐项对比加密算法、认证算法、DH 组;
- IKE SA 是 Up 但 IPSec SA 没有 → ACL 不镜像,或者
ipsec proposal不匹配; - SA 都是 Up,业务不通 →
display acl 3000命中数为 0,感兴趣流没匹配上; - SA Up、ACL 命中,但 ping 不通 → 看
display ipsec sa verbose的加解密包数。加密包在涨但解密包为 0 → 对端没收到,查中间链路和 NAT; - 之前好好的突然不通,reset 就好了 → 没配 DPD。补上
dpd interval; - 一段时间断一下 → SA 生存期不一致导致的重协商窗口,把两端生存期配成一致。
一句话总结:Phase 1 保护 Phase 2,出方向查 ACL、入方向只查 SA,生存期到了先建新再删旧,DPD 必须配。IPSec 的排错就是顺着「IKE SA → IPSec SA → ACL 命中 → 加解密包数」这条链往下查。
📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)
合并了原始笔记中「IPSEC数据包处理流程 / IPSEC VPn」两页中的协商部分。
原笔记以流程图截图为主,本文把出方向/入方向的处理步骤完整展开,并补上了 DPD 缺失导致「隧道莫名不通」这个实际高频问题。
配置命令保留华为 VRP 原样。