1. 从"邻居卡在某个状态"开始:OSPF邻居状态机就是一张故障地图
搞网络的人应该都经历过这种场景:配置写完,两端接口状态起来,路由协议也敲了,结果show ip ospf neighbor一看,邻居始终停在 INIT 或者 EXSTART,路由表里空空如也。这种时候最怕的就是没有头绪地瞎试,改来改去问题反而更乱。
我自己的排查习惯是:不先看配置,先看邻居状态机。OSPF 邻居建立过程从 Down 到 Full 一共经历 7 个状态,每一个状态卡住,基本都能对应到某一类具体原因。只要把"卡在哪一步"和"这一步在做什么"对应起来,排错方向一下就缩小了。
1.1 七个状态分别意味着什么
先快速过一遍状态机的完整链路,这对后面所有排错都有用:
- Down:没有收到对方的任何 Hello 报文,或者收到了但在无效间隔内没有刷新。
- Attempt:只出现在配置了 neighbor 命令的 NBMA 网络中,表示正在主动向对方发送 Hello,但还没收到回应。
- Init:收到了对方发来的 Hello 报文,但自己的 Router ID 没有出现在对方的邻居列表里(也就是说对方还没"看见"自己)。
- 2-Way:双方互相在对方的邻居列表里看到了自己的 Router ID,双向通信确认成功。DR/BDR 选举在这个状态之后进行。
- ExStart:开始协商主从关系(Master/Slave),并确定初始的 DD 序列号。双方在这个阶段交换空的 DD 报文来"握手"。
- Exchange:正式交换链路状态通告(LSA)的摘要信息,也就是 DD 报文。
- Loading:根据 DD 摘要发现自己缺少的 LSA,向对方发送 LSR 请求完整的链路状态信息。
- Full:数据库同步完成,邻居关系建立成功,开始计算路由。
这个状态机就是一张现成的故障地图。比如邻居卡在 INIT,说明单向通信有问题——对方的 Hello 你能收到,但你的 Hello 对方没收到或者没收全,这时候就得去查入方向的问题,比如 ACL 过滤、被动接口、Hello 报文被丢弃等。
1.2 网络类型如何影响状态机的走向
网络类型在这个状态机里扮演的角色经常被忽视,但它实际上决定了状态机里好几个关键分支:
- 是否进行 DR/BDR 选举(Broadcast、NBMA 会选,Point-to-Point、Point-to-Multipoint 不选)
- 是否允许不配置 neighbor 命令(Broadcast、Point-to-Point 是自动发现,NBMA 必须手动指定)
- Hello 报文的目标地址(组播 224.0.0.5/224.0.0.6 还是单播)
- 默认的 Hello/Dead 间隔是否匹配
我见过太多案例是两端接口配置完全"看起来没问题",但就是邻居起不来,最后发现一边是物理接口默认的 Broadcast 网络类型,另一边是子接口或者隧道接口继承的 Point-to-Point,两边 Hello 报文发的目标地址都不一样,自然不可能建立起来。这种情况在状态机上往往表现为反复在 INIT 和 2-WAY 之间横跳,或者干脆一直是 DOWN。
所以我的建议是:排错第一步不是看配置,而是先在两端各跑一遍show ip ospf interface,确认网络类型、Hello/Dead 间隔、Area ID、Cost 这几个参数是否完全对齐。这一步做完,至少能筛掉 60% 以上的基础问题。
2. OSPF 的五种网络类型:每一种都有自己的"性格"
网络类型这个东西,很多教程把它放在很靠后的位置讲,但它实际决定了 OSPF 在该接口上的一切行为方式。我把它理解为:OSPF 想让邻居用什么样的"沟通方式"来交流。选对了,一切顺畅;选错了,即使物理链路通着,协议也可能完全起不来。
2.1 五种类型速览与关键差异
我把五种网络类型的关键参数整理成了一张表,排错的时候对照着看特别方便:
| 网络类型 | 默认Hello/Dead间隔 | DR选举 | 是否需要neighbor命令 | 报文发送方式 | 典型场景 |
|---|---|---|---|---|---|
| Broadcast(广播) | 10s / 40s | 需要 | 不需要 | 组播 224.0.0.5 | 以太网、VLAN 接口 |
| Point-to-Point(点对点) | 10s / 40s | 不需要 | 不需要 | 组播 224.0.0.5 | 串行链路、子接口、隧道 |
| NBMA(非广播多路访问) | 30s / 120s | 需要 | 需要 | 单播 | 帧中继、ATM、X.25 |
| Point-to-Multipoint(点对多点) | 30s / 120s | 不需要 | 不需要 | 组播(伪广播) | NBMA 网络建模为多个点对点链路 |
| Point-to-Multipoint Non-Broadcast(非广播点对多点) | 30s / 120s | 不需要 | 需要 | 单播 | NBMA 网络且不支持广播 |
这里有个很重要的细节:不同厂商对默认网络类型有不同偏好。比如思科设备上,物理以太网接口默认是 Broadcast,串行接口(HDLC/PPP封装)默认是 Point-to-Point,Loopback 接口默认是 Point-to-Point(华为设备默认是 Broadcast,但 Loopback 在 OSPF 中按 Stub 处理,Cost 固定为 1)。如果你做的是跨厂商互联,两端网络类型不一致的概率非常高,这是排错时脑子里必须绷紧的一根弦。
2.2 Broadcast 与 Point-to-Point:最常用的两个,也最容易踩坑
Broadcast 网络类型下,OSPF 会在一个多路访问网段里选举 DR/BDR,所有非 DR/BDR 路由器(称为 DRother)只和 DR/BDR 建立 Full 邻居关系,DRother 之间只停留在 2-Way。这样做是为了减少邻接关系的数量和 LSA 洪泛的开销。
但 DR 选举也带来了两个经典问题:
第一个问题是 DR 不稳定导致网络抖动。DR/BDR 选举优先级最高的路由器当选,但如果新加入的路由器优先级更高,它不会抢占现有 DR,只可能成为 BDR。然而一旦现有 DR 挂了,BDR 升级为 DR,新的 BDR 选举出来后,整个网段的邻接关系会重建一次。在一个业务繁忙的交换网络中,这种重建带来的 LSA 重新洪泛和 SPF 重算,会造成短暂的路由震荡。所以生产网络中我一般会手动指定 DR 优先级,让核心设备永远是 DR。
第二个问题是两台设备直连但网络类型用的是 Broadcast。因为 Broadcast 默认要选 DR,两台设备之间虽然物理上只有一个对端,但协议层面仍然会走"选举 DR → 与 DR 建立 Full → 数据库同步"这一整套流程。逻辑上没毛病,但多了一步选举,就多了出问题的可能。比如两台设备互指对方为 DR,或者因为 Hello 里带的优先级参数不一致导致两边对 DR/BDR 的认知不同步,邻接就停留在 2-Way 而不继续往前走。
Point-to-Point 就没有这些麻烦。它不选举 DR/BDR,两台设备之间直接建立 Full 邻接,LSA 洪泛更直接,收敛也更快。所以我在能用手动指定ip ospf network point-to-point的场景(尤其是两台设备通过以太网口直连,或者做 P2P 隧道互联)都会毫不犹豫地改掉默认的 Broadcast。唯一的代价是:如果这个物理接口后面接的其实是一个交换机(多设备接入),改成 point-to-point 就会导致只和对端一个设备建立邻居,其他设备全部失联。所以改之前必须确认拓扑确实是点对点。
2.3 NBMA 与 Point-to-Multipoint:老技术的新问题
帧中继和 ATM 现在用得少了,但我在不少金融和政企网络里还是能见到 NBMA 网络类型的身影。NBMA 最大的特点是:底层网络不支持广播,但拓扑上又可能是多路访问的,所以必须用neighbor命令手动指定对端 IP,OSPF 才会以单播方式向它发送 Hello 报文。
NBMA 场景下最经典的故障是:配置了 OSPF 但没有配 neighbor 命令,或者配了 neighbor 但地址写错,结果邻居状态一直停在 Down。还有一个隐蔽问题:NBMA 下 Hello 间隔默认是 30 秒,Dead 间隔是 120 秒,和 Broadcast 的 10/40 不一样。如果两端一个用的是默认 NBMA,另一个被改成了 Broadcast,两边 Hello 参数不匹配,邻居照样起不来。
现在更推荐的做法是用 Point-to-Multipoint(P2MP)来替代 NBMA。P2MP 会把一个多路访问网络建模成多个点对点链路来处理,不需要 DR 选举,也不需要手动配置 neighbor(只要底层支持伪广播),LSA 洪泛是逐链路进行的。在底层链路质量一般、带宽不均衡的场景下,P2MP 比 NBMA 要健壮得多。
如果你确实需要保留 NBMA(比如底层不支持组播),那记得检查这几个点:neighbor 命令有没有配全、单播能否双向互通、Hello/Dead 间隔是否匹配、DR 优先级是否有意设置过。
2.4 Loopback 接口的特殊处理
Loopback 接口在 OSPF 中的处理是很多人忽略的细节。思科设备上 Loopback 默认网络类型是 Point-to-Point,但华为设备默认是 Broadcast。更关键的区别在于Loopback 接口的 OSPF Cost:
- 思科设备:Loopback 接口默认 Cost 是 1,不随带宽变化。
- 华为设备:Loopback 接口默认按 Stub 处理,Cost 也是 1(但华为的 "stub" 概念下,该网段不会接收外部路由,只用于 Router ID 来源)。
Loopback 一个重要用途是作为 Router ID 的来源和 OSPF 的稳定性锚点。在配置 OSPF 时,我一般会强制指定 Router ID(用router-id命令),而不是依赖自动选举。因为自动选举的规则是"优先选最大的 Loopback 地址,其次选最大的物理接口地址",一旦接口地址发生变化,Router ID 就变了,所有邻居关系都会重建,这是生产环境不能接受的。
关于 Loopback 还有一个容易踩的坑:如果 Loopback 接口被宣告进了 OSPF,某些厂商设备默认会在 OSPF 里把它通告成 32 位主机路由(/32),即使实际配置的子网掩码不是 32 位。如果你希望 Loopback 对应的真实网段被通告出去,需要额外处理(比如华为上用network精确匹配,思科上用ip ospf network point-to-point加子网掩码的方式规避)。这个问题在跨厂商互联时很容易引发路由黑洞排查半天。
3. 实战排错:五类真实故障的完整排查链路
理论讲完,下面用一个模拟项目里的实际排错过程来串一遍。拓扑很简单:两台路由器通过以太网直连,分别属于两个不同部门的路由域,中间用 OSPF 建立邻居关系。我按照平时排错的顺序,把最常见的五个故障场景挨个捋一遍。
3.1 Hello 参数不匹配:卡在 Down 或反复在 Down/Init 之间切换
模拟项目 X 刚开始配置时,两台设备都启用了 OSPF,也在接口上宣告了网络,但邻居状态一直是 Down。我跑到设备上看show ip ospf neighbor,输出里只有本地 Router ID,对端完全不见踪影。
第一步先看两端接口的 OSPF 参数是否一致:
show ip ospf interface输出里重点对比:Area ID、网络类型、Hello/Dead 间隔、Cost、认证方式。果不其然,一端接口上因为历史原因被手动改过ip ospf hello-interval 30,另一端用的是默认 10 秒。Dead 间隔是 Hello 间隔的 4 倍,一端是 40 秒,另一端是 120 秒。OSPF 有一个硬性要求:两端 Hello/Dead 间隔必须完全一致,否则收到的 Hello 报文会被直接丢弃,邻居永远停留在 Down。
把 Hello 间隔改回 10 秒(或者两端统一改成一致的值)之后,邻居很快就进入 Full 了。这类问题有个特点:排错本身不难,但如果你不看show ip ospf interface,而是先去翻配置、抓包,会浪费很多时间。
注意:
show ip ospf interface是 OSPF 排错的第一命令,没有之一。它能把两端所有应该一致的参数一次全列出来。
3.2 网络类型不匹配:单边邻居或卡在 ExStart
第二个案例比较隐蔽。拓扑是两台路由器通过以太网口直连,通信完全正常,但 A 设备能看到 B,B 设备看不到 A(或者 A 显示邻居状态是 Full,B 显示是 Down)。这种"单边邻居"现象,十有八九是网络类型不匹配。
我们这边排查时发现,A 设备接口走的是默认 Broadcast,B 设备由于是隧道路由器,子接口继承的是隧道模板的 Point-to-Point。OSPF 在 Broadcast 类型下是往组播地址 224.0.0.5 发 Hello,而 Point-to-Point 类型下虽然也发组播,但两者对 Hello 报文的处理逻辑不同:Broadcast 类型要求收到 Hello 后先进行 DR 选举逻辑,Point-to-Point 类型不进行选举,直接尝试建立邻接。
结果就是:B 收到 A 的 Hello(因为组播地址一样),但它认为自己是 Point-to-Point,不选举 DR,直接尝试和 A 建立邻接。然而 A 认为自己是 Broadcast,必须经过选举流程,两边对"下一步该干什么"的理解完全不一致,于是一方认为已经 Full(B 侧单方面建立成功),另一方还卡在 ExStart 甚至 Down。
解决方式:把两端网络类型统一。既然是物理直连的两台设备,最简单的方式是两边都改成 Point-to-Point。针对模拟项目 X 里的场景,我用了如下配置(以思科语法为例,华为设备对应命令是ospf network-type p2p):
interface GigabitEthernet0/0 ip ospf network point-to-point改完后再看show ip ospf neighbor,两端同时进入 Full,路由表也正常了。
这里有个值得记住的经验:网络类型不匹配最常见的状态是双方都处于 ExStart/Exchange,并且反复重传 DD 报文。因为两边确认不了主从关系,DD 序列号对不上,就会一直卡在协商环节。所以看到 ExStart 卡住,第一反应应该是去查网络类型是否一致。
3.3 MTU 问题:卡在 Loading 或者反复重启邻接
第三个案例是两台设备能进入 Exchange 状态,但始终到不了 Loading/Full。抓包发现一方在持续发送 DD 报文(Database Description),另一方就是不应答,或者应答了又马上重新开始。
这类问题最常见的根因是MTU 不匹配。OSPF 在 Exchange 阶段发送的 DD 报文里,会携带一个接口的 MTU 值,叫做 Interface MTU 字段。如果收到的 DD 报文中的 MTU 字段大于本地接口的 MTU,接收方会直接丢弃该报文,导致 DD 交换永远无法完成。
我们在模拟项目 X 里就遇到过:A 设备接口 MTU 是 1500,B 设备接口 MTU 是 9000(为了传输大帧被改过)。B 发过来的 DD 报文里 MTU 字段是 9000,A 一看比自己的 1500 大,直接丢弃,于是 A 永远收不到 B 的 DD 报文,邻居关系卡在 ExStart。
排查方式很简单,抓包看 DD 报文里的 Interface MTU 字段,或者直接两端show ip interface对比 MTU。解决方式是统一两端 MTU,或者在某些厂商设备上可以关闭 DD 报文中的 MTU 校验(比如思科的ip ospf mtu-ignore,但我不建议一上来就ignore,那是治标不治本,统一 MTU 才是正解)。
注意:不是所有厂商都会因为 MTU 不匹配而拒绝 DD 报文。比如华为设备在收到较大 MTU 的 DD 报文时行为可能略有差异,但整体上统一 MTU 都是最稳妥的方案。
3.4 被动接口与静默接口:Hello 根本出不去
第四个案例更气人,配置看着全对,邻居状态却是 Down,show 命令里两端信息都正常,参数也对齐了,但就是收不到对方的 Hello。后来发现是接口被配成了被动接口(Passive-Interface)。
被动接口的作用是:让接口只接收 OSPF 路由信息而不发送 Hello 报文,也不建立邻居关系。这个特性本意是用在连接到终端用户的接口上,不让 OSPF 在用户网段里浪费带宽和资源。但如果误配到了互联接口上,效果就是邻居永远起不来。
排查方式:在设备上看 OSPF 进程配置里有没有passive-interface命令,或者用show ip ospf interface看输出里是否有 "No Hellos (Passive)" 之类的标识。解除方式是在需要建立邻居的接口上把被动模式去掉:
no passive-interface GigabitEthernet0/0华为设备上对应的是silent-interface命令,行为类似。一个小细节:有的厂商默认把所有接口设为被动接口(比如某些虚拟化网络设备),有的厂商默认关闭被动模式,这取决于具体设备型号和软件版本。所以跨厂商排错时,这个参数也是必查项。
3.5 认证不匹配与 Area ID 错配
最后一个案例放在一起讲,因为它们的表象很相似——邻居状态在 Down/Init 之间徘徊,日志里有 OSPF 邻居关系重置的消息。
认证不匹配(包括认证类型不匹配和密码不匹配)会导致 Hello 报文被直接丢弃。现在常用的有明文认证(simple)和 MD5/HMAC-SHA256 认证(message-digest)。排错时要看两端是否都启用了认证、认证类型是否一致、密码/密钥是否一致。尤其是跨厂商设备,密钥 ID 的索引位置不同也会导致认证失败,比如思科默认从 key 1 开始,华为也支持多 key,但实际生效的 key 取决于接口上引用的 keychain 配置。
Area ID 错配则是两端把接口宣告到了不同的区域,这种情况下邻居状态通常表现为 Down,两端的show ip ospf interface里 Area ID 字段不一致。OSPF 规定:只有处于相同区域的接口才能建立邻居关系。所以无论是 Area 0 还是其他区域,两端必须一致。这个用show ip ospf interface一眼就能看出来,但因为它太简单,反而容易被人忽略。
4. 排错工具箱:把经验固化成一套可复用的流程
讲到这里,把散落的经验整理成一套可以反复使用的排查流程和工具清单。
4.1 两台设备之间做对比检查的黄金命令集
| 检查项 | 思科命令 | 华为命令 | 重点看什么 |
|---|---|---|---|
| 邻居状态 | show ip ospf neighbor | display ospf peer | 状态是否稳定在 Full |
| 接口参数 | show ip ospf interface | display ospf interface | Area ID、网络类型、Hello/Dead、Cost、认证 |
| 进程信息 | show ip ospf | display ospf | Router ID、区域数量、SPF 统计 |
| 路由是否正常 | show ip route ospf | display ip routing-table protocol ospf | OSPF 路由是否出现在路由表 |
| 运行日志 | show log | display logbuffer | 有无邻居状态变化、认证失败的记录 |
排错时我强烈建议:不要只看一边,两台设备都要跑一遍同样的命令,然后逐项对比。百分之九十的 OSPF 邻居问题,本质都是两边的某些参数不一致。只要把两边参数摆在同一个屏幕里对比,答案通常自己就出来了。
4.2 调试命令的正确打开方式
当 show 命令看不出问题、但邻居确实建立不起来时,就该上调试命令了。不过调试命令在生产网络上要极度谨慎,调试输出本身会消耗设备 CPU,在业务高峰期甚至能拖垮设备。
比较安全的调试命令是:
debug ip ospf hello它只输出 Hello 报文的接收/发送的摘要信息,开销相对较低,能快速判断"Hello 是否在发、是否在收、收到了之后为什么被丢弃"。
更深入的是:
debug ip ospf adj这个命令会输出邻居状态机的转移过程和原因,比如 "Nbr 1.1.1.1: state changed to ExStart"、"Build the summary LSA" 等信息,能精准定位状态卡在哪一步。
华为设备对应的是debugging ospf hello和debugging ospf adjacency,机制类似。
调试命令的使用注意:开了调试之后,记得第一时间复现问题或者等待几秒让问题自然暴露,然后立刻执行undebug all关掉调试。我见过不止一次有人开了 debug 忘关,直接导致设备 CPU 飙高,业务中断。这是比较低级但后果严重的失误。
4.3 一页纸的故障速查表
我把排查 OSPF 邻居关系故障时常用的判断逻辑整理成一个速查表,分享出来,大家可以打印出来贴在工位上:
| 邻居状态 | 大概率原因 | 下一步做什么 |
|---|---|---|
| Down | Hello 没收到;被动接口;ACL;认证失败;区域不对 | show ip ospf interface 对比参数 |
| Init | 单向通信:你的 Hello 对方没收到 | 检查入方向 ACL、广播域、组播是否被过滤 |
| 2-Way | 正常(DRother 间应停在这里);如果是两台设备却一直 2-Way | 检查是否一侧网络类型是 Broadcast 而实际不是多路访问 |
| ExStart/Exchange | 主从协商失败;DD 报文 MTU 不匹配 | 抓包看 DD 报文;对比两端 MTU |
| Loading | LSR/LSU 交换失败;可能是 LSDB 不同步 | 查看 LSDB、检查 LSA 校验或认证 |
| 反复 Full↔Down | 接口不稳定;Dead 间隔太短;物理抖动 | 查日志、查接口错误计数、延长 Dead 间隔观察 |
这张表总结的是我这些年最常见的场景,虽然不是覆盖所有可能,但覆盖了 95% 的实际案例。在此基础上再结合具体设备输出做判断,效率会高很多。
4.4 几个容易被忽略的隐性因素
除了上面表格里的内容,还有几个隐性因素值得单独提出来:
Router ID 冲突。两台路由器的 Router ID 如果一样,OSPF 邻居关系会在建立过程中反复重置,日志里会出现 "Router ID conflict" 提示。这个在搬配置、复制配置的时候特别容易发生,排查时直接show ip ospf对比两边 Router ID 就能发现。
组播地址被过滤。OSPF 使用的组播地址是 224.0.0.5(所有 OSPF 路由器)和 224.0.0.6(DR/BDR),如果中间有交换机配置了组播过滤策略、或者端口 VLAN 划分有问题,Hello 报文可能到不了对端。这种问题在物理接口完全正常、参数完全一致的情况下最容易迷惑人,需要抓包确认 Hello 是否真的到了对端接口。
Virtual Link 与区域 0 的特殊性。如果两台设备通过区域 0 之外的区域互联,又需要通过 Virtual Link 连接到骨干区域,Virtual Link 的配置错误(比如对端 Router ID 写错)会导致区域间路由异常。这类问题从邻居状态上不容易看出来(邻居可能是 Full 的),但路由表里会出现区域间路由缺失。遇到这种情况,直接检查 Virtual Link 配置和该链路的传输区域状态。
5. 关于网络类型选择与配置调整的几条实战建议
篇幅有限,最后把网络类型选择方面我认为最值得记住的几条建议完整地放出来。这些都是实际项目中踩过坑之后的沉淀,如果你正打算调整 OSPF 网络类型,可以参考一下。
两台设备直连的以太网接口,建议改成 Point-to-Point。这是最简单也最有效的优化。不需要 DR 选举,邻居建立更快,LSA 洪泛更直接,排错也少了一个需要对齐的参数。尤其是在设备间互联、核心到汇聚这类点对点拓扑中,这个改动几乎是零风险。唯一要确认的是:该接口下确实只有一台对端设备。
多路访问网络(交换机接多台路由器)保持 Broadcast。这种拓扑下 DR 选举是必要的,否则每对设备之间都要建立 Full 邻接,DBD 交换和 LSA 洪泛量会成倍增长。DR 选举能有效减少邻接数量。此时的关键是合理规划 DR 优先级,让性能强、业务重要的设备成为 DR/BDR,避免 DR 频繁切换。
NBMA 时代留下的配置模板要定期清理。我在不少老项目里见过一种情况:接口底下的配置从帧中继时代继承下来,一直带着ip ospf network non-broadcast和几条neighbor命令,但实际链路早已换成了以太网或 MPLS 承载。这种配置不会导致立即故障(因为接口变了,命令可能不再生效),但它会让排错者困惑,也会导致新接手的人误判网络类型。清理这一类历史遗留配置,值得列入网络巡检的固定项目。
跨厂商互联,网络类型必须写成显式配置。不要依赖默认值。思科、华为、华三、瞻博网络对同一物理链路的默认网络类型可能不同,唯一稳妥的做法是在互联接口上显式指定网络类型和 Hello/Dead 间隔,让两台设备的配置有据可查、逐行对齐。这一步省下来的排错时间,远超那几分钟敲配置的成本。
改任何 OSPF 参数,记着先看影响范围。网络类型、Hello/Dead 间隔、Cost、MTU 这些改动都会导致邻居关系重置。如果是在核心链路上操作,建议先在变更窗口执行,并且提前准备好回退方案。OSPF 本身有收敛机制,短时间的重建不会丢路由,但如果赶上大规模重算,对正在跑的流量还是有影响的。我在实际操作中习惯于用两条命令快速确认改动结果:改完参数后立刻show ip ospf neighbor,再结合show ip route ospf确认路由没丢。
6. 一个真实排错案例的完整复盘
把上面的经验串起来,最后分享一个模拟项目 X 里最有代表性的排错过程,完整复盘一遍,帮助理解整套排查思路的操作顺序。
某天晚上接到反馈,两个办公区域之间的网络不通,路由表里没有对方的网段。登录设备后先做常规检查:物理接口 up、状态正常,两端 IP 能互相 ping 通,但 OSPF 邻居就是没有建立。
我按顺序跑了一组命令:
第一步,show ip ospf neighbor——没有任何邻居,连 Down 状态的对端都没显示。这说明 OSPF 根本没收到对端的 Hello。
第二步,show ip ospf interface——A 端显示网络类型是 Broadcast,Hello 间隔 10 秒,Dead 间隔 40 秒,Area 0。B 端显示网络类型是 Point-to-Point,Hello 间隔 10 秒,Dead 间隔 40 秒,Area 0。网络类型不一致,问题定位到了。
第三步,确认拓扑——两边是不是真的物理直连?是。那直接把网络类型统一成 Point-to-Point 就是最合理的解法。
第四步,确认操作影响——该接口下面没有其他设备,改成 Point-to-Point 不会影响其他邻居。执行配置修改。
第五步,验证——两边各跑一次show ip ospf neighbor,都看到对方进入 Full 状态;show ip route ospf里对方的网段也出现了。业务恢复,问题闭环。
整个过程大约 15 分钟,真正花时间的不是敲命令,而是第一步到第二步之间,我没有先去翻配置文档,而是直接靠状态机的逻辑判断:"没有邻居 = Hello 没被接受 = 参数可能不一致",然后用show ip ospf interface快速验证。OSPF 排错的核心不是背命令,而是理解状态机每一步的要求,然后用最少的命令快速缩小故障域。
这个案例也印证了一个观点:网络类型不匹配是最隐蔽、也最容易导致"单边邻居"或者"邻居一直起不来"的问题,排查 OSPF 问题时,网络类型和 Hello/Dead 间隔永远是最先要对比的参数。把这个习惯固化了,OSPF 排错的效率至少能提升一倍。