
做网络这行OSPF基本是绕不开的必修课。不管是园区网的骨干、数据中心的出口还是运营商的核心域OSPF这个链路状态路由协议的身影几乎无处不在。前阵子我搭了一套OSPF综合实验环境把多区域设计、ABR区域边界路由、MSTP二层冗余、VRRP网关冗余、路由互通这些点全揉在一起跑了一遍顺手把过程中踩过的坑、查错的方法也都记了下来。这篇就当一份完整的OSPF综合实验报告来写适合正在学路由交换的工程师、准备HCIP/CCNP考试的人以及被生产环境OSPF故障折腾过的同行参考。文里所有命令我都按华为VRP风格写思科IOS里基本能一一对应思路是通用的。1. 实验目标与拓扑设计思路1.1 综合实验要解决什么问题单独配OSPF的人很多但一遇到“多区域网关冗余二层多实例”混在一起思路就开始乱。我做这个实验的动机很直接把课本上零散的知识点串成一条完整的链路看看OSPF在真实组网里到底是怎么和下层协议打配合的。实验核心目标有三个验证多区域OSPF的路由传递与ABR工作逻辑搞清楚Type1、Type2、Type3、Type5这些LSA到底在什么场景下出现。在接入层引入MSTP和VRRP让二层环路消除、网关冗余与三层路由形成一个闭环模拟生产环境里最常见的“核心-汇聚-接入”结构。建立一套可复用的OSPF排错方法重点练“看error表、打debug、再决定要不要抓包”这个查问题思路。这套实验做完你对OSPF的认知会从“能配通”升级到“知道它为什么这么设计”碰到邻居起不来、路由学不到、流量来回绕这类问题至少知道第一步该看哪儿。1.2 设备选型与拓扑规划我习惯用华为eNSP搭这种综合实验免费、轻量能跑OSPF、MSTP、VRRP三大件。拓扑是典型的“三核心双汇聚多接入”结构稍微收敛了一下规模但协议行为和生产环境完全一致。规划表如下角色设备名所在区域关键接口用途骨干核心R1Area 0Lo0: 1.1.1.1/32骨干路由与Router-ID骨干核心R2Area 0Lo0: 2.2.2.2/32骨干路由与Router-ID区域边界R3Area 0 Area 1Lo0: 3.3.3.3/32ABR连接业务区区域边界R4Area 0 Area 1Lo0: 4.4.4.4/32ABR连接业务区汇聚SW1三层网关Vlanif10/Vlanif20VRRP主网关汇聚SW2三层网关Vlanif10/Vlanif20VRRP备网关接入SW3/SW4二层接入下联PCMSTP接入端口区域划分上Area 0放核心路由器Area 1放业务VLAN和汇聚网关。这样的好处是业务振荡只影响Area 1内部Area 0的SPF重算次数少很多这也正好能演示ABR的路由汇总和区域间防环机制。1.3 地址规划与Router-ID设计地址规划我按“环回口标识设备、互联地址用30位掩码、业务地址按VLAN聚合”来排。这里想单独说下Router-ID因为热词里有人专门拿“OSPF 1 router-id 1.1.1.1”来问说明很多人对这个参数的理解还停留在“随便填一个IP”的层面。Router-ID本质是OSPF进程的唯一标识每台设备必须全局唯一。它有三个来源按优先级排序手动配置的router-id、最大的环回口地址、最大的物理接口地址。手动配置永远是最稳的做法。router id 1.1.1.1 ospf 1 router-id 1.1.1.1为什么实验里都用1.1.1.1、2.2.2.2这种地址因为环回口地址伪装成“设备ID”最直观。以后看show ip ospf neighbor时邻居列里全是1.1.1.1、2.2.2.2这种一眼能认出来的标识比记一串物理地址舒服多了。而且Router-ID的变化会导致OSPF进程重启重置邻居关系生产环境里如果Router-ID漂了整个区域都要重新收敛这是必须避开的坑。2. OSPF核心配置与邻居建立全过程2.1 基础配置先让所有直连链路跑起来配置顺序我建议从骨干往边缘推。先给每台设备设置好router-id再把Area 0的互联接口宣告进OSPF进程。R1的核心配置interface GigabitEthernet0/0/0 ip address 10.0.12.1 255.255.255.252 interface LoopBack0 ip address 1.1.1.1 255.255.255.255 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.0.12.0 0.0.0.3 network 1.1.1.1 0.0.0.0注意network命令里的反掩码0.0.0.3对应30位掩码0.0.0.0对应精确匹配32位主机路由。反掩码写错是最常见的入门错误我见过不少人把0.0.0.255当通用掩码用结果把无关接口全宣告进OSPFLSDB里多出一堆莫名其妙的链路。宣告环回口有个实际好处OSPF会把它当作一条直连路由发布稳定性极好也方便后续做Router-ID管理和路由汇总测试。生产环境建议所有设备的环回口地址都规划成连续的/32地址段管理、排错、路由汇总都好办。2.2 ABR与多区域配置的核心逻辑Area 0建好之后把R3、R4接Area 1的接口加进来这两个设备就自动成为ABR。ABR的工作逻辑是为每个区域维护独立的LSDB在区域之间只传递汇总后的Type3 LSA不把区域内部的明细路由全部倒灌进骨干区。R3的配置ospf 1 router-id 3.3.3.3 area 0.0.0.0 network 10.0.13.0 0.0.0.3 network 3.3.3.3 0.0.0.0 area 0.0.0.1 network 172.16.1.0 0.0.0.3这里有个值得注意的点同一台设备上多个区域跑在同一个OSPF进程里区域间的路由学习依赖ABR上的区域间路由计算。ABR从Area 1学到一条业务路由后会以Type3 LSA的形式通告给Area 0反之亦然。实验里验证一下LSDB就能看到差别。在R1上执行display ospf lsdb你会同时看到Type1本区域路由器信息、Type2广播网段DR信息、Type3区域间路由汇总、Type5外部路由。而R3上area 1的LSDB里则能看到Type1、Type2、Type3区域设计不同LSDB的构成也不同这对理解OSPF的可扩展性非常有帮助。2.3 邻居状态机从Down到Full的每一步配完配置不等于万事大吉。OSPF邻居的建立过程是从Down到Init、2-Way、ExStart、Exchange、Loading最后到Full。我在实验里特意在R4和SW1之间做了一次手工邻居重置把整个状态机走了一遍R4 reset ospf process Warning: All OSPF processes will be reset. Continue? [Y/N]:Y在R4上持续观察邻居状态变化R4 display ospf peer OSPF Process 1 with Router ID 4.4.4.4 Neighbor is 10.0.14.2, vlanif address Vlanif14 Neighbor State: Full正常的链路双方会快速冲过ExStart和Exchange阶段进入Full整个过程一般一秒内完成。如果状态卡住了八成是MTU、认证、区域ID或者hello/dead参数不一致。这些坑我后面专门开了一节讲排错思路是咱这篇文章的重头戏。3. OSPF与MSTP、VRRP的综合联动3.1 为什么实验要拉上MSTP和VRRP很多人以为OSPF只是路由协议和二层协议没关系。但实际生产网络里核心跑OSPF、汇聚做网关冗余、接入跑MSTP防环是再常见不过的组合。单独练OSPF就像只练发动机不装车上了路才知道变速箱和悬挂的配合有多重要。MSTP解决的是二层环路问题。多实例划分后不同VLAN可以走不同链路上行既避免了环路又做了负载分担。VRRP解决的是网关冗余问题两个汇聚交换机共享一个虚拟IP主设备挂了备设备无缝接管终端用户完全无感知。OSPF、MSTP、VRRP三者的联动逻辑是MSTP保证二层转发路径无环VRRP保证终端网关高可用OSPF保证不同网络间的路由可达。三层和二层各司其职又互相影响。3.2 VRRP与OSPF的联动配置要点汇聚设备SW1和SW2上业务VLAN的网关就是VRRP虚拟IP。以VLAN10为例VRRP主设备的优先级调高让它成为默认转发网关。SW1上的VRRP配置interface Vlanif10 ip address 192.168.10.2 255.255.255.0 vrrp vrid 10 virtual-ip 192.168.10.254 vrrp vrid 10 priority 120 vrrp vrid 10 preempt-mode timer delay 20SW2上的VRRP配置与SW1基本一致只是优先级保持默认100vrid、虚拟IP都相同。VRRP需要注意的是虚拟IP对应的物理端口上不要开OSPF否则会把自己的虚拟IP也宣告进路由表产生无谓的次优路径。然后OSPF在汇聚设备上只宣告物理网段的地址不宣告VRRP虚拟IP。汇聚设备与核心之间的上行链路跑OSPF保证Area 1内部业务路由能传递到Area 0。这里的关键是VRRP切换发生在二层影响的是终端网关OSPF收敛发生在三层影响的是跨网段路由两者独立但又互相配合。实验里我验证了一个很经典的场景手动把SW1的Vlanif10接口shutdown观察VRRP主备切换再观察R1上业务路由是否仍然可达。实测结果是流量无缝切换PC持续ping不丢包这是因为VRRP切换到SW2后SW2本来就有OSPF路由通告跨网段路径不需要重新学习。3.3 MSTP多实例与上行链路的关联MSTP配置上我给VLAN10和VLAN20分别规划了实例1和实例2让两个实例的主根桥分别落在SW1和SW2上实现上行链路负载分担。配置如下stp region-configuration region-name LAB revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configuration stp instance 1 root primary stp instance 2 root secondarySW2上的实例根桥设置相反。接入交换机SW3、SW4不参与根桥选举保持默认优先级即可。MSTP和OSPF组合实验里最容易忽略的点是汇聚设备上三层接口的VLAN划分必须和MSTP实例的VLAN划分一致。比如VLAN10跑在实例1里那SW1对VLAN10的三层网关接口就属于实例1的转发域。如果实例和VLAN对应关系错乱二层阻塞端口会引发三层路由的震荡出现“路由表一直有但数据包就是丢”的诡异现象。这个坑我当年在生产上遇到过现象是数据面丢包严重控制面OSPF邻居却一直Full。排到最后发现是MSTP实例划分错误导致下行端口阻塞上行链路流量被二层堵死OSPF的hello包也发不出去。三层好用但二层不稳路由照样白搭。4. 故障排查实战error表、debug与抓包4.1 先看OSPF Error表排错的第一站文章热词里提到“OSPF error表里面查问题老清晰了”我可以负责任地说这确实是排错时性价比最高的第一步。很多人一上来就抓包或者一顿debug信息量大但噪音也大反而不如在error表里看计数器有没有非零项来得直接。在R4上执行查看OSPF错误统计R4 display ospf error OSPF Process 1 with Router ID 4.4.4.4 OSPF Error Statistics General Errors -------------------------------------------------------------------- Error Type Counter -------------------------------------------------------------------- Hello: Destination address error 0 Hello: Network mask error 0 Hello: Area ID error 0 Hello: Auth type error 0 Neighbor state error 0 ExStart state error 0 Exchange state error 0 Loading state error 0看明白没有这表把最常见的OSPF格式错误逐项列了出来。Hello报文里的目的地址错误、网络掩码不匹配、区域ID错误、认证类型错误还有邻居状态卡死导致的ExStart/Exchange/Loading错误全都有对应计数器。哪项非零问题就在哪根本不用瞎猜。我在实验中人为制造过一个故障把R4连接SW1的接口掩码从255.255.255.252误配成255.255.255.0。然后看error表Hello: Network mask error 8计数从0开始增长说明Hello报文一直在被丢弃原因就是网络掩码不匹配。这种问题在display ospf neighbor里看邻居状态一直是Down百思不得其解结果error表一眼就看出答案。4.2 关键时刻用debug控制好范围和时间error表给方向debug给细节。常见场景是邻居状态卡在ExStart/Exchangeerror表里ExStart state error计数非零但具体原因还不够明确这时候就需要debug看报文交互过程。R4 debug ospf packet R4 terminal monitordebug ospf packet会打印收发OSPF报文的信息包括报文类型、源地址、目的地址、长度等。如果是MTU问题你会看到双方在Exchange阶段反复发送Database Description报文但始终无法完成协商。看到类似“Large packet”或“MD5 checksum error”这类关键词方向基本就明确了。这里必须强调一个经验生产环境打debug一定慎之又慎。OSPF的debug输出非常密集一个小型网络每秒都能刷出几十行直接导致设备CPU飙升严重时会把控制面打瘫。我的习惯是先用error表缩小范围再决定是否开debug。debug只针对特定邻居不要全局开。华为设备可以执行debug ospf packet 10.0.14.2限制源地址。开三到五秒就undo确认问题后立即关闭。terminal monitor必须配套打开否则debug信息不会显示在终端上。能不开抓包就不开这也回应了热词里那句“抓包都不用”。大多数OSPF问题通过error表和debug就能定位抓包一般留到需要分析具体报文字段、确认异常厂商实现时才上。4.3 抓包在什么情况下才真正需要不是说抓包没用而是说它应该是最后一招不是第一招。我在实验里确实做了一次抓包场景是两台设备都配置了OSPF认证但一方MD5密码还带空格另一方密码正确。这种情况下error表Auth type error计数可能不涨debug又只是反复看到重传用Wireshark看报文才能确认“Authentication”字段一直不通过。如果你需要抓包最简单的办法是让设备把收发的OSPF报文镜像出来。华为设备上通过流量镜像把接口的报文复制到监控口或者直接在PC上起Wireshark截获直连链路报文。看OSPF报文时主要关注三个字段关注点期望结果异常信号Hello间隔双方一致收到陌生间隔的HelloDead间隔双方一致邻居状态周期性震荡认证信息一致且无乱码密文不匹配报文频繁重传Database Description序列号有序递增序列号乱跳ExStart反复协商不过说真的在80%以上的OSPF故障里error表和debug足够了。抓包更像是一次“眼见为实”的验证而不是日常排查的起点。5. 综合实验里的常见坑与避坑指南5.1 邻居卡在ExStart/Exchange怎么办实验中最常见的“卡住”场景就是邻居卡在ExStart双方反复交换Database Description报文却始终无法进入Exchange。排这种问题我总结了一套固定的动作第一时间看error表确认ExStart state error是否持续增长。检查两端接口的MTU是否一致这是ExStart卡死的头号原因。检查认证配置两边密码类型和密文内容必须一致。确认区域ID相同OSPF进程里配的area不能一边是area 0一边是area 1。检查hello/dead间隔两边不一致也会导致状态反复回到Down。MTU不一致的典型表现是小包正常、大包丢失。OSPF的报文是可以超过1500字节的处理MTU的方式是在Database Description报文里携带接口MTU字段双方协商失败就会卡在ExStart。解决方法是统一两端接口MTU华为设备上直接设置interface GigabitEthernet0/0/1 mtu 1500注意修改MTU会清空接口的OSPF邻接关系重新建立一次是正常的不用慌。5.2 Hello包发不过去排查顺序建议还有一种“邻居完全起不来”的情况Hello包一直发但对方就是收不到。我建议按下面的顺序排查先查物理链路和接口状态这是第一层。很多人忘了看接口是不是UPOSPF配置再对也没用。再查VLAN划分接口所在VLAN必须和需要通信的对端一致这个在综合实验里特别容易错。然后查ACL或防火墙策略是否有规则丢掉了组播地址224.0.0.5和224.0.0.6的报文。最后再回头看OSPF本身的配置。还有一个和MSTP相关的隐藏坑接入设备上如果没开STP或者MSTP实例划分不对二层环路的报文风暴会把OSPF的组播报文也淹了邻居关系表现为时好时坏。这种问题看error表、看debug都不容易发现反而是看二层接口的丢包计数和广播风暴特征更有效。5.3 区域设计与路由汇总的规划问题最后说说规划层面的坑。多区域OSPF实验里最容易出现的问题是Area 0中断裂。OSPF要求所有非骨干区域必须与Area 0直接相连如果Area 1只通过Area 50连到Area 0那这种“非骨干区域串联”的拓扑在标准OSPF里就是非法的会出现区域间路由无法学习的情况。实验里的正解是坚持星型结构Area 0在中心所有非骨干区域从Area 0伸出来。ABR上还可以顺手做路由汇总把Area 1的多个业务网段汇总成一条Type3 LSA通告到骨干区。这里能明显看到效果汇总后Area 0中LSDB里的Type3 LSA数量大幅下降骨干路由器的路由表也清爽很多。5.4 综合实验里我最后想提的三个经验第一个经验配置一定要标准化。Router-ID手动配置、环回口单独规划、接口描述写清楚这些细节看着不起眼但在综合实验里能省大量排查时间。我见过太多人配OSPF不写描述网段一多自己都分不清哪个端口接哪台设备。第二个经验排错顺序比排错命令更重要。我的固定顺序是邻居状态看display ospf peer、错误原因看display ospf error、细节看debug、实在不行才抓包。按这个顺序走90%的问题在第二步就能定位debug开错位置、抓包白抓的情况会少很多。第三个经验做完实验一定要做破坏性验证。把主用链路shutdown、把VRRP主设备重启、把ABR踢出区域每个故障场景都跑一遍观察路由收敛和恢复过程。这一轮下来你对OSPF的理解深度会比配十遍配置都管用。整套实验做完我个人最深的感受是OSPF排错跟看病差不多先量体温看error表不行再照CT开debug抓包属于最后下诊断书的手段。工具不在多关键的几下能打到点子上就行。如果这篇文章对你搭自己的OSPF实验有帮助或者你遇到过更奇葩的邻居状态、路由陷阱欢迎照着这套思路再验证一遍踩过一次的坑下次就认识路了。