第68篇:OSPF 邻接震荡典型案例分析
关键词
OSPF、邻接震荡、Flapping、故障排查、链路不稳定、路由抖动
一、什么是邻接震荡?
邻接震荡(Adjacency Flapping) 是指 OSPF 邻居在 Full 状态和其他状态(Down/Init/ExStart)之间频繁切换的现象。
震荡的影响
| 影响 | 说明 |
|---|---|
| 路由频繁变更 | 路由表随邻居状态变化而不断更新 |
| CPU 高负载 | 频繁运行 SPF 计算,消耗路由器 CPU |
| 业务中断 | 流量在链路切换过程中丢包 |
| 全网影响 | LSA 泛洪传递到全网,可能引发级联效应 |
案例一:光模块故障导致邻接震荡
1.1 现象
某企业网络,两台核心交换机之间的 OSPF 邻居每 5~10 分钟 Down 一次,然后重新建立。
# 查看日志
%OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on GE0/0/0 from FULL to DOWN, Neighbor Down: Dead timer expired
%OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on GE0/0/0 from LOADING to FULL, Loading done
# 以上日志每 5 分钟重复出现
1.2 排查过程
# Step 1: 查看接口状态
display interface GigabitEthernet0/0/0
物理状态: Up ← 接口是 UP 的
链路协议: Up
# Step 2: 查看接口错误统计
display interface GigabitEthernet0/0/0
Input: CRC: 1250 ← CRC 错误异常高!
Frame: 0
Output: CRC: 0
# Step 3: 查看光模块信息
display transceiver interface GigabitEthernet0/0/0
光功率: -28.5 dBm ← 光功率过低(正常应在 -15 ~ -3 dBm)
温度: 65°C ← 温度偏高
1.3 根因
光模块老化导致光功率不稳定,偶尔出现 CRC 错误包。OSPF Hello 报文恰好被损坏时,对端收不到 Hello → Dead Timer 超时 → 邻居 Down → 很快又恢复。
1.4 解决
# 更换光模块后确认
display transceiver interface GigabitEthernet0/0/0
光功率: -5.2 dBm ← 恢复正常
# 邻居状态稳定在 Full
案例二:BFD 误检测导致 OSPF 震荡
2.1 现象
启用 BFD 后,OSPF 邻居开始频繁抖动。
display ospf peer
Neighbor ID State Duration
2.2.2.2 FULL 00:00:12 ← 刚建立不久
3.3.3.3 FULL 00:00:15
2.2 排查过程
# Step 1: 查看 BFD 会话状态
display bfd session all
Local Discr: 8192 State: Down ← BFD 状态 Down
Local Discr: 8193 State: Up
# Step 2: 查看 BFD 配置
display bfd configuration
Min Tx Interval: 10ms ← BFD 发送间隔 10ms
Min Rx Interval: 10ms
Detect Multiplier: 3 ← 检测倍数 3
# Step 3: 检查转发面延迟
# 发现链路存在微突发导致偶尔延迟超过 30ms
# BFD 要求 10ms × 3 = 30ms 内收到应答,但微突发超时
2.3 根因
BFD 参数设置过于激进(10ms 发送间隔),而链路存在微突发导致偶发延迟超标。BFD 误判链路故障,通知 OSPF 断开邻居。
2.4 解决
# 适当增大 BFD 检测间隔
bfd
interval 50 50 3 # 发送间隔 50ms,检测倍数 3
案例三:MTU 不一致导致周期性震荡
3.1 现象
华为与 Cisco 设备互联,OSPF 邻居建立成功后,每过一段时间(约 30 分钟)重新建立一次。
3.2 排查过程
# 华为端查看 MTU
display interface GE0/0/0 | include MTU
MTU: 1500
# Cisco 端查看 MTU
show interface GigabitEthernet0/0/0 | include MTU
MTU: 1400 ← 不一致!
# 华为端(未启用 mtu-enable)
# 华为不检查 MTU,继续发送 DD 报文(大小 1500)
# Cisco 端收到超过 1400 的 DD 报文 → 丢弃 → 周期性重试
3.3 根因
华为设备默认不启用 MTU 检查,Cisco 默认启用。华为发送的 DD 报文大小超过 Cisco 接口 MTU(1400),Cisco 丢弃后收不到回复,导致邻居周期性地重置。
3.4 解决
# 方案 1:统一 MTU(推荐)
# 华为端
interface GE0/0/0
mtu 1400
# Cisco 端
interface GigabitEthernet0/0/0
ip mtu 1400
# 方案 2:华为端启用 MTU 检查
interface GigabitEthernet0/0/0
ospf mtu-enable
案例四:双链路冗余场景的次优路径震荡
4.1 现象
┌──────────┐
GE0/0/0───│ SwitchA │───GE0/0/1
┌───────────┤ ├────────────┐
│ └──────────┘ │
RouterA RouterB
│ ┌──────────┐ │
└───GE0/0/2─│ SwitchB │──GE0/0/3──┘
└──────────┘
RouterA 和 RouterB 之间有两条链路(通过 SwitchA 和 SwitchB),OSPF 邻居在两条链路之间频繁切换。
4.2 排查
# 查看 RouterA 的 OSPF 邻居
display ospf peer
Neighbor ID Interface State
2.2.2.2 GE0/0/0 FULL
2.2.2.2 GE0/0/2 FULL ← 同一邻居出现在两个接口!
# 查看路由表(同一目的地两条等价路由频繁交替)
display ip routing-table 10.0.1.0
下一跳频繁在 10.0.12.2 和 10.0.14.2 之间切换
4.3 根因
两条链路后的交换机是同一台物理交换机(实际未被发现),导致 RouterA 通过两个接口与 RouterB 建立了两个邻接。SPF 计算时两条路径 Cost 相同,ECMP 正常工作,但由于某些原因(如其中一个接口微抖动),导致路由表频繁变更。
4.4 解决
# 方案 1:将两条链路做链路聚合
interface Eth-Trunk1
trunkport GE0/0/0
trunkport GE0/0/2
# OSPF 只看到一条逻辑链路
# 方案 2:调整 Cost 让一条链路作为备用
interface GE0/0/2
ospf cost 1000 # 作为备用路径
案例五:重复 Router ID 导致邻居震荡
5.1 现象
两台设备配置了相同的 Router ID,导致邻居建立后立刻断开。
%OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.1 on GE0/0/0 from FULL to DOWN,
Neighbor Down: Adjacency forced to reset
display ospf peer
Neighbor ID Interface State
1.1.1.1 GE0/0/0 DOWN
5.2 根因
两台设备的 Router ID 都是 1.1.1.1。OSPF 要求 Router ID 全网唯一。当两台设备发现对方 Router ID 与自己相同时,会主动断开邻接。
5.3 解决
# 修改其中一台的 Router ID
ospf 1
router-id 2.2.2.2
reset ospf process
六、邻接震荡的通用排查流程
1. 确认震荡频率
└─ 高频(秒级)→ BFD 误检测 / 光模块问题
└─ 中频(分钟级)→ Dead 超时 / MTU 问题
└─ 低频(小时级)→ LSDB 过大 / 周期性刷新
2. 查看接口错误统计
└─ CRC 错误多 → 光模块/线缆问题
└─ 无错误 → 检查 OSPF 配置
3. 查看 OSPF 邻居日志
└─ Dead timer expired → 链路丢包
└─ Adjacency forced to reset → Router ID 冲突
4. 查看 BFD 状态(如启用)
└─ BFD Down → BFD 参数调整
5. 检查两端配置一致性
└─ Area/Network Type/Auth/MTU/Timer
七、总结
| 案例 | 根因 | 关键排查点 |
|---|---|---|
| 光模块老化 | 光功率过低 | display transceiver |
| BFD 误检测 | BFD 参数过小 | display bfd session |
| MTU 不一致 | 华为 vs Cisco | display mtu |
| 双链路震荡 | 物理拓扑误判 | display ospf peer |
| Router ID 冲突 | 配置错误 | display ospf brief |
八、思考
- 如何区分邻接震荡是由光模块问题还是由 BFD 配置问题引起的?
- 华为设备与 Cisco 设备互联时,如何避免 MTU 相关的邻居震荡?
- 为什么说 OSPF 邻接震荡可能影响全网,而不仅仅是震荡的两台设备?
- 在排查邻居震荡时,为什么需要首先查看接口的 CRC 错误统计?
- 如果两台路由器通过两条链路互联,OSPF 分别建立了两个邻接,可能会产生什么问题?
下篇预告:第69篇《OSPF 特殊区域——Stub、Totally Stub、NSSA》——理解如何通过特殊区域精简 LSDB。