ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OSPF实验报告:邻居状态机与故障排查实战

OSPF实验报告:邻居状态机与故障排查实战 这份OSPF实验报告是在GNS3里反复折腾了两周才整理出来的。前后搭了四台路由器把邻居建立、区域划分、ABR角色、路由汇总都过了一遍又故意埋了两个非常典型的雷一个是让邻居反复震荡另一个是直接卡在ExStart状态拉不起来。整个实验做完我最大的体会是OSPF出了故障第一件事真的不应该是开Wireshark抓包而是先去看进程里的error表配合debug事件绝大多数邻居起不来的问题当场就能定位。这也是我为什么要把这份报告写出来的原因——拓扑和配置本身不复杂真正值得参考的是排查思路。1. 实验目标与网络环境规划为什么这个拓扑能覆盖OSPF核心知识点1.1 从实验目标反推拓扑设计写实验报告之前我习惯先把目标列清楚因为拓扑设计是用来服务目标的不是为了好看才拉一堆设备。这次实验我定了几个明确的目标完整观察OSPF邻居状态机的迁移过程不只看最终Full状态验证Router-ID的选举规则并练习手动指定通过多区域配置理解ABR的角色和工作方式对比查看1类、2类、3类LSA在LSDB里的差异在ABR上做区域间路由汇总看3类LSA如何被收敛人为制造两个常见OSPF邻居故障练习用error表和debug快速定位平台选的是GNS3镜像用的IOSv。选IOSv而不是老一点的c3725主要原因是命令输出更接近生产环境虚拟化时钟抖动也小不会莫名其妙把邻居搞Down。这点在后面排错时尤其关键——如果实验环境本身不稳定你很容易把环境抖动当成配置错误来查白白浪费时间。1.2 拓扑与地址规划拓扑是经典的一条链四台设备串联R1(1.1.1.1) --- R2(2.2.2.2) --- R3(3.3.3.3) --- R4(4.4.4.4)区域设计的思路是R1和R2之间的互联链路放在area 0R2和R3、R3和R4之间的链路放在area 1。这样R2一端连着area 0、一端连着area 1天然就是ABR。R3和R4则是普通内部路由器。各设备接口和Loopback地址规划如下设备接口IP地址子网掩码OSPF区域R1Loopback01.1.1.1/320R1Ethernet0/010.0.12.1/300R2Loopback02.2.2.2/320R2Ethernet0/010.0.12.2/300R2Ethernet0/110.0.23.2/301R3Loopback03.3.3.3/321R3Ethernet0/010.0.23.3/301R3Ethernet0/110.0.34.3/301R4Loopback04.4.4.4/321R4Ethernet0/010.0.34.4/301互联地址全用/30两个可用地址刚好够OSPF邻居通信。生产环境里以太网互联用/30或者点对点用/31都很常见GNS3里用/30还有一个好处是通配符掩码0.0.0.3便于理解和计算。为了后面演示路由汇总我额外在R3和R4上各加了一个Loopback1来模拟业务网段R3 Loopback1172.16.0.1/24R4 Loopback1172.16.1.1/24R4 Loopback2172.16.2.1/24这三个网段都在area 1里宣告等到配area range时就能看到汇总效果。1.3 基础环境准备在配OSPF之前先把所有接口IP和Loopback配置好注意接口默认是关闭状态记得敲no shutdown。我还有一个习惯每台路由器的配置里都加上no ip domain-lookup和logging synchronous。前者防止敲错命令时设备傻乎乎去查DNS导致卡顿后者保证日志和命令行不互相刷屏实验过程中看debug输出会舒服很多。提示实验环境里设备时间不同步不影响OSPF邻居建立但会影响日志时间戳对排查故障的时间线定位很不利。建议启动GNS3项目后先手动校准四台设备的时钟至少让它们接近一致。另外建议给每台设备改好主机名R1到R4区分开。我在实验室里见过太多人四台设备全是默认主机名调试时输出混在一起都不知道是在哪台设备上敲的这种低级错误会浪费大量时间。2. Router-ID与Network宣告最基础的环节恰恰最多人翻车2.1 Router-ID的选举规则与手动指定OSPF用Router-ID来唯一标识一台路由器它不是一个IP地址意义上的东西就是一个32位的标识符。选举优先级从高到低是手工配置的router-idLoopback接口上的最大IP地址物理接口上的最大IP地址这里有个容易踩的坑OSPF进程一旦启动Router-ID就确定了运行过程中即使你改了接口IP或者增加LoopbackRouter-ID也不会自动更新必须手动重启OSPF进程才生效。所以实验里我统一采用手工指定四台设备分别是1.1.1.1、2.2.2.2、3.3.3.3、4.4.4.4方便记忆也方便排查。生产环境的惯例也类似Router-ID一般直接规划成设备管理Loopback地址一眼就能看出是哪台设备。R1的基础OSPF配置router ospf 1 router-id 1.1.1.1 network 10.0.12.0 0.0.0.3 area 0 network 1.1.1.1 0.0.0.0 area 0R2作为ABR配置要跨两个区域router ospf 1 router-id 2.2.2.2 network 10.0.12.0 0.0.0.3 area 0 network 2.2.2.2 0.0.0.0 area 0 network 10.0.23.0 0.0.0.3 area 1R3和R4同理R3宣告10.0.23.0/30、10.0.34.0/30、3.3.3.3/32进area 1R4宣告10.0.34.0/30、4.4.4.4/32进area 1额外把几个业务Loopback也宣告进去。注意修改Router-ID之后一定要clear ip ospf process生产上操作前要确认影响因为这会瞬间重建所有OSPF邻居关系。华为设备上对应的是在OSPF进程下手动配router-id之后执行reset ospf process。2.2 network命令与通配符掩码的计算逻辑network 网段 通配符掩码 area 区域这条命令做了两件事在匹配的接口上启用OSPF并且把该接口所在的网段宣告进指定区域。很多人不理解为什么这里要写通配符掩码其实它就是子网掩码按位取反。计算方法很简单255.255.255.255 减去子网掩码。比如 /30 的子网掩码是255.255.255.252通配符就是0.0.0.3/24 就是0.0.0.255单个主机地址就是0.0.0.0。常见错误有两种第一种是通配符写错比如把0.0.0.3写成0.0.0.7多出来的地址范围可能把不该宣告的接口也匹配进去或者反过来匹配不完整。第二种是area号写错同一个网段在两端配了不同区域号邻居永远起不来而且你光看配置不一定能发现。还有一点值得说network命令匹配的是接口不是路由。它的作用范围是防区式的匹配到一个接口之后该接口所在的整个链路网段都会参与OSPF。有同学把network 10.0.12.1 0.0.0.0这种写法当成宣告单个接口配置能生效但可读性差后续地址调整容易漏。建议统一按网段宣告。如果你用的IOS版本比较新也可以在接口下直接写ip ospf 1 area 0效果一样还不用算通配符。两种方式我建议都掌握考试和老设备上常见前者新的自动化编排场景里后者更简洁。2.3 邻居状态机迁移的观察方法配置完成后先看邻居show ip ospf neighbor正常情况下四台路由器之间应该出现Full状态比如R2上能看到和1.1.1.1以及3.3.3.3的两个邻居关系。很值得做的一件事是在配置OSPF之前先敲debug ip ospf adjacency然后再配置network命令这样能看到完整的邻居状态迁移日志OSPF: 2.2.2.2 addr 10.0.12.2 1.1.1.1: state changed from DOWN to INIT OSPF: 2.2.2.2 addr 10.0.12.2 1.1.1.1: state changed from INIT to 2-WAY OSPF: 2.2.2.2 addr 10.0.12.2 1.1.1.1: state changed from 2-WAY to EXSTART OSPF: 2.2.2.2 addr 10.0.12.2 1.1.1.1: state changed from EXSTART to EXCHANGE OSPF: 2.2.2.2 addr 10.0.12.2 1.1.1.1: state changed from EXCHANGE to LOADING OSPF: 2.2.2.2 addr 10.0.12.2 1.1.1.1: state changed from LOADING to FULL每个状态的含义简单说DOWN是冷启动没收到任何HelloINIT是收到了对方Hello但对方还没把我列入邻居列表2-WAY是双向互通多路访问网络里DR/BDR选举就发生在这个状态之后EXSTART是协商DBD的主从关系和序列号EXCHANGE是交换链路状态摘要LOADING是请求缺失的LSAFULL代表LSDB同步完成。一个非常有用的实验心得不要只在心里背状态机要真的开debug看一遍。状态机在纸上是一回事看设备实时输出是完全另一回事。比如EXSTART到EXCHANGE卡住的现象如果你没见过真到排错时会非常慌。另外由于实验里每段互
返回列表