
1. 实验设计思路我要跑通什么1.1 为什么把OSPF当主线做网络实验绕不开动态路由动态路由里又绕不开OSPF。我在模拟器里第一次敲OSPF配置时照着教程把命令敲进去看着邻居状态从Down一路变到Full以为这事就成了。后来面试被问到“DR挂了你觉得结果是什么”我才发现自己只会抄命令对协议本身一知半解。这篇文章就是一次完整OSPF实验的记录从环境搭建、拓扑设计、单区域配置、多区域扩展到排错和扩展玩法把整个实验从头到尾说清楚。适合谁看刚入门网络的新手或者在学校做过实验但没过过体系化练习的人。有经验的工程师也可以重点看看排错那部分毕竟很多坑是在真实项目里才会暴露的。这里不会花大篇幅讲OSPF的RFC细节重点是把实验场景还原出来让你照着做也能跑通并且能看懂每一步背后的原理。1.2 实验目标和验证点我给自己定的实验目标不是“把路由跑通”而是把OSPF的关键行为都亲手验证一遍。要验证的点包括邻居状态机怎么变化、DR/BDR怎么选出来、Hello报文多久发一次、LSA怎么泛洪、区域边界路由器怎么传路由、Cost怎么影响选路。这些行为如果不亲手做实验光靠背书真的记不住。我的做法是每配完一个阶段就保存一份配置和验证输出用文本记录邻居状态、路由表、LSA数量。这样后面排错时能对照“正常情况是什么样”效率高很多。建议你也养成这个习惯做实验记录比跑通实验结果本身更值钱。2. 环境准备与模拟器选型2.1 三种模拟工具的取舍模拟器选择会直接影响实验体验。我试过图形化模拟器、带虚拟化引擎的仿真平台也用过设备厂商自带的轻量模拟器三类各有特色。图形化模拟器胜在安装简单、设备型号齐全适合刚入门的人练配置虚拟化仿真平台能吃下大型拓扑还能把抓包工具跑起来观察协议报文适合做进阶实验自带模拟器最大优点是一键拉起真实设备的简化版但轻量往往意味着有些协议特性不支持。从OSPF实验的角度我的建议是如果只是想验证配置命令随便拿一款模拟器都行如果想观察邻居状态机、LSA泛洪、Cost选路这些动态过程尽量选支持抓包、能看清协议报文的平台。我自己最后固定用的是带虚拟化引擎的那个方案因为实验做到后面要看Hello包里到底装了什么字段轻量模拟器满足不了。2.2 拓扑结构与地址规划这次实验用三台路由器命名R1、R2、R3三台路由器串成一条链路另外每台路由器加一个Loopback口模拟业务网段。为什么选三台而不是两台两台跑OSPF虽然能通但看不到DR/BDR选举的过程——广播网络里少于三台设备很难把选举的优先级关系体现出来。环回口又为什么要加因为OSPF实验中环回口可以稳定地生成直连路由后面验证路由表、做汇总实验都用得上不会受物理链路抖动影响。地址规划我习惯按接口所在链路来分。R1和R2之间的链路用一个子网R2和R3之间用另一个子网每台设备的环回口单独占一个32位地址段。这样看路由表时一眼就能看出路由是从哪条链路学到的排错时不用去翻配置。IP地址尽量连续分配链路1用10.12.0.0/24链路2用10.23.0.0/24环回口用1.1.1.1、2.2.2.2、3.3.3.3。这套规划在后面配置命令时会反复用到。提示地址规划在实验里看似小事情却是整个实验里最不能偷懒的一步。地址不连续做路由汇总实验时根本没法汇总只能重配等于白做一遍。3. 动手前必须吃透的四个机制3.1 区域OSPF的组织逻辑OSPF把一个自治系统拆成多个区域核心逻辑是让每台设备只维护自己所在区域的链路状态数据库跨区域只交换汇总后的路由。你可以把区域理解成公司的部门部门内部每个人都知道其他人的联系方式但全公司只看一份人员名册汇总信息由指定的人报上去。区域编号从0开始Area 0是骨干区域其他区域必须与骨干区域直接相连。实验里我先是单区域Area 0跑通再扩展成Area 0加Area 1的多区域场景。分区域带来的一个直接影响是LSA类型的变化区域内是路由器LSA和网络LSA区域间传播的是汇总LSA。看路由表时O代表域内路由O IA就是跨区域学到的路由两个前缀含义完全不同。3.2 Router ID路由器的身份证Router ID在OSPF里是路由器的身份标识所有邻居关系、LSA的产生者都是拿它来区分的。选举规则是手动配置优先其次是设备上数值最大的环回口地址再其次是数值最大的物理接口地址。实验里一定不要省这一步每台设备明确指定一个Router ID比如R1就是1.1.1.1R2就是2.2.2.2。否则设备会自动选选出来的结果跟你的预期经常不一致会干扰对整个协议的判断。注意改Router ID不是改了立刻生效必须重启OSPF进程才会重新选举。我见过有人改完Router ID发现邻居关系全掉了以为配置有问题其实就是OSPF进程还没重新启动。这个现象在实验里特别容易让人误会。3.3 DR/BDR广播网络里的邻居管理OSPF在广播型网络典型是以太网里不会让每台设备都跟所有邻居建立完全邻接关系而是选出一台DR和一台BDR其余路由器只跟DR和BDR建立邻接DROther之间停留在Two-Way状态。举一个开会的例子一群人讨论问题如果每个人都互相传话会乱成一团不如选一个会议记录员DR所有人把意见交给他他有义务把内容同步给在场的每个人BDR是副手平时不发言只有DR出问题才顶上。选举规则比拼的是接口优先级和Router ID优先级高者胜出相同则Router ID大者胜出。刚学的人有一个常见误区以为新加入的设备Router ID更大就能当DR。其实DR选举不是谁大谁上已经存在的DR有抢占权新设备即使优先级更高也不会把现役DR挤掉除非手动重启OSPF进程或清掉邻居关系。做实验时故意改变优先级观察状态变化比单纯背结论印象深得多。3.4 Cost与选路实验里最好玩的部分OSPF选路看的是Cost值计算方式是参考带宽除以接口带宽默认参考带宽是100Mbps。所以百兆接口Cost是1千兆接口算出来是0.1实际取1万兆也是1。这也是很多人在真实网络里会发现千兆和万兆走同一条路的原因——默认公式对高速接口不敏感。解决办法是在OSPF进程下调整参考带宽让高速接口的Cost值能区分出来。实验里验证Cost特别有意思。我把R1到R2的链路Cost改成10R1访问R3时即使要经过两台路由器、多个跳数只要总Cost更小OSPF就会选那条更“绕”但开销更小的路。这种“跳数多但开销小”的选路逻辑正是动态路由协议的价值所在也是静态路由很难模拟出来的。4. 单区域实验完整配置4.1 基础接口IP与环回口配置开始配置前先把所有接口地址敲好。R1的两个接口连接R2的接口配10.12.0.1/24环回口配1.1.1.1/32。R2连接R1的接口配10.12.0.2/24连接R3的接口配10.23.0.2/24环回口配2.2.2.2/32。R3连接R2的接口配10.23.0.3/24环回口配3.3.3.3/32。接口IP配错是最低级的错误但也是最常见的错误我见过有人把网关地址写错导致能ping通但路由学不全。环回口配置时有个细节要记住OSPF默认把环回口当作被动接口不发送Hello报文所以它不会参与邻居建立但宣告环回口网段后路由表里只会出现一条32位的主机路由。这个现象在实验里看到不要慌环回口在OSPF里默认就是按主机路由发布的。4.2 启动OSPF并宣告网段接口IP配好后进入OSPF配置。下面的配置命令以主流厂商的通用命令行风格为例换到其他设备只需要注意关键字差异。进程号本机有效实验里统一用1。每台设备都要手动指定Router ID然后宣告接口所在的网段R1(config)# router ospf 1 R1(config-router)# router-id 1.1.1.1 R1(config-router)# network 10.12.0.0 0.0.0.255 area 0 R1(config-router)# network 1.1.1.1 0.0.0.0 area 0这里的反掩码是新手最容易写错的地方。0.0.0.255表示只匹配前24位也就是说只要IP地址前24位是10.12.0不管是10.12.0.1还是10.12.0.254都会进入OSPF宣告范围。很多人把反掩码写成255.255.255.0那表示匹配后24位根本匹配不上OSPF进程不会宣告任何网段。宣告环回口用0.0.0.0表示精确匹配这一个地址。R2和R3的配置逻辑一样只是网段和Router ID不同。R2需要宣告10.12.0.0、10.23.0.0、2.2.2.2三个网段R3宣告10.23.0.0和3.3.3.3R3(config)# router ospf 1 R3(config-router)# router-id 3.3.3.3 R3(config-router)# network 10.23.0.0 0.0.0.255 area 0 R3(config-router)# network 3.3.3.3 0.0.0.0 area 0全部配完后邻居状态会在几十秒内从Down变成Init、Two-Way、ExStart、Exchange、Loading最后稳定在Full。如果卡在中间某个状态不要急着重配去查接口MTU和Hello间隔这两个是最常见的翻车点后面排错部分详细说。4.3 验证邻居状态和路由表配置完成后第一件事是验证邻居。我会执行下面几条命令R1# show ip ospf neighbor R1# show ip route ospf R1# show ip ospf interface正常情况下show ip ospf neighbor能看到R2的Router ID、邻居状态是Full、以及邻居是DR还是BDR。路由表里能看到通过OSPF学到的路由比如R3的3.3.3.3/32在R1上会显示为O 3.3.3.3/32表示这是一条OSPF域内路由。如果只有直连路由先检查是不是邻居状态没有到Full再看宣告网段是否漏了。实验建议养成随手保存验证输出的习惯。我在每个阶段都会把show ip ospf neighbor和show ip route ospf的结果存成一个文本文档后面出现问题随时翻出来对比。判断一个协议状态是不是正常最快的方法就是跟“正常时”的输出做对比比重新翻配置快得多。5. 从单区域扩展到多区域5.1 多区域拓扑怎么改造单区域跑通后把实验升级成多区域。区域划分的原则是Area 0必须是骨干区域所有非骨干区域都要跟Area 0相连。我把R1、R2放在Area 0把R2和R3之间的链路放到Area 1。这样R2同时属于Area 0和Area 1它就是区域边界路由器ABR负责在区域之间传递汇总路由。改造方法不是在某些地方加一条命令那么复杂而是要把R3连接R2的接口配置从area 0改成area 1同时R2的对应接口也要改成area 1。注意两个相邻接口必须落在同一个区域否则邻居关系根本建不起来。实验里最常见的问题是接口A放在Area 0接口B放在Area 1跟对方接口不在同一个区域邻居就一直卡在Down。5.2 ABR上的配置变化R2作为ABR配置上不用额外指定身份只需要在发OSPF的两个接口上分别宣告网段到正确的区域。R2连接R1的接口宣告到Area 0连接R3的接口宣告到Area 1R2(config)# router ospf 1 R2(config-router)# router-id 2.2.2.2 R2(config-router)# network 10.12.0.0 0.0.0.255 area 0 R2(config-router)# network 2.2.2.2 0.0.0.0 area 0 R2(config-router)# network 10.23.0.0 0.0.0.255 area 1等收敛后R1上会看到来自R3的网段变成O IA路由。O代表域内IA代表区域间。这个O和O IA的差异就是多区域实验里最直观的观察点。我在实验中还会做一个对比单区域时R1学习R3的环回口是O路由改成多区域后同样的目标变成了O IA路由。路由到达目标的方式没变但路由类型变了。这个细节能帮你理解区域划分是如何影响路由表标识和LSA传播范围的。5.3 区域间汇总试一下多区域跑通后可以加一个扩展实验在ABR上做区域间路由汇总。R2把Area 1里的环回口地址汇总成一段对外只宣告一条聚合路由。配置命令在ABR的OSPF进程下执行R2(config-router)# area 1 range 3.3.3.0 255.255.255.0执行完到R1上看路由表原本一条条3.3.3.x明细路由会变成一条3.3.3.0/24的汇总路由。这样做的好处是减少路由表条目数量减少LSA泛洪量。但汇总有个前提条件被汇总的网段地址必须连续。如果地址规划没有提前设计好汇总会掩盖明细路由反而出问题。所以在多区域实验里地址规划这笔账从一开始就要算好。6. 实验排错我遇到过的问题6.1 邻居状态卡的经典原因OSPF邻居建立失败的案例里排第一的是反掩码写错导致宣告网段没进OSPF第二是两边接口MTU不一致。MTU不一致的现象很典型邻居状态会卡在ExStart或者Exchange两台设备都反复重传数据库描述报文但路由表就是学不到路由。原因是OSPF在建立邻接时用DBD报文协商MTU两边不一致就一直协商不过。解决办法要么把接口MTU改成一致要么在接口下忽略MTU检查。我自己的习惯是实验环境直接忽略MTU检查生产环境必须统一MTU。Hello间隔和Dead间隔不一致也是高发问题。Dead interval默认是Hello间隔的4倍有人单独改了Hello间隔没改Dead邻居状态就会出现忽通忽断。OSPF里Hello报文默认每10秒发一次Dead是40秒也就是连续4个Hello没收到就判定邻居down。做实验时只改Hello不改Dead是最容易踩的坑。6.2 路由学不到的排错路径如果邻居状态已经Full但路由表什么都没有先别怀疑OSPF配置按顺序查三件事。第一查宣告网段是否漏了。环回口有没有宣告、业务网段有没有宣告漏一个就少一条路由。第二查路由过滤。看看是否有人在进程下配了distribute-list或者前缀列表把某些路由过滤掉了。实验环境一般没有但查一下成本很低。第三查区域间的LSA传递。多区域环境下非骨干区域的明细路由要通过ABR转发ABR上如果有汇总命令配错路由就会被吞掉。我的排错路径很固定先看邻居再看接口再看路由表最后看配置。不要一上来就翻配置先看现象。邻居状态卡在哪一步是最快定位问题的办法。状态机每个状态都有对应含义卡在Down说明Hello没收到卡在ExStart说明DBD协商出问题卡在Two-Way说明只是邻居不是邻接——这在DROther之间是正常现象。6.3 排错命令速查表排错时我经常用下面这些命令整理成速查表方便你对照目标命令观察重点查看邻居状态show ip ospf neighbor状态是否为FullDR/BDR是否正确查看OSPF路由show ip route ospf是否出现O、O IA路由查看接口OSPF参数show ip ospf interfaceHello/Dead时间、Cost、网络类型、邻居数量查看LSDB概要show ip ospf databaseLSA类型和LSA数量查看进程状态show ip ospfRouter ID、区域列表、SPF执行次数实时追踪邻居变化debug ip ospf events邻居状态机跳转过程注意debug命令在生产环境慎用可能打满CPU。实验环境随便开用完立刻关。我自己常用的善后命令是undebug all防止忘记关闭导致模拟器卡顿。7. 把实验往后推一步三个扩展玩法7.1 手动改Cost观察选路把R1到R2的接口Cost改成10后看R1访问R3环回口时下一跳有没有变化。如果不变化说明原路径Cost本来就小如果变化说明OSPF确实把Cost总和作为选路依据。这个实验做完你会真正理解“Cost是OSPF选路的唯一度量”这句话的意思。改Cost命令R1(config)# interface g0/0 R1(config-if)# ip ospf cost 10改完做两件事一是看show ip route确认路径变更二是看show ip ospf interface确认Cost生效。SPF重算需要一段时间路由更新会有几十秒的延迟。耐心等不要频繁敲命令频繁操作反而容易混淆状态。7.2 抓包看OSPF报文细节有条件的话在模拟器里给实验链路开启抓包过滤OSPF协议你会看到Hello报文定时10秒发一次报文里有Router ID、Area ID、邻居列表、DR优先级等字段。这个视角特别有用它能让你跳出“敲命令”的层面直接看到协议在工作。我第一次看到自己的设备在报文中被列为邻居时对OSPF的理解立刻上了一个台阶。抓包时注意一个现象Hello报文的目的地址是组播地址多数抓包工具默认能抓到组播。如果看不到Hello报文检查抓包过滤器和接口抓取位置抓在路由器之间那条链路上别抓错接口。7.3 手动改Router ID重选举把R1的Router ID从1.1.1.1改成4.4.4.4然后重启OSPF进程clear ip ospf process。你会发现所有邻居关系重新建立DR/BDR可能发生变化。这个实验验证的就是Router ID在选举中的作用以及OSPF邻居关系对Router ID的敏感度。做这个实验时注意重启进程会导致正在传输的数据包短暂中断。模拟环境无所谓但要在脑子里保留这个概念真实网络中乱清OSPF进程业务是会中断的。实验归实验生产环境里的每一条命令都要先想清楚影响范围再执行。8. 实验后的复盘三个习惯与学习线路8.1 踩坑之后的三个习惯几次实验做完我养成了三个习惯。第一个是配完接口和OSPF之后第一件事不是ping目标而是看邻居状态。邻居没到Full后面的一切验证都是空谈。第二个是每次实验都保存配置和验证输出哪怕只是模拟器里的三台路由器记录的习惯能在排错时大幅节省时间。第三个是动手改任何参数之前先保存当前配置改坏了能快速回滚而不是从头再敲一遍。这三个习惯看起来都是小事但实验做得多了你会发现绝大多数时间都浪费在“回滚”和“对比”上。有了对照记录很多问题一眼就能看出来不用反复翻历史命令。8.2 给新手的学习线路如果你刚开始接触OSPF我的建议是不要一上来就搭一个大拓扑。先用两台设备把邻居跑起来再用三台设备体验DR选举然后按顺序做单区域、多区域、汇总、Cost选路、抓包一步一步来。不要急着铺开学更多协议OSPF是链路状态协议的代表把它吃透后面再学其他动态路由协议会轻松很多。做实验最重要的是亲手感受协议的行为变化而不是把配置命令背下来。命令会忘但“邻居状态卡在ExStart是因为MTU不一致”这种排错手感是会一直跟着你的。