尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OSPF实战:从原理到配置排障,error表快速定位网络故障

OSPF实战:从原理到配置排障,error表快速定位网络故障 干了这么多年数通项目有个感受越来越深OSPF这东西你可以在简历里写“熟悉”但真正能不能在现网里把邻居调起来、把路由搞稳、把故障揪出来完全是两回事。从企业园区到数据中心从运营商的城域网到骨干网OSPFOpen Shortest Path First开放最短路径优先几乎是绕不开的标配协议。很多刚入行的朋友学OSPF光记了一堆LSA类型和状态机名词一到设备上敲命令就懵一看到日志刷屏就慌。这篇文章我就结合自己做过的一些项目把OSPF从原理到配置再到排障的完整链路捋一遍重点聊聊怎么用OSPF error表、debug信息直接定位问题很多时候真的连抓包都不用。适合正在备考数通认证的朋友、刚接触现网的工程实施人员以及日常被OSPF故障折腾的运维同行。1. 为什么OSPF是数据通信的必修课1.1 链路状态协议和距离矢量协议的本质区别要理解OSPF先得搞清楚它和RIP这类距离矢量协议的本质区别。RIP靠跳数选路每个路由器只告诉邻居“我有多远”然后一跳一跳把信息传下去这就好比一群人排着队传话每个人只知道上一棒跟自己说了什么并不知道整条路到底是什么样。OSPF完全不一样它属于链路状态协议每台路由器都会把自己的接口信息、开销、邻居关系广播出去让整个区域里的路由器都拿到完全相同的一份“网络地图”然后各自用SPFShortest Path First最短路径优先算法计算到达每个网段的最短路径。链路状态协议的优势非常明显第一收敛快网络拓扑发生变化时只有变化的链路会触发更新不需要像RIP那样周期性地把整张路由表广播出去第二无环路因为每台路由器都拥有完整的拓扑视图SPF算法天然不会算出环路第三支持基于开销的选路不是简单看跳数而是可以根据带宽、时延等成本因子来选路这在现网中太重要了。简单说OSPF是用“全局视角”做决策而RIP是“局部视角”靠猜这就是为什么稍微有点规模的网络都绕不开OSPF。从实战角度说我见过太多小网络用静态路由就能搞定但一旦设备数量超过十几台、链路存在冗余静态路由的维护成本会让人崩溃。OSPF能让你在网络拓扑变化时自动完成路径切换这也是它在数据通信领域被称为“必修课”的根本原因。1.2 什么场景该上OSPF什么场景别硬上OSPF虽然强但也不是任何场景都适合。我遇到过一些同行明明两张路由器之间就一条专线还非得起OSPF结果hello报文、认证配置折腾了半天最后发现静态路由三行命令就解决了。选择路由协议之前先回答几个问题这个网络规模多大是否需要冗余路径拓扑变化频率高不高运维团队熟练度如何如果网络规模在十几台设备以下、拓扑相对固定、没有多条等价路径静态路由往往更省心。规模中等、存在冗余链路、希望链路故障后能自动收敛OSPF多区域或者单区域就非常合适。如果是数据中心内部或者运营商骨干OSPF加上BGP组合使用也很常见OSPF负责域内路由BGP负责跨域路由和学习外部路由。换句话说OSPF不是万能的但它覆盖了绝大多数中大型网络的域内路由需求。另外提一句选择OSPF之后区域设计一定要提前规划。是做成单区域还是多区域骨干区域放哪里哪些设备做ABR这些如果在开局时没有想清楚后期扩容会非常痛苦改区域甚至可能引发全网路由震荡。我习惯的做法是哪怕前期设备不多也把规划文档里预留好区域划分和Router-ID分配表后面每加一台设备就往表里填。2. OSPF核心机制邻居状态机、LSA与区域2.1 邻居状态机从Down到Full的完整过程OSPF建立邻居关系的过程是有严格状态的学名叫做邻居状态机。很多初学者直接背状态名但不明白每个状态背后发生了什么报文交互这样遇到问题根本无从下手。我建议把它当成一次“相亲”来理解双方从互相打量到交换简历再到确认关系每一步都有明确的信号。最先是Down状态接口启用OSPF之后开始发送Hello报文。Hello报文是组播发送的目的地址是224.0.0.5里面包含了Router-ID、区域ID、Hello间隔、Dead间隔、认证信息等关键参数。收到对方的Hello之后进入Init状态这时你已经在对方的Hello报文里看到了自己说明对方发现了你但你可能还没在对方的邻居列表里把对方加进来。当双方都在对方的Hello报文中看到彼此之后进入Two-Way状态。在广播网络中Two-Way状态非常重要因为DR和BDR选举就发生在这个阶段。非DR/BDR的路由器之间停留在Two-Way状态就够了没必要建立完整的邻接关系这是OSPF为了减少报文泛滥做的优化。接下来进入ExStart状态双方开始协商主从关系主要靠DBDDatabase Description报文中的序号来定序号大的当主路由器。协商完成进入Exchange状态双方交换DBD报文也就是链路状态数据库的目录摘要各自心里有数对方有什么LSA。然后进入Loading状态根据DBD摘要把自己缺的LSA用LSR报文请求过来对方用LSU报文应答最后确认用LSACK。全部同步完成邻居状态就是Full。这里有个细节容易被忽略每个状态的维持时间通常极短你敲display ospf peer看到的大多数邻居都是Full状态。如果你发现邻居一直卡在ExStart或者Exchange首先怀疑MTU不一致卡在Init状态多半是Hello参数不匹配或者收到了对方的Hello但没有回包卡在Two-Way说明DR/BDR选举没有正常完成可能优先级配置有问题。2.2 常见的LSA类型别死背要理解用途OSPF的LSALink State Advertisement链路状态通告类型是很多学习者的噩梦一堆数字符号记不住。我的经验是不要死背按“谁产生的、描述什么信息”去理解自然就记住了。Type 1 Router-LSA是每台路由器自己产生的描述自己的接口直连链路信息相当于自我介绍Type 2 Network-LSA是广播网络中的DR产生的描述这个网段有哪些路由器加入相当于一个网段的汇总Type 3 Summary-LSA是ABR产生的用来描述某个区域的汇总路由通告给其他区域Type 4 ASBR-Summary-LSA也是ABR产生的描述ASBR的位置让其他区域知道去哪里找ASBRType 5 AS-External-LSA是ASBR产生的描述外部路由比如从BGP引入或者静态路由引入进来的Type 7 NSSA-External-LSA是NSSA区域里的ASBR产生的用于在NSSA区域内通告外部路由到ABR时再转换成Type 5传播到其他区域。这么多LSA类型实际排障时最常见的就是看一下Type 1和Type 2是否正常以及外部路由的Type 5是否出现在该出现的地方。用display ospf lsdb就能查看链路状态数据库里有哪些LSA很多路由学习不到的问题一查LSDB就能定位是LSA没有生成还是LSA没传过来还是SPF计算有问题。2.3 区域设计是OSPF的灵魂ABR不该是背概念OSPF的区域设计直接决定网络的扩展性和稳定性。区域0是骨干区域所有其他区域都必须与骨干区域相连或者通过虚链路逻辑上相连。这个设计不是拍脑袋定的核心原因是OSPF要求区域内的SPF计算只在区域内进行区域间路由通过Type 3 LSA汇总传递从而把拓扑变化的影响范围限制在一个区域内。ABRArea Border Router区域边界路由器就是连接骨干区域和非骨干区域的那台设备它同时维护多个区域的LSDB并且在区域之间传递汇总路由。很多人把ABR当成一个名词来背其实它是排障的关键角色——如果你怀疑路由从区域1传到区域0出了问题第一反应就该去看ABR上的区域接口、LSDB和路由表。热词里提到“ospf abr”说明大家在实战中确实经常跟ABR打交道。区域类型的选型也要结合场景。普通区域会接收Type 3、Type 4、Type 5 LSAStub区域不允许外部路由进入只接收Type 3Totally Stub区域连Type 3都不接收只保留默认路由NSSA区域则允许外部路由以Type 7 LSA的形式进入。我在规划时有个原则边缘区域尽量设计成Totally Stub或者NSSA这样能显著减小LSDB规模降低设备CPU负担。但要注意如果区域里需要引入外部路由就去掉Stub改用NSSA。3. 从零配置让两台设备真正跑起来3.1 Router-ID规划和配置别让设备自动选Router-ID是OSPF路由器的身份标识是整个OSPF域内的唯一标识。很多初学者喜欢留空让设备自己选华为设备会优先选择Loopback接口地址中最大的其次选择物理接口地址最大的。这样做的问题在于一旦接口配置变化Router-ID可能变化会导致邻居关系重建严重时引发路由震荡而且自动选择的结果可读性差不利于排障。我强烈建议在部署OSPF之初就做好Router-ID规划统一分配。最常见的做法是把设备Loopback 0地址作为Router-ID比如热词里提到的“router-id 1.1.1.1”就是典型的Loopback地址规划。配置命令很简单在OSPF进程视图下设置[Huawei] ospf 1 router-id 1.1.1.1 [Huawei-ospf-1]这条命令的含义是创建OSPF进程1并显式指定Router-ID为1.1.1.1。注意Router-ID一旦配置如果你改了配置需要重置OSPF进程或者重启设备才能生效因为OSPF进程不会动态读取新的Router-ID。还有一个容易踩的坑如果网络里两台设备的Router-ID冲突它们之间会出现邻居关系反复震荡的情况日志里会有Router ID conflict的提示用display ospf error也能看到计数增长。所以Router-ID分配表一定要提前做好并且写进设备命名规范里不要图省事。另外多说一句Router-ID选择优先级是有讲究的。即使你配置了Loopback 0的地址为1.1.1.1但如果没有显式配置router-id命令设备仍然可能优先取其他Loopback或物理接口地址。所以在OSPF进程里写上router-id这行是双保险既保证身份稳定又确保唯一性。我在所有项目里都强制执行这条规范从来不吃亏。3.2 最小配置示例三行命令让邻居亮起来用一个最简单的拓扑来演示两台路由器R1和R2通过GigabitEthernet 0/0/0直连网段是10.0.12.0/24两台设备都运行OSPF区域为0。R1的配置[Huawei] interface GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0] ip address 10.0.12.1 24 [Huawei-GigabitEthernet0/0/0] quit [Huawei] ospf 1 router-id 1.1.1.1 [Huawei-ospf-1] area 0 [Huawei-ospf-1-area-0.0.0.0] network 10.0.12.0 0.0.0.255R2的配置[Huawei] interface GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0] ip address 10.0.12.2 24 [Huawei-GigabitEthernet0/0/0] quit [Huawei] ospf 1 router-id 2.2.2.2 [Huawei-ospf-1] area 0 [Huawei-ospf-1-area-0.0.0.0] network 10.0.12.0 0.0.0.255敲完之后等一个Hello间隔默认10秒用display ospf peer查看邻居状态。正常情况下你应该看到邻居状态是Full同时能看到邻居的Router-ID、接口地址、状态持续时间等关键信息。注意network命令的反掩码写法10.0.12.0 0.0.0.255表示匹配10.0.12.0/24这个网段。OSPF只会通过network命令宣告的匹配接口来发送Hello报文和传输LSA。很多初学者会在这里写错反掩码比如写成255.255.255.0结果OSPF进程根本不起作用这是最常见的低级错误。另外area后面的数字既可以用点分十进制0.0.0.0也可以用十进制0华为设备两者都支持但建议统一用点分十进制和区域规划文档保持一致避免混淆。如果你想配置非0区域比如区域1就输入area 1或者area 0.0.0.1意思一样。3.3 网络类型、接口开销和选路控制OSPF的接口网络类型直接影响邻居建立方式和DR选举行为。常见的有广播类型和P2P类型。以太网接口默认是广播类型会选举DR/BDRHello间隔是10秒串行链路或做了链路聚合的接口可以配置成P2P类型不选举DR/BDR邻居建立更快Hello间隔也是10秒。修改接口网络类型的命令[Huawei] interface GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0] ospf network-type p2p在点到点链路上配置成P2P类型可以避免无谓的DR选举加快邻居建立速度同时减少LSDB中的Type 2 LSA数量。这在机房互联链路中非常实用尤其是那些只连接两台设备的以太网专线配置成P2P不会对现网产生任何负面影响。接口开销Cost是OSPF选路的依据计算公式是参考带宽除以接口带宽华为设备默认参考带宽是100Mbps也就是Cost 100 / 带宽Mbps。GigabitEthernet的Cost算下来是110GE也是1那就看其他参数了百兆口Cost是1实际上百兆以下才会有明显的差异。修改参考带宽[Huawei] ospf 1 [Huawei-ospf-1] bandwidth-reference 1000把参考带宽改成1000即1Gbps后GigabitEthernet的Cost是110GE的Cost是0.1取整为1百兆口的Cost是10。这里要注意同一OSPF域内所有设备的参考带宽必须一致否则各设备的Cost计算基准不一样会出现路由不一致甚至环路隐患。我在项目里通常统一设1000或者更高因为现在的链路普遍都是千兆起步100M的参考带宽已经不符合实际。实际项目中选路控制往往不是只看带宽还要结合业务需求。比如两条链路到同一目的地一条是千兆专线一条是百兆备份你可以通过手动修改Cost来让流量走千兆链路备份链路平时不承载流量[Huawei-GigabitEthernet0/0/0] ospf cost 10手动配置Cost的方式非常灵活比调整带宽参考值更精准。修改后可以用display ospf routing查看OSPF路由表确认选路结果是否符合预期。4. 故障排查三板斧error表、debug与抓包4.1 OSPF error表里查问题比想象中清晰热词里有句话说得特别对“ospf error表里面查问题老清晰了”。很多同行遇到OSPF问题第一反应就是抓包但抓包需要镜像口、需要分析工具有时候还不一定抓到点子上。实际上设备自带的OSPF error表往往能直接告诉你问题出在哪个环节。华为设备查看OSPF错误统计的命令是[Huawei] display ospf error这条命令输出的是一张大表里面有各种错误计数器的累计值比如Bad Packet、Bad Area ID、Bad Authentication、Bad Neighbor、Bad Sequence Number、Bad Checksum、Duplicate ID等。每一项含义都很明确而且计数器是不断累加的如果某个计数一直在增长说明问题正在发生或者曾经发生过。我在一次项目割接中遇到过一个典型问题两台交换机之间的OSPF邻居建立不起来一直卡在ExStart状态。当时没有时间部署抓包直接display ospf error发现Bad Sequence Number计数在快速增长再查了两端接口的MTU果然是MTU不一致导致DBD报文在中间被丢弃。把其中一台的MTU调成一致后邻居立刻变成Full。整个过程不到两分钟效率远高于抓包分析。再举一个例子如果错误表里面Bad Area ID计数很高说明收到了区域ID不匹配的Hello报文那就要检查两端接口的area配置如果Bad Authentication计数高说明认证密码或者认证类型不一致如果Bad Checksum计数高大概率是链路传输有问题数据包在中间被破坏这时就要查光模块、网线、中间设备是否异常。使用error表排查的最高境界是逆向推导。比如邻居状态一直在Init你看到错误表里错误类型为空说明没有收到对方的回包这时候就要查是不是组播被阻断了或者接口没有宣告进OSPF。错误表的每一列都是线索把它们组合起来就能还原完整的问题链路。这也是为什么很多老工程师遇到OSPF问题第一反应就是看error表因为它是设备自己记录的“案发现场”。4.2 debug ospf生产环境下的谨慎武器当error表给出的信息不够时debug是第二板斧。华为设备的debug命令是在系统视图下执行的[Huawei] debugging ospf packet [Huawei] debugging ospf event [Huawei] terminal monitor [Huawei] terminal debugging开启之后控制台会实时打印OSPF收发报文的详细信息包括报文类型、源地址、目的地址、接口、认证信息等。这对于分析邻居建立过程、Hello交互异常非常直观。但是这里要强调一个非常重要的经验debug在现网生产设备上要极其谨慎。OSPF报文高发环境下debug输出会大量占用设备CPU资源严重时甚至导致设备临时无响应。我的习惯是第一尽量在维护窗口内使用第二先通过terminal monitor确认控制台有输出再打开debug第三问题定位后马上执行undo debugging all关闭所有debug同时undo terminal debugging和undo terminal monitor。有一次遇到一个OLT设备上报“OSPF邻居反复震荡”的工单我在现场开启了debug ospf packet发现设备一直在收到一个源地址不属于任何已知邻居的Hello报文而且报文里的Router-ID是随机变化的。顺着这个线索查下去发现是一台接入交换机误配了OSPF和设备连到了同一广播域。这种问题单看error表很难定位因为错误计数增长得太杂但debug里的报文内容直接指出了源头。还有一种常见场景是OSPF认证失败。配置了MD5认证但密码不一样Hello报文的认证部分校验失败邻居建立不起来。用debug ospf packet能看到类似“The packet is discarded. Authentication fail”的提示一目了然。相比之下如果只看error表里Bad Authentication计数增长你还需要去两端核对配置效率反而慢一些。用debug排查问题时我还有一个建议尽量缩小范围。比如怀疑某个接口的问题就先在接口视图下抓包而不是全局debug怀疑Hello交互问题就只看ospf packet不要连event一起开。输出信息越少分析起来越省力也会少打扰现网。4.3 抓包验证什么时候真的需要怎么看虽然热词说“抓包都不用”但我不建议彻底扔掉抓包。原因很简单error表和debug显示的是设备自己视角的信息而抓包能还原链路上真实传输的每个字节尤其在排查MTU、校验和、报文被中间设备篡改这类问题时抓包是决定性的证据。什么时候真的需要抓包第一种两端设备都查了error表、debug都没看到明显异常但邻居就是起不来这时候要用抓包看看报文到底有没有到对端、发了什么样的内容第二种怀疑中间链路或者中间设备有问题比如二层交换机过滤了组播、防火墙拦截了OSPF协议只有抓包才能确认第三种需要精确确认OSPF报文中的某个字段比如验证DBD报文中的MTU值、DBD描述标志位等。抓包时要注意位置选择。如果可能在两端设备的物理接口上分别抓包对比两端收到的hello报文是否一致。抓包工具用Wireshark它有专门的OSPF解析器会显示所有字段包括Router-ID、Area ID、Auth Type、Hello间隔、Neighbor列表等。我曾经遇到一个非常诡异的问题两台路由器直连OSPF邻居时好时坏抓包发现中间交换机对OSPF组播报文做了限速和优先级重新标记导致部分Hello报文延迟到达Dead间隔超时后邻居反复震荡。这种问题如果不抓包光看设备日志可能要排查很久。还有一种典型场景是OSPF报文过大被中间链路分片丢弃。这通常发生在两端MTU不一致时DBD报文携带大量LSA摘要报文大小超过路径MTU无法传递。抓包时你会看到DBD报文有IP层的分片标记但接收端可能只收到一部分分片就丢弃了从而卡在Exchange状态。这种场景下先查MTU再用error表确认最后抓包佐证整个排查链条非常清晰。总结一下我的排查顺序第一display ospf peer看邻居状态卡在哪第二display ospf error看错误计数是否存在增长项第三两个动作不够或信息不全时再开debug看具体报文内容第四确实需要精确验证时上抓包。这个顺序可以把排查效率提到最高多数场景到第二步就能定位这就是为什么热词里说error表很清晰。5. 常见问题速查与运维心得5.1 OSPF故障速查表为了方便日常运维快速定位问题我整理了一张高频故障速查表都是实际项目里反复遇到的问题每个条目都给出了现象、原因和排查思路建议收藏备用。故障现象可能原因排查思路邻居一直卡在DownHello不发或没收接口没宣告进OSPF、组播被过滤、链路故障display ospf interface确认宣告display ospf error看有无收包邻居卡在Init收不到回包对端没宣告该网段、Hello参数不匹配、单通核对两端network命令检查对端error表检查链路双向性邻居卡在Two-Way不建立Full广播网络中等待DR/BDR选举检查接口优先级配置用display ospf peer detail看DR/BDR邻居卡在ExStart/ExchangeMTU不一致、DBD序号协商异常、链路有分片调一致MTUdisplay ospf error看Bad Sequence必要时抓包邻居建立后反复震荡链路质量差、中间设备干扰、Router-ID冲突看日志中的震荡原因display ospf error看校验错检查中间设备对组播的处理路由表中缺少某个网段路由该网段没宣告、LSA未生成、区域间汇总缺失display ospf lsdb里查对应LSA确认ABR的Type 3发布外部路由学习不到ASBR引入失败、区域类型阻止Type 5/7传递display ospf lsdb看Type 5/7确认区域不是Stub/Totally Stub阻碍传播这张表只是一个起点真正排障时还是先看error表和邻居状态再去套表定位。5.2 几条实战心得能帮你少踩几个坑第一Hello/Dead间隔最好不要随意修改。华为设备默认Hello间隔10秒、Dead间隔40秒这个参数绝大多数场景都够用。改了会产生连锁问题比如两边间隔不一致无法建立邻居而且调快会增大CPU和流量开销调慢了收敛变慢。除非有明确的业务需求否则保持默认值。第二多区域OSPF规划时区域0里至少要有两台设备做ABR。如果区域0只有一台路由器挂了所有非骨干区域都会失去和骨干的连通性整个网络的区域间路由都会中断。生产环境里我会尽量让区域0的设备形成冗余避免单点故障影响全局。第三Loopback接口一定要配置IP地址并且宣告到OSPF里。Loopback接口是稳定的业务地址很多人只在上面配置了一个IP却没有把它宣告进OSPF导致其他设备无法通过Loopback地址访问这台设备。常见的做法是配置一个32位掩码的Loopback地址并宣告作为设备的管理地址和Router-ID来源。第四OSPF认证该上就要上。在接口下开启简单的MD5认证可以避免非法设备误接入网络后自动建立OSPF邻居造成路由污染。华为设备接口下配置[Huawei-GigabitEthernet0/0/0] ospf authentication-mode md5 1 huawei接口两侧配置的认证模式、认证ID和密钥必须完全一致否则邻居起不来。这类问题在error表里会显示Bad Authentication计数增长排查起来很快。第五也是最重要的一条经验文档规范比技术本身更值钱。把每台设备的Router-ID、所属区域、接口网络类型、OSPF开销、认证配置全部记录在案。我见过太多网络设备一多、人员一换连Router-ID是自动选出来的还是手动配置的都搞不清楚出了故障只能满设备翻命令。一份清晰的OSPF规划表能让排除时间缩短一半以上。回到开头说的热点OSPF排查这件事掌握好顺序和工具真的没有想象中那么难。error表是设备给我们的第一手线索debug是进一步深挖的手段抓包是最后拿证据的方式。把这三板斧配合好现网里百分之八九十的OSPF故障都能在短时间内定位清楚。我个人在实际操作中的体会是OSPF的学习和运维本质上是对“状态”和“信息”的管理。状态有没有到位信息有没有传对把这两条线搞清楚很多问题不用猜一查便知。希望这篇文章能帮你在下次遇到OSPF问题时少走一些弯路把问题解决得更快更干净。
返回列表