
1. OSPF到底在解决什么问题先搞懂它为什么能撑起大型网络我最早认识OSPF不是因为考试是因为一次真实翻车。公司新园区核心层换设备网管老哥用静态路由写了四十多条结果上联一条光纤抖动整片区域的路由全部要手动改半夜三更被叫起来的滋味谁干谁知道。后来把全网切到OSPF类似故障再出现时SPF重算收敛只需要一两秒人在机房里喝茶就行。这就是OSPF的价值它是一套让路由器自己学习、自己计算、自己收敛的动态路由协议。它解决的不是怎么配一条路由的问题而是当网络拓扑发生变化时全网路由怎么自动适应的问题。只要你负责的网络超过二三十台设备或者存在冗余链路、多区域规划静态路由就会变成维护噩梦而OSPF是绝大多数企业和运营商共同的答案。这篇文章我不会讲太虚的概念只围绕几个高频热搜点来展开Router-ID怎么定、ABR和特殊区域的路由到底怎么理解、H3C设备怎么配置、以及它和MSTP、VRRP在园区网里怎么搭配。1.1 不能只靠静态路由动态协议解决的是变化的问题静态路由适合什么场景出口一条线、内部没有冗余、拓扑几年不变的小网络。一旦链路断了静态路由不会自己换路必须人上去改或者靠浮动静态路由加个优先级高的备胎勉强撑着。但浮动静态路由也只是两条线的切换如果拓扑有十几个节点、多条冗余路径手写静态路由表就是给自己埋雷。OSPF这类动态路由协议会把全网的路由信息收集起来每台设备都保存一份链路状态数据库LSDB然后各自独立计算最短路径。链路断了故障点附近的设备会立刻洪泛一条新的链路状态通告LSA全网收到后重新跑一遍SPF算法新的无环路径马上算出来。这个过程不依赖任何人的手工干预这就是动态收敛。1.2 OSPF和RIP的本质区别一个看地图一个听传闻很多刚入门的朋友搞不清OSPF和RIP的区别。打个比方RIP是听传闻每台设备只告诉邻居我到哪儿有几跳邻居再往下传每一台设备都是听来的二手消息别人说错它就跟着错而且最大15跳的限制让它在稍大点的网络里直接出局。OSPF是看地图每台设备把各自的接口、连接关系、开销都广播出去所有设备都拿到一张完整的网络地图然后自己用Dijkstra算法算路径。因为每台设备都拿着全图在算所以不存在听错传闻的问题这也是它天然无环的原因——链路状态数据库里不允许出现环路。另一个关键区别是收敛速度。RIP要等路由老化和周期更新动辄几十秒甚至几分钟OSPF靠Hello报文快速探测邻居状态配合触发式更新正常能在秒级甚至毫秒级完成收敛。1.3 什么样的网络适合上OSPF说了这么多不是让你把所有网络都改成OSPF。判断标准就几条设备数量超过30台或者未来一定会扩容到这个规模存在两条以上冗余路径需要自动切换和负载分担网络按地域或功能划分成多个区域需要层次化设计需要对外部路由比如接Internet的默认路由、运营商BGP路由做引入和过滤团队希望故障恢复时少熬夜把人肉运维变成协议收敛。满足其中两三条就有充分理由上OSPF。而一旦上了OSPF你会立刻碰到两个最基础也最关键的决策点Router-ID怎么规划、区域怎么划分。下面先聊Router-ID。2. Router-ID选举的门道全网唯一不是开玩笑热搜词里有一条ospf 1 router-id 1.1.1.1这是非常典型的OSPF配置。很多教程一笔带过说配个Router-ID就行但实际项目中Router-ID规划不合理引发的故障我见过太多。2.1 Router-ID是什么又是怎么选出来的Router-ID是一个32位的数值在OSPF整个自治系统内唯一标识一台设备。注意它长得像IP地址但它不是IP地址不需要它可达也不需要它在路由表里出现。它只是设备的身份证号。如果配置时不手工指定设备会按下面顺序自动选手工配置的Router-ID优先级最高所有Loopback接口中IP地址最大的那个所有物理接口中IP地址最大的那个。看到这里你就明白为什么规程里都要求手工配置Router-ID了。自动选举的规则依赖接口地址一旦接口IP调整Router-ID理论上就可能跟着变虽然OSPF启动后Router-ID不会自动重选得等进程重启才生效这在生产网里是不可控的。所以正规做法永远是第一步就手工定死。2.2 手工配置的规范ospf 1 router-id 1.1.1.1H3C设备上的写法非常直白ospf 1 router-id 1.1.1.1这条命令的意思是创建一个OSPF进程进程号是1并指定该进程的Router-ID为1.1.1.1。规划Router-ID有几个经验可以抄建议用设备的Loopback0地址作为Router-ID而且Loopback0地址用单独的网段规划比如核心设备统一用10.255.255.x/32汇聚用10.255.254.x/32这样看到路由表或LSDB里出现10.255.255.1不用查表就知道是哪台核心Router-ID不要复用任何业务网段的地址避免混淆命名要带设备角色比如1.1.1.1通常是核心主设备2.2.2.2是核心备设备全网一个体系后续排错会轻松很多。2.3 重复Router-ID引发的邻居震荡与修改禁忌这是我最想强调的坑。OSPF所有LSA都用Router-ID标识来源如果同一区域内两台设备的Router-ID重复它们互相收到的LSA会被认为是自己发出的导致LSDB错乱、邻居关系反复在Full和Down之间横跳业务表现为路由表时不时缺一条或者下一跳漂来漂去。低频但真实的触发场景有两个一是设备配置从模板批量下发忘了改Router-ID二是两台设备都开了自动选举且它们恰好都有一个相同IP的接口比如都是192.168.1.1的串口或管理口一旦这两个网段通过二层打通就撞号了。另一个禁忌是已经运行的OSPF进程如果要修改Router-ID改完配置后必须重启进程才生效。H3C上的命令是reset ospf process执行时要做好心理准备——重启进程意味着所有邻居都会经历一次Down和重建如果是核心设备会造成一次全网路由震荡。所以生产环境改Router-ID必须走变更窗口最好在深夜做而且先要确认新Router-ID全网唯一。3. ABR和特殊区域四种区域路由行为的完整拆解热搜里有一条OSPF特殊区域路由的理解这是面试必考、排错必用的知识点。要理解特殊区域必须先搞清楚ABR和各类LSA的性质。3.1 ABR在OSPF里的位置和区域间路由怎么传OSPF要求所有区域必须直连骨干区域Area 0或者说区域间流量必须经过Area 0这是为了保证无环。而连接骨干区域和其他区域的那台设备就是ABRArea Border Router区域边界路由器。ABR至少有一个接口在Area 0至少有一个接口在别的区域。ABR最大的作用有两个。第一生成Type 3 LSASummary LSA把本区域的路由汇总后通告给其他区域第二在区域边界做路由过滤和汇总比如用abr-summary命令把连续网段聚合成一条路由通告出去减少全网路由条目数。理解Type 3 LSA要注意一点它描述的是某条路由在区域外的下一跳而不是具体链路细节因此在OSPF里区域间路由有点像距离矢量的味道——ABR告诉其他区域到那个网段你找我就行。这也是为什么OSPF整体无环而多区域情况下仍然依赖Area 0来保证区域间不环路。3.2 Stub区域和Totally Stub区域把外部路由挡在门外假设一个分支区域只有一条出口连到骨干区域内不需要知道自治系统外部的各种明细路由比如重分布进来的静态路由、其他协议的路由。这时候就可以把该区域配置为Stub区域。Stub区域的规则是不允许Type 4、Type 5 LSA进入也就是说区域内看不到外部路由的具体明细。但分支要上网怎么办由ABR向Stub区域内下发一条默认路由Type 3 LSA目标0.0.0.0区域内所有去往外部的流量统一交给ABR。配置上还有个硬性要求Stub区域内不能有ASBR也就是说不能在该区域的任何设备上做路由重分布否则会破坏Stub的定义。Totally Stub区域H3C里叫Stub no-summary更进一步它把Type 3 LSA也挡在外面只保留区域内自身的路由和ABR下发的一条默认路由。配置方法是ospf 1 area 1 stub如果想让该区域变成Totally StubABR侧再加一句ospf 1 area 1 stub no-summary注意区域内所有路由器都必须配置stub而且Area 0不能配Stub虚链路也不能穿越Stub区域。3.3 NSSA和Totally NSSA7类LSA是怎么进来的Stub区域有个限制——不能有ASBR。但实际网络里分支往往也有自己的外部路由要引入比如本地有一条连到别的运营商的静态默认路由或者需要重分布一些直连路由出去。这时候就需要NSSANot-So-Stubby Area不那么末端的区域。NSSA允许区域内的ASBR引入外部路由但以Type 7 LSA的形式泛洪只在NSSA内部传播。当Type 7 LSA到达ABR时ABR会把它转换成Type 5 LSA再传播到其他非特殊区域。这就是特殊区域路由理解最核心的一句话NSSA让不能有外部路由的区域和需要在区域内部引入外部路由这两个矛盾需求同时成立。配置示例ospf 1 area 1 nssa如果需要让ABR向NSSA内自动下发默认路由用ospf 1 area 1 nssa default-route-advertiseTotally NSSA则是NSSA加no-summary既拦截Type 3、4、5又允许Type 7存在ospf 1 area 1 nssa no-summary这种配置常用于分支既要访问总部又要保留本地出口的场景既让区域内路由表精简又给外部路由留了通道。3.4 四种特殊区域对比表把四种区域放在一起看差异就很清晰了区域类型允许进入的LSA是否允许ASBR默认路由来源典型场景Stub1、2、3禁止4、5不允许ABR下发Type 3默认路由单一出口的分支不需要外部路由Totally Stub仅1、2和默认的Type 3不允许ABR下发Type 3默认路由想极致精简路由表的分支NSSA1、2、3、7禁止4、5允许可配置ABR下发Type 7默认路由分支需要引入自有外部路由Totally NSSA1、2、7和默认的Type 3允许ABR下发Type 3默认路由精简路由表且保留外部引入能力排错时最常遇到的情况是Stub区域里有人偷偷配了重分布结果OSPF邻居反复出问题或者NSSA区域的ABR不止一台Type 7转Type 5的转换者选举不一致导致外部路由时有时无。这些都需要你在设计阶段就把区域类型钉死并把规则写进文档。4. H3C设备上的OSPF配置实战网上搜H3C OSPF配置得到的命令多半能跑通但很多细节不写清楚照着敲完照样出问题。我把一套比较标准的配置流程拆开讲。4.1 两种宣告方式network和接口启用H3C支持两种让接口进入OSPF的方式。传统方式是进入OSPF视图用network命令加反掩码wildcard mask宣告网段ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.0.0.0 0.0.0.255反掩码和子网掩码相反0.0.0.255表示匹配10.0.0.0到10.0.0.255这个范围。注意反掩码不是子网掩码的取反那么容易混淆比如宣告10.0.0.0/8的网段反掩码要写0.255.255.255。另一种是接口模式直接在接口下启用interface GigabitEthernet1/0/1 ospf enable 1 area 0我个人的习惯是接口模式为主因为它更直观哪台设备的哪个接口进哪个区域一眼就能在配置里看明白也方便排查为什么这个接口没跑OSPF的问题。4.2 网络类型、计时器和DR选举OSPF邻居能否建立很大程度取决于两端接口的网络类型是否匹配。Ethernet接口默认是Broadcast广播类型会参与DR/BDR选举串口默认是P2P或者NBMA取决于链路封装。如果一端是P2P一端是Broadcast很容易出现一方一直停在Init状态。在H3C设备上可以通过命令显式指定interface GigabitEthernet1/0/1 ospf network-type p2p点到点网络不选DR/BDR邻居建立更快少一层选举逻辑。如果两个路由器之间就一条直连链路建议直接配p2p省去不必要的DR震荡。Hello和Dead计时器也必须一致否则邻居永远起不来。广播和P2P网络默认是Hello 10秒、Dead 40秒NBMA和P2MP默认是Hello 30秒、Dead 120秒。改计时器可以这样interface GigabitEthernet1/0/1 ospf timer hello 5 ospf timer dead 20Dead时间建议保持Hello的4倍别为了收敛快把Dead压到和Hello一样链路抖动一次就直接翻车。广播网络里还要注意DR/BDR选举。接口优先级默认是1范围0到2550表示永远不参与选举。DR/BDR选举是非抢占的如果优先级相同Router-ID大的当选。所以你会看到为什么全网Router-ID规划那么重要——它不只是标识设备还直接决定多台设备互联时谁是DR。DR变更会导致该网段所有邻居重新建立一次生产环境里这是要尽量避免的。4.3 静默接口、认证和等价路由接入层网络里很多接口下面挂的是终端或服务器根本不需要建立OSPF邻居但还是会收到很多组播Hello报文。解决办法是静默接口ospf 1 silent-interface GigabitEthernet1/0/2静默接口不发送也不接收Hello报文不会建立邻居但这个接口的直连路由还是会被OSPF宣告出去前提是它被network或ospf enable了。这个特性非常适合接入终端的网段。认证是另一个不能省略的环节。明文核心骨干不做认证被人在二层接入一个设备就能把伪造的路由灌进你的网络。H3C支持空认证、简单认证、MD5和HMAC-SHA256。我一般用MD5做区域认证ospf 1 area 0 authentication-mode md5 1 cipher your-key注意同一区域内要么都配认证要么都不配否则邻居关系起不来而且换key时要先加新key再删旧key给设备之间一个过渡窗口。等价路由方面OSPF天然支持多路径负载分担。H3C的默认等价路由条数常见为8条也可以限制ospf 1 maximum load-balancing 4当两条链路带宽不一致时可以用接口开销ospf cost来影响选路。默认开销算法是参考带宽除以接口带宽参考带宽默认100Mbps也就是千兆口开销是1百兆口开销是1因为计算出来小于1会取1。建议把所有设备统一修改参考带宽ospf 1 bandwidth-reference value 100000把参考带宽改成100000Mbps这样万兆口开销是10千兆口是100百兆口是1000选路梯度就出来了。4.4 常用查看和维护命令配置完一定要会用这几个命令确认状态display ospf peer brief display ospf peer display ospf routing display ospf lsdb display ospf interfacedisplay ospf peer brief看邻居状态Full就是正常display ospf routing看OSPF路由表确认学到哪些路由display ospf lsdb看链路状态数据库排错时排查LSA是否完整display ospf interface看接口的网络类型、计时器和DR优先级。这些命令我每次变更前后都会各打一遍留个输出存档出问题才能对比。5. 园区网三件套OSPF、MSTP、VRRP如何各司其职热搜里OSPF MSTP VRRP经常一起出现。这三兄弟在园区网里是标准的红绿灯组合很多人配置时容易混其实它们各管一层互不干扰但需要精心设计才能配合默契。5.1 三个协议的分工边界先记住一句OSPF管三层路由MSTP管二层防环VRRP管网关冗余。OSPF负责的是不同网段、不同区域之间的路由可达让数据包知道该往哪个下一跳走MSTP多生成树协议负责二层网络里不让桥接环路把广播风暴引爆同时通过多个实例把不同VLAN的流量分到不同链路上VRRP负责的是终端网关的高可用两台核心/汇聚设备共用一个虚拟IP一台是Master、一台是BackupMaster挂了Backup立刻顶上。三者的层级关系是OSPF工作在三层及以上VRRP工作在三层提供虚拟网关MSTP工作在二层。一个数据包从终端发出先找VRRP虚拟网关出二层再交给OSPF建立的三层路由去往目的地。所以它们不冲突但网管新人最容易在双核心设计里把它们搅在一起。5.2 双核心加双汇聚的配置要点标准园区网双核心拓扑是这样的两台核心交换机做OSPF Area 0两台汇聚交换机作为ABR把接入划分到Area 1、Area 2等业务区域汇聚和核心之间有两条物理链路做链路聚合或二三层互联终端网关做在汇聚交换机上用VRRP提供虚拟IP接入交换机双上联到两台汇聚由MSTP防止二层环路。MSTP的配置关键是先建MST域把VLAN映射到实例stp global enable stp region-config region-name HQ-REGION revision-level 1 instance 1 vlan 10 20 instance 2 vlan 30 40 active region-configuration注意三件事域名称、修订级别、VLAN映射表必须全网一致否则设备会被认为是不同的MST域生成树计算直接乱掉active region-configuration必须敲否则配置不生效MSTP的实例划分要和VRRP的负载分担方向对齐比如实例1的根桥放在汇聚A时VRRP里VLAN 10、20的Master也应该放在汇聚A这样南北向流量路径才一致。VRRP侧的核心配置是这样interface Vlan-interface10 ip address 10.1.10.2 255.255.255.0 vrrp vrid 10 virtual-ip 10.1.10.254 vrrp vrid 10 priority 120 vrrp vrid 10 track interface GigabitEthernet1/0/1 reduced 40对端汇聚的VLAN 10则配置相同的vrid和virtual-ip但优先级默认100。于是正常情况下汇聚A是Master承担VLAN 10的网关流量汇聚B是Backup一旦汇聚A的上联口断了track功能把优先级扣40汇聚B升为Master网关切换完成。VLAN 20反过来配置让两台设备都真正干活而不是一台闲着。5.3 联动的小技巧cost调整和TrackOSPF在这个组网里的角色是保证路由跟随网关切换。如果网关切换了但OSPF还认为原来那台核心是优等路径流量就会绕路甚至黑洞。所以要让OSPF的选路跟VRRP的Master保持一致。实现方式有两种。一种是在汇聚到核心的互联接口上调OSPF开销让VLAN 10的主流量走汇聚AVLAN 20的主流量走汇聚Binterface Ten-GigabitEthernet1/0/1 ospf cost 10另一种更稳妥的是OSPF和BFD联动一旦链路或邻居故障OSPF在毫秒级感知并收敛不用等默认的40秒Dead时间。H3C上的做法是在接口下启用interface Ten-GigabitEthernet1/0/1 ospf bfd enable配合VRRP的track接口链路一断网关切换和路由收敛同时发生这才是生产环境里高可用的真正含义。我见过太多只配了VRRP不配OSPF cost调整的组网平时看着正常一到核心链路故障就出现网关切过去了但路由还在往故障设备送的灵异现象根子就是三层选路没有和二层网关联动。6. 邻居起不来一套可直接照抄的OSPF排错链路OSPF排错是网工的基本功而排错最有价值的第一步就是看邻居状态卡在哪个阶段。每个状态都对应一类根因比瞎猜命令高效得多。6.1 邻居状态机知道卡在哪一步就能对症下药OSPF邻居建立过程大致是Down初始→ Init收到对方Hello但还没建立双向→ 2-Way双方在Hello里都看到了对方→ ExStart协商主从关系交换DD报文序号→ Exchange交换链路状态摘要→ Loading请求并接收详细LSA→ Full数据库同步完成。实际排查时邻居卡在不同状态病因几乎是可以对号入座的一直停在Down或Init多半是Hello报文压根没到对端查接口status、VLAN、端口隔离、ACL以及两台设备之间是否有三层路由可达一直停在ExStart或者Exchange高度怀疑MTU不一致两端的接口MTU不同DD报文会被分片或不完整协商永远完不成一直在Loading里打转LSDB同步异常可能是LSA的校验和错误、或者Router-ID冲突导致LSA反复刷新。6.2 高频故障场景汇总现象可能原因优先排查命令邻居一直Down/Init物理链路不通、VLAN隔离、ACL过滤、区域号不一致display interface、display ospf interface邻居反复Full到Down链路抖动、Router-ID冲突、Hello/Dead计时器漂移display logbuffer、display ospf peer卡在ExStart接口MTU不一致、DD报文被丢弃display interface 查看两端MTU路由表缺明细network宣告遗漏、特殊区域过滤、ABR汇总错误display ospf lsdb、display ospf routing认证报错区域/接口认证类型或密钥不一致display ospf error6.3 一个真实案例的完整排查过程说个我处理过的案例。某分支两台H3C交换机之间用万兆口互联OSPF邻居一直卡在ExStart两边display ospf peer都是ExStart状态路由表空空如也。第一反应是查接口物理状态up查VLAN通的查ACL没有。后来想起来万兆互联经常有人开Jumbo帧赶紧对比了两台设备互联口的MTU——一台1500一台9200问题当场破案。把两边MTU统一成1500后邻居两秒钟进FullOSPF路由正常出现。另一个常见案例是设备配置模板化复制导致的Router-ID重复。两台汇聚交换机都从同一份模板改了设备名但忘了改Router-ID结果OSPF路由表隔几分钟就闪断一次业务断断续续。排查时先看邻居状态发现两台设备之间邻居倒是Full但LSDB里Router-ID完全一样的LSA在反复刷新display ospf error里能看到大量LSA冲突计数。最后把Router-ID改成规划值reset ospf process全网稳定下来。这件事之后我把变更前备份配置并核对Router-ID清单写进了每次操作的checklist。排错还有一个容易被忽略的点看错误统计。display ospf error这个命令能显示收到的非法Hello、认证失败、区域号不匹配等计数的增长情况。看到某个错误计数在持续上涨基本就能锁定方向比一条条猜命令快得多。说回实践经验OSPF这套东西理解层次决定了排错速度。我见过把OSPF所有命令背得滚瓜烂熟的朋友遇到邻居ExStart卡住第一反应居然是重启进程结果业务全断。而真正有用的是你知道每个状态背后的含义、每种LSA的传播边界、每个配置项存在的理由。Router-ID规划、区域类型选择、DR/BDR设计这些决定了网络上线之后好不好维护。我和团队这几年养成一个习惯任何OSPF变更之前先打一遍display ospf peer brief和display ospf lsdb留档变更后再打一遍对比所有异常都能量化到具体是哪条LSA、哪个邻居出了问题。这套笨办法比任何工具都好使。