
1. 为什么值得专门做一轮OSPF练习1.1 从背概念到上设备中间缺的就是这轮练习我见过太多人学OSPF理论知识背得滚瓜烂熟五种报文、状态机、DR选举、LSA类型考试题能做对但一坐到设备前面就懵了。让他配一个最简单的双路由器OSPF邻居可能要在接口宣告和网络类型上折腾半天让他排查邻居起不来的问题更是只能靠猜。说到底OSPF这个协议从原理到落地中间隔着一层“实操手感”。报文怎么交互、邻居状态怎么迁移、路由怎么计算这些只有你在模拟器或者真机上亲手配一遍、敲命令看一遍输出、故意改错再排错一遍才能真正内化。这一轮练习就是把你脑子里的“理论地图”和设备的“实际表现”打通的过程。我自己是考HCIP之前专门抽了一个周末做OSPF专项练习的从单区域到多区域、从邻居建立到路由过滤、再到和BGP做路由控制联动全部在华为ensp上过了一遍。练完之后再回头看理论很多以前死记硬背的东西突然就有了逻辑排错也不再是无头苍蝇。所以这篇内容就是把我那轮练习的设计思路、配置细节、踩过的坑完整拆出来给同样在学OSPF、准备HCIP或者工作中需要用到OSFP的人一个可以直接照着做的参考。1.2 这轮练习到底要解决什么问题先说清楚练习目标。如果你是零基础别上来就搞一堆复杂拓扑先把最简单的邻居建立和路由学习跑通如果你已经在工作或者准备HCIP认证那就得多区域、外部路由、路由控制、协议联动一起上。我这次练习主要围绕下面几个点展开搞懂OSPF进程号和区域号的区别这是配置里最容易含糊的地方熟练完成邻居建立与DR/BDR选举能解释清楚每一个状态变化理解五种OSPF报文在邻居建立和LSDB同步过程中的具体作用掌握多区域设计和常用特殊区域的使用场景学会外部路由引入以及OSPF和BGP互通时的路由控制方法建立一套排错思路先查error表还是先debug、什么时候需要抓包。这些点不是割裂的它们是同一条线把OSPF从“能配上”推到“能控、能排错”。一轮练习下来你对OSPF的理解应该是立体的而不是只会敲几条命令。2. 练习环境与拓扑规划2.1 模拟器选型为什么用ensp而不是其他环境练OSPF我推荐用华为ensp原因很实际免费、轻量、命令风格和真机一致而且HCIP考试用的就是华为体系ensp里敲的命令和考试、日常设备运维基本通用。虽然GNS3、EVE-NG也能跑OSPF但要么需要自己找镜像要么操作界面更重对初学者不友好。ensp的缺点是模拟器自身偶尔有占用CPU高的问题建议把不需要的设备先关机拓扑不要一次开太多。设备选型上用AR2220就够这台虚拟路由器支持的功能全OSPF、BGP、路由策略都能练。交换机在这个练习里不是必需品除非你想单独验证广播网络里的DR选举用三台路由器连到一个交换机也能达到同样效果。我的建议是如果主要练OSPF协议本身全路由器拓扑最干净排错也简单。2.2 拓扑怎么设计才能覆盖大部分练习点练习OSPF不能被配置命令牵着走得先有拓扑规划。我这次用的是四台路由器组成的混合拓扑R1和R2之间用点到点链路连接同属区域0R1再接一台R3R3属于区域1这样R1就是ABRR4挂在R2下面模拟ASBR负责引入外部路由所有路由器用loopback接口模拟业务网段互联地址统一用30位掩码。这个拓扑看起来不大但能覆盖绝大多数OSPF练习场景区域0和区域1的互通、ABR上的区域间路由、ASBR上的外部路由引入、R2和R3之间如果加一个交换机还能模拟广播网络做DR选举。更重要的是拓扑小意味着出问题时容易定位适合一轮练习反复折腾。2.3 地址规划与初始配置地址规划直接影响排错效率。我给每台设备的loopback0分配了独立的32位地址互联地址按链路编号设备Loopback0互联接口对端设备R11.1.1.1/3210.0.12.1/30R2R11.1.1.1/3210.0.13.1/30R3R22.2.2.2/3210.0.12.2/30R1R22.2.2.2/3210.0.24.2/30R4R33.3.3.3/3210.0.13.3/30R1R44.4.4.4/3210.0.24.4/30R2初始配置很简单先把接口地址配好加上接口描述不要急着配OSPFsys sysname R1 interface GigabitEthernet0/0/0 description To-R2 ip address 10.0.12.1 255.255.255.252 interface GigabitEthernet0/0/1 description To-R3 ip address 10.0.13.1 255.255.255.252 interface LoopBack0 ip address 1.1.1.1 255.255.255.255为什么用30位掩码做互联地址一是节省地址空间二是点对点链路不需要那么多主机位路由表也更干净。loopback用32位是为了让设备始终有一条稳定的 Router-ID 候选地址也能模拟真实网络里的业务地址。接口描述很多人会忽略但真出问题的时候display interface 里能一眼看出这条线是连到哪台设备的省下的时间远超配置那几秒钟。3. 基础练习进程号、区域号、Router-ID与邻居建立3.1 进程号的真相本地隔离不是两端必须相同OSPF进程号是在一台设备上运行的OSPF实例编号它最重要的作用是本地隔离。同一台路由器可以同时跑多个OSPF进程进程之间互不影响路由表可以分别维护。有个经典误解是“两台设备要建立OSPF邻居进程号必须一致”——实际上不是进程号只在本地有意义R1用进程1R2用进程2只要区域、认证、hello参数匹配一样能建立邻居。但为什么实际配置里大家都会写一致因为维护方便。你想象一下半年后回头看配置R1上是ospf 1R2上是ospf 5不查文档根本想不起来为什么这么分。所以结论是进程号不同也能建邻居但工程上建议全网统一规划一个网络里用同一个进程号除非你有做多进程路由隔离的特殊需求。多进程的另一个用途是路由引入。比如你希望R1同时运行OSPF和另一个动态协议再把两边路由互相引入这时多进程就派上用场了。新手练习阶段统一用ospf 1就好把精力放在区域和宣告上。3.2 区域号这是OSPF能撑起大网络的根本区域号和进程号最大的区别在于区域号是两台设备之间必须匹配的而且它有明确的设计规则。OSPF规定区域0是骨干区域其他非骨干区域必须直接连接到区域0不能出现非骨干区域之间直接相连的路由。这是因为OSPF要求所有区域间路由必须经过骨干区域转发才能避免环路。我用area 0和area 1练习时专门验证过一个现象如果把R3的区域从1改成2并且R1上不建区域2R3的邻居就会一直卡在Init或Down因为区域ID不匹配。华为设备的display ospf peer里邻居状态迟迟不进Full第一步就该查区域号。还有一个细节值得注意一台路由器如果同时属于多个区域它就是ABR会维护多张LSDB分别对应每个区域。ABR产生的3类LSA负责把区域间路由传递给其他区域。练习时你可以故意在R1上只宣告区域0然后看R3能不能学到区域0的路由答案是不能因为ABR只把已宣告区域的LSA转换成3类LSA传播。这个实验做完你对“区域”这个概念的理解会深很多。3.3 Router-ID选错之后连邻居都建立不了Router-ID是OSPF路由器的身份标识在一个OSPF域内必须唯一。华为设备的Router-ID选取规则有优先级手工配置的Router-ID最优先其次是loopback接口上最大的IP地址再次是物理接口上最大的IP地址。如果这些地址后来变了Router-ID不会自动跟随变化仍然用旧的除非你重置OSPF进程。练习时最容易踩的坑是两台设备忘记了配Router-ID结果系统自动选了物理接口地址恰好地址冲突邻居就一直起不来。所以我的建议是配置OSPF时第一件事就是手工指定Router-ID用loopback0的地址并且写清楚避免设备自动选择带来的不确定性。Router-ID一旦发生变化OSPF进程需要重建所有邻居关系影响很大。生产环境里改Router-ID前一定要先看有没有业务路由依赖这台设备。练习环境无所谓随便折腾但养成“先规划Router-ID再配OSPF”的习惯不会错。华为设备查看Router-ID的命令是display ospf能看到进程的Router-ID和运行状态。这个输出里还能看到SPF计算次数练完路由震荡后再看这个数能直观感受到路由变化触发了多少次SPF重算。3.4 network宣告与反掩码宣告范围宁小勿大配置OSPF时network命令是理解门槛最低也最容易出错的一步。它后面的通配符掩码反掩码和ACL里的反掩码是一个概念0代表必须匹配的位255代表可以忽略的位。比如宣告loopback0写成network 1.1.1.1 0.0.0.0意思就是只宣告1.1.1.1这个地址。互连链路要宣告的是链路所在网段比如network 10.0.12.0 0.0.0.3。反掩码计算有个笨办法把255.255.255.252转换成二进制通配符就是“0的位必须精确匹配1的位随意”。30位掩码对应反掩码0.0.0.3因为最后两位是主机位可以变化。刚开始不熟的时候我建议你在纸上把二进制写一遍练三五次就记住了别硬背。宣告范围的控制很重要。华为OSPF在收到network命令后会把落在通配符范围内的、已经配置了IP地址且接口up的网段加进OSPF。如果你宣告得太宽比如network 10.0.0.0 0.0.255.255会把一堆不相关的接口都拉进OSPF路由表瞬间膨胀。练习时应该养成“只宣告必要网段”的习惯这也是生产环境的基本要求。3.5 邻居建立全流程与验证命令配置完OSPF后邻居状态会经历Down、Init、2-Way、Exstart、Exchange、Loading、Full这几个阶段。练习时可以一边配置一边用display ospf peer观察状态变化。点到点链路上没有DR/BDR选举所以两台路由器会直接从2-Way进入Exstart广播网络里则要先选出DR和BDRDRother之间停在2-Way不建立Full邻居。我用两台路由器做邻居实验时完整的配置大概长这样# R1 ospf 1 router-id 1.1.1.1 area 0 network 10.0.12.0 0.0.0.3 network 1.1.1.1 0.0.0.0 # R2 ospf 1 router-id 2.2.2.2 area 0 network 10.0.12.0 0.0.0.3 network 2.2.2.2 0.0.0.0配置完等几秒钟用display ospf peer看到状态变成Full再用display ip routing-table能看到对端loopback的路由。这一步跑通OSPF最核心的邻居建立和路由学习流程就算是真正理解了。之后你可以故意改hello时间、改区域号、加认证观察邻居状态的变化这样排错能力才练得出来。4. 报文、LSA与路由计算把协议跑通的原理看明白4.1 五种OSPF报文的实际作用很多人背五种报文名称背得熟但不知道它们分别在哪个阶段出现。练习时配合抓包或者debug输出就能把报文和状态机对应起来。Hello报文建立和维护邻居关系周期发送默认10秒一次包含Router-ID、区域ID、hello间隔、dead间隔、DR、BDR等关键参数。两台设备这些参数不匹配邻居就建立不起来。DBD报文Database Description主从协商和LSDB摘要描述在Exstart和Exchange阶段出现。两台设备互相交换LSDB摘要看谁手里的LSA更新。LSR报文Link State RequestExchange阶段之后如果发现对方的LSDB里有自己没有或者比自己更新的LSA就发LSR请求完整内容。LSU报文Link State Update承载完整的LSA内容是真正传路由信息的报文。LSACK报文对收到的LSA进行确认保证可靠性。这五种报文的协作关系有点像你去图书馆还书先打个招呼说“我要来还书”Hello然后告诉管理员我带了哪些书、你有哪些书DBD发现缺了几本就点名要LSR管理员把书递给你LSU你确认收到LSACK。OSPF用组播地址224.0.0.5发送协议报文广播网络中DR和BDR还使用224.0.0.6接收路由器的报文。练习时可以用display ospf brief查看接口类型和状态再结合报文情况理解。4.2 核心LSA类型1类到5类必须搞清楚LSA是OSPF描述网络拓扑和路由信息的数据结构。练习多区域和外部路由时如果看不懂LSA类型排错基本靠猜。我建议在ensp里逐条查看1类Router-LSA每台路由器都会产生描述自己接口的链路状态只在所在区域内传播。2类Network-LSA由广播网络中的DR产生描述该网段内连接了哪些路由器只在所在区域内传播。3类Network Summary-LSA由ABR产生描述区域间路由跨区域传播。4类ASBR Summary-LSA由ABR产生通告ASBR的位置信息帮助其他区域找到ASBR。5类AS External-LSA由ASBR产生描述外部路由在整个OSPF域内传播。查看命令是display ospf lsdb你可以分别看1、2、3、4、5类LSA的内容。练多区域时在R3上能看到1类、3类和4/5类但看不到区域0内部的2类这就是区域隔离的实际效果。外部路由场景中R4引入一条静态路由后R3上会多出5类LSA并且路由表里出现O_ASE前缀。特殊区域里的7类NSSA LSA也很重要NSSA区域内的ASBR产生7类LSA在区域内部传播由ABR转换成5类LSA通告出去。练习NSSA时重点观察7类转5类的过程。4.3 开销计算与等价负载分担OSPF选路用的是cost值默认计算公式是参考带宽除以接口带宽华为设备参考带宽默认100Mbps。所以千兆接口的cost是1百兆接口是1但10M接口是10。这意味着在华为设备上千兆和百兆的默认开销一样如果不做调整OSPF可能把流量负载分担到两条性能差异很大的链路上。练习时可以这样验证在两台路由器之间配置两条路径查看路由表会发现出现两条等价路由形成负载分担。然后手工修改其中一条链路的cost比如在接口下配ospf cost 10再看路由表等价路由就消失了流量只走cost小的链路。这里有个生产环境常见的需求想控制流量走向不想改接口cost可以在OSPF视图下用bandwidth-reference调参考带宽或者对特定路由用preference调协议优先级。理解了cost的计算和调整你对OSPF路由选路的掌控才算入门。5. 进阶练习区域设计、特殊区域与BGP路由控制5.1 多区域与ABR汇总单区域练熟之后多区域是必须跨过去的坎。我在拓扑里让R1同时属于区域0和区域1它就自动成为ABR负责在区域之间传递路由。这里有一个关键认知OSPF的区域边界在路由器上而不在链路上一台路由器可以属于多个区域但一条链路只能属于一个区域。练习多区域时要重点验证区域1里的路由器能不能学到区域0的直连路由答案是可以但路由类型是O IA区域间路由不是O。看路由表时O和O IA的区别就是判断路由是本区域学到的还是跨区域学到的。ABR还能做路由汇总在ABR上配置abr-summary可以把多个明细路由汇总成一条通告出去减少区域间路由数量。练习汇总时要注意汇总路由的cost计算以及明细路由变化后汇总路由是否稳定。5.2 特殊区域stub、totally stub、NSSA怎么选多区域场景中末端区域不希望接收大量外部路由时可以配置特殊区域。练习时我把R3所在的区域1配置成stub区域R1的area 1里加stubR3的area 1里也加stub两边都要配否则邻居建立会失败。配置后观察R3的路由表5类外部路由消失了只剩默认路由指向ABR。stub区域不允许存在ASBR所以不能引入外部路由。如果区域里既要隔离外部路由又需要引入少量外部路由就要用NSSA。NSSA区域里的ASBR产生7类LSAABR会把它转成5类LSA转发到骨干区域。练习时可以在R3上引入一条静态路由然后在R1上看5类LSA是否生成。totally stub是在stub基础上再过滤掉3类LSA只保留一条ABR下发的默认路由适合网络结构简单的末端区域。配置totally stub只需要在ABR上配置stub no-summary区域内的其他路由器还是配stub。特殊区域的配置要点是一个区域内的所有路由器必须就特殊区域类型达成一致否则邻居起不来。这个限制在排错时特别值得注意很多人配着配着就忘了。5.3 外部路由引入metric-type 1和2的选择OSPF引入外部路由用import-route命令可以引入静态、直连、其他协议的路由。练习时我在R4上创建一条静态路由指向一个不存在的网段然后引入OSPFip route-static 192.168.100.0 255.255.255.0 NULL0 ospf 1 router-id 4.4.4.4 import-route static外部路由进入OSPF后有Type 1和Type 2两种度量方式。Type 2默认只计算外部路由自身开销区域内开销不叠加所以不管离ASBR多远cost不变Type 1则把外部开销和到达ASBR的内部开销相加体现路径远近。实际使用中如果希望流量尽量走向离目标最近的ASBR用Type 1更合理。查看路由表时O_ASE表示5类外部路由Type 2的开销会显示成类似[tag]的形式。练习时可以分别用import-route static metric-type 1和默认的Type 2配置一遍观察R1上到达192.168.100.0的路由开销变化这样两种类型就彻底记住了。5.4 OSPF与BGP联动及路由控制HCIP级别的考试和工作场景里OSPF很少单独出现通常要和BGP配合。练习到这一层时我在R2和R4之间运行BGPR4上引入外部路由然后通过BGP传递给R2R2再把BGP路由引入OSPF实现协议间的路由交换。关键点是双向引入容易产生路由环路。比如R2把OSPF路由引入BGP又把BGP路由引入OSPF如果控制不好路由可能在两个协议之间来回震荡。解决方法是使用路由策略做过滤和打tag。练习时我在R2上用route-policy匹配路由tag只在OSPF引入BGP时放行特定前缀其他一律拒绝。route-policy DENY-EXCEPT permit node 10 if-match ip-prefix ALLOW-PREFIX route-policy DENY-EXCEPT deny node 20 ospf 1 router-id 2.2.2.2 import-route bgp route-policy DENY-EXCEPTbgp route control的核心思路就在这不是把路由全量引进来而是用过滤、改属性、打标记的方式精准控制。练习时可以尝试用route-policy修改BGP路由的MED值、local-pref属性观察对端BGP选路结果的影响。OSPF这边可以用filter-policy做路由接收和发布过滤配好后在R1上看不到被过滤的路由这就是路由控制的直接体现。这个练习做完你对路由策略、协议优先级、选路属性的理解会完整很多。OSPF不只是会配邻居而是要能控制它怎么选路、传哪些路由、不传哪些路由这才是高级工程师和初学者的分界线。6. 排错三板斧error表、debug与抓包实录6.1 先查error表问题往往一眼就能定位我练习OSPF排错时最常用的命令不是debug也不是抓包而是display ospf error。这个命令直接列出OSPF进程运行过程中的各种错误计数包括认证失败、邻居状态机异常、区域ID不匹配、hello间隔不匹配等。比如有次我把R3的区域号写成了2R1上还是区域1邻居一直起不来。在R1上执行display ospf error错误列表里Area mismatch计数一直在涨问题原因瞬间就清楚了。还有一次认证配置错误错误表里Bad authentication type和Authentication failure不止改完配置再查看计数器不再增长这就说明问题解决了。为什么说error表最清晰因为它把协议层面的错误分类统计好了不用抓包去分析报文内容。热词里那句“ospf error表里面查问题老清晰了或者直接debug抓包都不用”确实是老手的经验。练习时你应该养成习惯邻居状态异常第一件事就是看error表而不是凭感觉改配置。清空错误计数器可以用reset ospf counters排错时先清空再触发问题看哪些计数在涨定位更精准。6.2 debug命令怎么用才不乱error表看不出问题的时候再上debug。华为设备常用的OSPF debug命令有debugging ospf packet、debugging ospf event、debugging ospf hello等。使用前必须先执行terminal monitor和terminal logging否则debug输出不会显示在终端上。debug输出很占CPU生产环境慎用练习环境无所谓。我练习时最常用的是debugging ospf packet可以看到设备收到和发出的OSPF报文类型、源地址、接口信息。配合display ospf peer观察邻居状态基本能还原整个邻居建立过程。需要特别提醒的是debug结束后一定要执行undo debugging ospf packet关闭否则模拟器会一直刷屏甚至导致ensp卡死。这个习惯和真机操作完全一致提前养成没坏处。6.3 抓包什么时候才真正需要ensp里可以右键接口启动抓包用Wireshark分析。很多人一开始就抓包其实效率很低因为报文多、信息杂。抓包最适用的场景是想确认报文内容的具体字段比如hello间隔、dead间隔、可选能力位、认证字段等。error表和debug告诉你“哪里错了”抓包告诉你“为什么错”层级不一样。我练习时为了验证MTU问题在两台路由器互联接口上手工配置了不同的MTU值邻居状态卡在Exstart一直进不去。看error表没有相关计数debug输出显示一直互发DBD但主从协商不成功。这时抓包一分析发现DBD报文里接口MTU字段不一致问题就清楚了。解决方法是把两端MTU改一致或者在接口下配置ospf mtu-enable让OSPF不检查MTU字段。6.4 常用排错速查表练习排错后我整理了一个速查表适合在ensp里做实验时对照现象可能原因排查命令邻居一直Down区域号不一致、接口未宣告、Hello间隔不匹配display ospf error、display ospf peer邻居卡在Init收到Hello但没看到自己Router-ID可能网络类型不一致或认证失败display ospf error、抓包看Hello报文邻居卡在Exstart/ExchangeMTU不一致、DBD协商失败display ospf error、抓包分析DBD报文邻居卡在LoadingLSR请求的LSA无法回应LSDB不同步display ospf lsdb、debug ospf packet路由学不到network宣告范围错误、区域间过滤、ABR未配置display ospf lsdb、display ospf routing路由收到但不是最优cost过大、等价路由未生效、路由策略过滤display ospf routing、display ip routing-table练习排错时建议每个故障都从“先看error表、再看peer状态、必要时debug、最后抓包”这个顺序走一遍。刚开始会慢但走完几次之后你会发现大多数OSPF问题根本不需要抓包就能定位效率高很多。7. 练习到最后一层建议再做的几个实验练到这里你其实已经具备比较完整的OSPF实战能力了。我最后再推荐几个可以在ensp上快速做的实验每一个都对应真实工作中可能遇到的场景第一个实验是“DR选举控制”。在广播网络里把一台路由器的接口优先级调成255把另一台调成0重启OSPF进程观察DR和BDR的选举结果。这个实验能帮你理解优先级、Router-ID在DR选举中的实际作用也能解释为什么有时候你以为的DR并不是实际选出来的DR。第二个实验是“静默接口”。在一台路由器上配置silent-interface把某个接口设为静默该接口不再发送Hello报文但直连路由仍然能通过OSPF发布出去。这个配置在真实网络中很常见用于不希望建立邻居的接口上比如连接终端用户的接口。第三个实验是“路由过滤”。用filter-policy在ABR上过滤掉特定网段然后在区域内的路由器上查看路由表变化体会OSPF路由控制是怎么生效的。这个实验做完你再看BGP里的route control思路就通了。第四个实验是把练习得到的所有配置导出来写一份简单的网络设计说明包括地址规划、区域划分、路由控制策略。写文档这个动作看着和敲命令无关但实际最能检验你思考是否完整。OSPF的练习不是一遍做完就结束的。隔一周再重新配一遍你会发现第二次比第一次流畅得多第三次开始你已经不会再去想命令怎么写而是直接考虑拓扑和业务怎么设计。这种从“背命令”到“想设计”的转变正是这一轮练习最大的收获。