学员问得最多的OSPF问题,往往不是“怎么配”,而是“为什么我照着文档敲了,邻居就是不起来”。我当年备考数据通信方向的认证时,也被OSPF这块折腾得不轻。标题里的“数据通信07-OSPF”如果按课程目录来算,只是第七讲,可在真实网络环境里,它几乎是IGP的代名词,也是你从“会配静态路由”走向“能设计整张网络”的分水岭。
这篇文章不打算把RFC 2328从头背给你听,而是把我这几年在设备上调OSPF、查OSPF、被OSPF坑过很多次之后攒下来的经验一次性整理出来。从邻居状态机、区域与ABR的职责,到用 display ospf error 和 debug 一线排障的逻辑都会覆盖。适合正在备考数通认证的学生、刚入行走网络运维的兄弟,以及那些“命令能敲通、一问你原理就心虚”的同行。
1. 先搞清楚:OSPF在数据通信里到底解决什么问题
1.1 从RIP到OSPF:为什么链路状态协议能取代距离矢量
OSPF全称是Open Shortest Path First,中文叫开放最短路径优先。它属于IGP(内部网关协议),是标准的链路状态协议。和它经常放在一起对比的,是RIP这种距离矢量协议。
RIP的逻辑很简单,可以理解成村里传话:每个人只知道“我离某个地方还有几跳”,然后邻居听邻居说,一层层传出去。这套模式最大的问题有两个:一是收敛慢,RIP靠30秒周期更新,哪条链路断了可能要几分钟才能传遍全网;二是容易出环路,虽然用最大跳数和水平分割做了约束,但网络稍微大一点,路由环就压不住。早期网络规模小,这些缺陷还能忍,现在一张企业网动辄几百台设备、几十个网段,RIP根本扛不住。
OSPF换了一套思路。每台路由器不“传话”,而是把自己有哪些接口、接口上连着哪些网段、链路的开销是多少,这些信息做成LSA(链路状态通告),在整个区域里洪泛。最后每台路由器手里都有一张一模一样的“地图”——也就是链路状态数据库LSDB。基于这张完整地图,用SPF算法(最短路径优先算法,本质是Dijkstra算法)自己计算出一棵无环的最短路径树。路由器不再依赖邻居“告诉”它路由,而是自己拿地图算出来。
这个差别带来三个实打实的好处:
- 收敛快:拓扑变化触发更新,不需要等周期计时器,秒级甚至毫秒级收敛。
- 无环路:每台设备都基于全网拓扑做SPF计算,天生是一棵树,不会出现RIP那种环路问题。
- 开销可控:以cost(开销值)作为度量,综合考虑带宽而不是简单数跳数,选路更合理。
这也是OSPF能成为数据通信网络主力IGP的根本原因。搞懂这一点,再去看后面的邻居状态机、区域设计,你才知道每一步都是为了维护这张“全网地图”的一致性。
1.2 OSPF适合谁学,学完能干什么
如果你正在备考华为HCIA/HCIP、思科CCNA/CCNP这一类数通认证,OSPF是绕不开的重点模块。认证考试里它占了相当大的篇幅,实验题里也经常要求你独立完成OSPF的多区域配置与故障排查。可以说,OSPF没过关,数通这条路走得会很虚。
如果你已经入行做网络运维,OSPF更是日常。企业网核心、运营商接入网、数据中心出口,到处都能看到OSPF的身影。静态路由适合小规模和固定链路,但一旦设备多、路径多、需要自动切换,OSPF几乎是默认选择。学会它,你至少能做三件事:看懂现网里的路由通告关系;在链路故障时快速判断是哪台设备、哪个区域出了问题;以及独立完成中小型网络的OSPF规划与部署。
但我的建议是,别把它当成一门“背命令”的课。OSPF最核心的资产是状态机思维——你看到邻居卡在哪个阶段,基本就知道问题出在哪一层。这种思维才是排障时真正救命的东西。
2. 邻居关系是如何建立起来的:状态机与报文
2.1 五种报文各有各的活
OSPF一共定义了五种报文,每一种在邻居建立和路由同步过程中干不同的活。很多兄弟一上来就背报文名字,背完就忘,因为不理解它们之间的先后关系和用途。我习惯用图书馆借书来打比方。
Hello报文是敲门砖。路由器启动OSPF后,周期性(默认10秒一次)往组播地址224.0.0.5发送Hello,目的就是发现直连链路上的其他OSPF设备,并且协商一些关键参数。邻居建立之后,Hello仍然继续发,起到保活作用。所以你可以把Hello理解成同事之间每10秒打一次招呼:“嘿,我还在。”
DD报文(Database Description)是图书管理员的目录页。两台路由器要同步数据,不可能直接把整个LSDB丢给对方,太耗资源。于是先交换一份“目录”——我手里有哪些类型的LSA、序号是多少、版本是多少。对方看到目录,才知道自己缺什么。
LSR报文是借书单。对照目录发现自己缺少某条LSA,就发LSR去请求。
LSU报文是真正的书。里面装着对方需要的LSA完整内容。
LSACK报文是签收回执。收到LSU后要给对方确认,确保可靠传输。
这五种报文环环相扣,完整走一遍,两台路由器才敢把状态置为Full。
2.2 从Down到Full:邻居状态机与排查分水岭
OSPF邻居状态机是排障的核心工具。我从Down开始一个个说,你对照自己的排障场景看。
Down状态是初始状态,表示还没有收到对端的Hello。如果一直停在这里,基本是物理链路不通、接口没宣告进OSPF、或者对端没开OSPF。
Init状态比较有迷惑性。它表示收到了对方的Hello报文,但对方发来的Hello里没有包含自己的Router-ID。换句话说,一方能看到另一方,但另一方还没“看见”它,也就是单通。最常见的原因是链路单向故障、ACL过滤了组播报文,或者两端的接口子网掩码不一致,导致Hello无法正常确认双向关系。
2-Way状态说明双方都在彼此的Hello里看到了对方,双向通信已经建立。在广播多路访问网络中,如果是两台DRother路由器之间,邻居状态到2-Way就正常停止了;如果是一台路由器和DR/BDR之间,则会继续向ExStart推进。
ExStart阶段开始选举主从关系,并且协商DD报文的初始序列号。卡在这里最常见的原因是MTU不一致,或者DD报文交互异常。这个阶段一旦出问题,后面根本走不下去,所以是排障的重灾区。
Exchange阶段双方互发DD报文交换目录。Loading阶段根据目录发送LSR,请求缺失的LSA。最后进入Full状态,表示两台路由器的LSDB已经同步完成,可以独立计算路由了。
我排障的习惯是:先看邻居卡在哪个状态,再反推是哪一层的问题。卡在Init,重点查链路和参数协商;卡在ExStart,重点查MTU和DD交互;卡在Exchange或Loading,重点查LSA的泛洪是否被阻断。状态机就像一张地图,告诉你距离“Full”还有多远。
2.3 Router-ID:不起眼却坑最多的参数
Router-ID是一个32位的二进制数,用来在OSPF域内唯一标识一台路由器。平时大家习惯写成IP地址的格式,比如1.1.1.1,但它本质上不是IP地址,只是一个标识符。Router-ID的选择顺序,华为设备上默认是这样的:
- 手工配置的 router-id 命令值最优先;
- 没有手工配置时,选择Loopback接口上最大的IP地址;
- 再没有Loopback,选择其他物理接口上最大的IP地址。
很多生产环境事故,都是Router-ID配置不当引起的。最常见的坑有三个。
第一个坑:忘了手工指定Router-ID,设备重启之后自动选出来的Router-ID变了,导致邻居全部重建,整网路由抖动。所以规范的做法是在ospf进程下显式配置,比如:
ospf 1 router-id 1.1.1.1第二个坑:两台路由器Router-ID配重复了。虽然系统允许你配置,但后果是邻居起来之后又断、断了又起来,反复flapping,非常隐蔽。这种问题靠肉眼看配置往往发现不了,但去 display ospf error 里查计数器,“Router ID collision”那栏会直接告诉你。
第三个坑:修改Router-ID后没有重启OSPF进程。OSPF进程一旦运行,Router-ID在整个运行周期内保持不变。你改了配置但不执行 reset ospf process,新Router-ID根本不生效,而重置进程又会导致邻居全部中断。所以改Router-ID之前必须评估业务影响,选择维护窗口操作。
3. 区域、ABR、DR/BDR:路由器的“职场分工”
3.1 所有区域都要贴着区域0:骨干区域的不可替代性
OSPF引入“区域”这个概念,本质上是为了控制LSDB的规模。想想看,几百台路由器如果在同一个区域里互相洪泛LSA,每台设备都要保存全网所有链路的详细信息,CPU和内存都会爆炸。划成多个区域后,区域内部只泛洪本区域的LSA,区域之间通过汇总后的路由信息传播,LSDB规模大幅下降。
但区域怎么划是有硬性规定的:所有非骨干区域必须与骨干区域(Area 0)相连,要么物理直连,要么通过虚链路逻辑连接。为什么必须这样?因为OSPF的设计原则是,区域间路由必须经过骨干区域转发,不允许非骨干区域之间直接交换路由,否则会产生环路风险。
你可以把Area 0理解成公司总部,其他区域是各个事业部。事业部之间的往来,必须通过总部审批盖章,不能私下拉一条专线绕过总部。一旦允许区域1和区域2直接交换路由,SPF算法计算出来的树形结构就被破坏了,可能出现环路。这个规则不是随便定的,是整个OSPF无环特性的基石。
所以你在规划网络时,核心层设备一定要放在Area 0里,接入层再按业务或地理位置拆成Area 1、Area 2等。要是把核心层拆到非骨干区域,后面排障会痛不欲生。
3.2 DR/BDR选举与接口网络类型
广播多路访问网络,比如一台交换机下面挂着十几台路由器,如果每两台路由器之间都建立Full邻接关系,那就是n乘n减1除以2个邻接,LSDB同步的报文交互量会非常恐怖。DR/BDR机制就是为了解决这个问题。
在这种网络上,OSPF会选出一台DR(指定路由器)和一台BDR(备份指定路由器),其他路由器只和DR、BDR建立Full邻接关系,DRother之间停留在2-Way状态。所有LSA的同步都经过DR中转,网络上的协议交互量从“网格状”降成“星形”。
选举规则很简单:接口优先级(ospf dr-priority)越大越优先,默认是1,0表示不参与选举;优先级相同就比Router-ID,大的胜出。有一个细节坑过很多人:DR/BDR选举是非抢占的。也就是说,就算你新加了一台优先级更高的路由器,只要当前的DR和BDR还活着,它也不会抢位置,只能当DRother,直到DR或BDR失效。
这个机制在排障时特别容易造成误解。比如你明明看到两台路由器之间状态是2-Way,以为故障了,其实人家两个都是DRother,2-Way才是正常状态。
如果链路是点对点的,比如两台路由器直接用串口或光纤直连,就没有必要选举DR/BDR。可以把接口网络类型改成p2p:
interface GigabitEthernet0/0/0 ospf network-type p2p改成p2p后,邻居建立少了一个选举阶段,收敛速度更快,排障也简单。这是设备互联端口上非常推荐的做法。
3.3 ABR:不仅仅是“跨区域转发”
ABR(Area Border Router),区域边界路由器,是同时连接Area 0和一个或多个非骨干区域的路由器。这是OSPF中最关键的角色之一。
ABR的职责有两个层面。第一个层面是区域间路由的桥接。它会把本区域内的路由转换成3类LSA(Summary LSA),通告到其他区域,同时从其他区域接收3类LSA再转给本区域。R2这种设备就是典型ABR,它在Area 0和Area 1之间搭了一座桥。
第二个层面是路由汇总与故障隔离。ABR可以在区域边界做路由汇总,把区域内一堆明细网段聚合成一条或少数几条路由通告出去,大幅缩小骨干区域的LSDB和路由表。同时,一个区域内的拓扑震荡被ABR挡在区域边界,不会波及整个OSPF域。
这也是为什么ABR的配置要格外谨慎。如果ABR挂了,它所连接的非骨干区域与骨干区域的联系就断了,整个区域的路由都会异常。生产环境中,ABR一定要做冗余设计,不能把所有区域都挂在一台ABR上。
4. 手把手搭一套可复现的OSPF实验
4.1 两台路由器的单区域实验:从零敲到邻居Full
用模拟器或者两台真机都能搭。我习惯用三台路由器,但先从两台开始最直观:R1的GigabitEthernet0/0/0连R2的GigabitEthernet0/0/0,各自再配一个Loopback口。
R1的配置:
system-view sysname R1 interface GigabitEthernet0/0/0 ip address 10.0.12.1 255.255.255.0 undo shutdown interface LoopBack0 ip address 1.1.1.1 255.255.255.255 ospf 1 router-id 1.1.1.1 area 0 network 10.0.12.0 0.0.0.255 network 1.1.1.1 0.0.0.0注意华为宣告网段用的是反掩码,不是子网掩码。10.0.12.0 0.0.0.255表示匹配10.0.12.0/24这个网段,1.1.1.1 0.0.0.0表示精确匹配这个主机地址。很多人第一次配OSPF就在这里翻车,把反掩码写成255.255.255.0,结果宣告失败。
R2配置同理,Router-ID用2.2.2.2,地址和网段对应:
system-view sysname R2 interface GigabitEthernet0/0/0 ip address 10.0.12.2 255.255.255.0 undo shutdown interface LoopBack0 ip address 2.2.2.2 255.255.255.255 ospf 1 router-id 2.2.2.2 area 0 network 10.0.12.0 0.0.0.255 network 2.2.2.2 0.0.0.0配置完之后,在R1上执行 display ospf peer,正常情况下你会看到:
<R1> display ospf peer OSPF Process 1 with Router ID 1.1.1.1 Neighbor Brief Information Area 0.0.0.0 Interface NeighborAddr State DeadTime Interface Instance ID GE0/0/0 10.0.12.2 Full/DR 00:00:39 0State字段变成Full,说明邻居建立成功,LSDB同步完成。这时再用 display ospf routing 看路由表,R1应该能学到2.2.2.2/32。
如果状态卡住不动,就回头看第2章的状态机,按阶段定位问题。这一步实验是整个OSPF学习的地基,建议反复做,做到不看笔记也能敲出来。
4.2 扩展到多区域:亲手建一个ABR
实验拓扑把R3加进来:R1的GE0/0/0连R2的GE0/0/0,R2的GE0/0/1连R3的GE0/0/0。R1和R2之间放Area 0,R2和R3之间放Area 1,R2自然成为ABR。
R2的配置改成:
system-view sysname R2 interface GigabitEthernet0/0/0 ip address 10.0.12.2 255.255.255.0 undo shutdown interface GigabitEthernet0/0/1 ip address 10.0.23.2 255.255.255.0 undo shutdown interface LoopBack0 ip address 2.2.2.2 255.255.255.255 ospf 1 router-id 2.2.2.2 area 0 network 10.0.12.0 0.0.0.255 network 2.2.2.2 0.0.0.0 area 1 network 10.0.23.0 0.0.0.255R3配置:
system-view sysname R3 interface GigabitEthernet0/0/0 ip address 10.0.23.3 255.255.255.0 undo shutdown interface LoopBack0 ip address 3.3.3.3 255.255.255.255 ospf 1 router-id 3.3.3.3 area 1 network 10.0.23.0 0.0.0.255 network 3.3.3.3 0.0.0.0配置完成后,在R1上执行 display ospf lsdb,你会看到多出一类type为Sum-Net的LSA,这就是R2作为ABR为Area 1的路由生成的3类LSA。R1就是靠它学到3.3.3.3/32的。
再试一个汇总操作。假设R3下面还挂了10.0.30.0/24和10.0.31.0/24两个业务网段,你不希望在骨干区域里通告两条明细路由,可以在R2的Area 1视图下做汇总:
ospf 1 area 1 summary-network 10.0.30.0 255.255.254.0这样Area 0里看到的就只剩一条10.0.30.0/23的汇总路由。这就是ABR在生产环境中最实际的价值。
4.3 接口网络类型、定时器、被动接口与cost的现场微调
这个实验做完后,我强烈建议你再折腾几个细节,它们会覆盖掉生产环境里八成以上的OSPF疑难杂症。
接口网络类型。以太网接口默认网络类型是broadcast,会触发DR/BDR选举。如果你把互联接口改成p2p:
interface GigabitEthernet0/0/0 ospf network-type p2p邻居建立过程会省略DR选举,直接进入ExStart,状态变化更快。同时,两台直连设备之间不再有DRother的概念,排障看到的状态更干净。
定时器。广播网络上Hello默认10秒,Dead默认40秒,Dead是Hello的4倍。如果两端不一致,邻居绝对建立不起来。修改方式很直接:
interface GigabitEthernet0/0/0 ospf timer hello 5注意dead interval会自动变成20。生产环境不建议把hello调得太小,比如1秒或2秒,因为OSPF报文处理会占用设备CPU,网络抖动时还可能造成邻居频繁抖动。默认值已经很成熟,真的想加速收敛,先优化SPF计算和LSA泛洪,别动Hello。
被动接口。华为命令叫silent-interface。在OSPF进程下配置:
ospf 1 silent-interface GigabitEthernet0/0/1这个接口不再收发Hello,也不建立邻居,但它所在的网段仍然会作为直连路由被通告进OSPF。非常适合连接PC终端或服务器的接口,既不浪费协议报文,又保证了路由可达。
cost调整。OSPF的cost计算默认是 reference-bandwidth除以接口带宽,华为默认参考带宽是100Mbps,所以GE接口cost是1,百兆接口cost也是1,串口这种低速链路cost反而高。实际组网时经常要手工干预,接口下直接指定:
interface GigabitEthernet0/0/0 ospf cost 100如果整个网络都是高速链路,建议统一调大参考带宽,比如在进程视图下执行 bandwidth-reference 10000,把参考带宽改成10Gbps,这样各接口的cost区分度才够。记住:参考带宽必须全网一致,不然不同设备算出来的选路结果会打架。
5. 排错实录:从错误表到debug,把OSPF问题翻个底朝天
5.1 第一步永远先看邻居状态:从状态机锁定故障相位
OSPF排障真没有那么玄学。我处理过的故障里,九成以上都能通过“先看邻居状态”这一步找到方向。
具体操作是,先执行 display ospf peer brief 看全局邻居概览。它会用几行把每台设备的邻居、所在区域、接口和状态列出来。如果某个邻居状态不是Full,问题就来了。
再执行 display ospf peer verbose 看详细邻居信息,里面有关键的Dead Time、接口网络类型、DR/BDR角色等。结合第2章的状态机,判断当前卡在哪个阶段:
- 状态是Down,说明完全没收到Hello,查物理链路、接口OSPF宣告、ACL。
- 状态是Init,说明单向通信,重点查ARP、组播放行和掩码。
- 状态是2-Way,先确认是不是DRother之间的正常状态,再判断是否该继续推进。
- 状态是ExStart或Exchange,几乎可以锁定MTU或DD报文交互问题。
- 状态是Loading,查LSA泛洪是否被阻断,比如区域边界认证失败。
这一步花不了30秒,但能把排障范围从“整个网络”缩小到“某个阶段、某台设备、某个参数”。
5.2 display ospf error 错误表:答案就写在计数器里
很多兄弟一遇到OSPF故障就抓包,其实在绝大多数场景下根本没必要。设备内部早就在统计错误了,只是你没去看。热词里那句“ospf error表里面查问题老清晰了”,真不是夸张。
执行:
<R1> display ospf error你会看到类似这样的输出:
OSPF Process 1 with Router ID 1.1.1.1 Error Statistics ---------------------------- Router ID collision : 3 Bad area ID : 0 Bad packet : 0 Bad checksum : 1 Bad version : 0 Bad authentication : 2不同版本字段会有差异,但逻辑是一样的。这里每一行都是一个错误计数器,只要数值在增长,就说明设备正在收到不正常的OSPF报文。
Router ID collision计数器增长,基本可以断定网络里有路由器Router-ID重复,马上去查所有设备的router-id配置。
Bad area ID增长,说明收到的Hello报文里区域号和自己不一致,两端不在同一个区域,邻居自然起不来。
Bad authentication增长,说明认证类型或密钥不匹配。先查区域认证、接口认证是否两端一致,再查密码字符串。
Bad checksum增长,说明报文在链路传输中损坏,常见于CRC错误或者物理链路质量差,比如光模块收光异常、网线接触不良。
Bad packet增长的场景比较多,可能是报文格式问题,也可能是MTU导致的报文异常,但结合其他计数值一起看,基本能锁定方向。
这套错误表你但凡认真用一次,就会彻底抛弃“一上来就抓包”的习惯。计数器直接告诉你协议栈在拒绝什么报文,比抓包看一堆十六进制再分析快得多。
5.3 debug ospf packet:什么时候该上、怎么正确用
错误表指向不够明确、或者计数器在增长但不知道具体是哪个参数不对时,才轮到debug上场。
华为设备上执行:
<R1> terminal monitor <R1> terminal logging <R1> debug ospf packet记得先打开terminal monitor,否则debug输出可能看不到。执行期间设备会实时打印收发OSPF报文的内容,里面能看到关键字段,比如Hello报文里的Mask、Dead Interval、Router-ID、Area ID、Options字段。
最典型的一个场景:两端都配了OSPF,接口状态也up,但邻居就是卡在Init。错误表里没看到明显计数,这时用debug打印收到的Hello报文,一眼就能看出对端发过来的Mask是不是255.255.255.0,Dead Interval是不是和自己一致。
debug输出可能非常密集,特别是邻居多、Hello间隔短的时候,瞬时打印量能把控制台刷屏刷到卡顿。所以生产环境慎用,最好在维护窗口操作,并且看几个报文后立刻执行:
<R1> undo debug all我的经验是,debug不要一条条去看LSA内容,而是聚焦在Hello报文的关键参数上。排奥斯PF邻居问题,90%的答案都藏在Hello报文里。真需要深挖LSA交互细节时再考虑抓包,日常排障根本用不上。
5.4 OSPF高频故障速查表
我把这些年遇到的高频OSPF故障整理成了一张速查表,适合贴在工位上。它不能解决所有问题,但能覆盖掉日常七八成的排障需求。
| 现象 | 可能原因 | 排查方向 | 参考处理 |
|---|---|---|---|
| 邻居卡在Down | 接口未宣告、链路故障 | display ospf interface 看接口状态 | 确认接口undo shutdown、正确宣告网段 |
| 邻居卡在Init | 单向通信、ACL过滤组播 | 查ARP、ping对端接口IP | 放行224.0.0.5组播,检查掩码 |
| 邻居卡在ExStart | MTU不匹配、DD交互异常 | 对比两端接口MTU | 统一MTU,或开启ospf mtu-enable |
| 邻居反复up/down | Router-ID冲突、链路抖动 | display ospf error 看计数器 | 修正Router-ID并reset ospf process |
| 区域间路由缺失 | ABR没连上Area 0 | display ospf lsdb 看3类LSA | 重新规划区域拓扑 |
| 认证一直失败 | 认证类型或密钥不一致 | 错误表里看Bad authentication | 统一认证模式和MD5密钥 |
| 掩码不一致导致邻居异常 | 两端接口掩码不同 | debug看Hello里的Mask | 统一子网掩码 |
这张表的价值在于把“现象”和“手段”直接挂上钩。遇到问题先翻表,再决定用哪条命令,比临时搜文档高效得多。
6. 生产环境里的OSPF经验:那些常被忽视的细节
6.1 认识LSA:路由条目背后的“情报单位”
很多人在配置OSPF时只看路由表通不通,不看LSA类型,一旦遇到跨区域路由不通就懵。实际上,不同区域、不同位置产生的路由,依赖的LSA类型完全不同。
| LSA类型 | 名称 | 产生者 | 传播范围 |
|---|---|---|---|
| 1类 | Router LSA | 每台路由器 | 所在区域内部 |
| 2类 | Network LSA | DR | 所在区域内部 |
| 3类 | Summary LSA | ABR | 整个OSPF域 |
| 4类 | ASBR Summary LSA | ABR | 整个OSPF域 |
| 5类 | AS External LSA | ASBR | 整个OSPF域,特殊区域除外 |
| 7类 | NSSA External LSA | NSSA区域内的ASBR | NSSA区域内部 |
看懂这张表,排障就多了一双眼睛。比如你在Area 1的设备上看到一条来自外部路由协议的路由,它是5类LSA;而这条路由又要经过ABR转换,你就能判断出ASBR在哪、ABR是否正常工作。
6.2 Stub与NSSA:特殊区域怎么选
网络规模大了之后,区域内的路由器不需要知道所有外部路由细节,可以用特殊区域减少LSDB和路由表。
Stub区域(末梢区域)不允许4类、5类LSA进入,区域内的路由器只会看到1类、2类和3类LSA,ABR会自动向区域下发一条默认路由。配置很简单:
ospf 1 area 1 stub注意,Stub区域里的所有路由器都要配stub,不能只在ABR上配。而且Stub区域不允许存在ASBR,因为外部路由的5类LSA进不来。
NSSA区域稍微灵活一点,它允许区域内部存在ASBR,可以通过7类LSA通告外部路由,ABR再把7类转成5类发给其他区域。配置:
ospf 1 area 1 nssa区域内部的每条OSPF设计决策都有代价。Stub省了路由表,但区域内没法做外部路由的精细选路;NSSA虽然保留了外部路由能力,但转换过程增加了一些复杂度。所以我的建议是:普通接入区域用Stub,有特殊外部路由需求的再用NSSA,别一上来全给配成NSSA。
6.3 认证与默认路由:安全性和出口路由的落地配置
OSPF区域认证和接口认证是生产网络里被忽略得最多的配置,但恰恰是它最有用。防止非法设备接入OSPF域之后,靠伪造LSA把整个网络的路由表搅乱。区域认证在进程下配置一次,区域内所有接口生效:
ospf 1 area 0 authentication-mode md5 1 cipher huawei也可以只在特定接口上配置接口认证:
interface GigabitEthernet0/0/0 ospf authentication-mode md5 1 cipher huawei注意两端必须使用相同的认证模式和密钥。至于用哪种,现网建议用MD5起步,追求更高安全性可以用HMAC-SHA256。认证一旦开启,区域内所有路由器必须同步配置,否则邻居立刻中断。
默认路由的发布也是一个高频需求。比如OSPF域需要把缺省流量引到出口路由器上,就在出口路由器上配置:
ospf 1 default-route-advertise如果本地没有生成默认路由,需要加always参数强制通告:
ospf 1 default-route-advertise always这个命令会向整个OSPF域注入一条默认路由,慎用。一旦配错,全网流量可能全被引到一台本不该承担出口流量的设备上。
6.4 给生产环境的几条设计建议
最后提几条我在生产网络里踩过坑之后总结下来的设计建议。
核心设备尽量放在Area 0。接入层按业务或地域拆区域,不要把核心设备拆到非骨干区域。
每个区域的路由器数量控制在合理范围。单个区域内设备过多,LSDB同步压力和SPF计算量都会上来,建议一个区域的设备数量控制在几十台以内,再大就要考虑更细的拆分。
ABR做冗余。不要让某个区域的ABR只有一台,否则这台设备一挂,整个区域就失联了。两个ABR各拉一条链路到Area 0,是低成本高收益的做法。
链路聚合和OSPF的cost要配合好。做了Eth-Trunk之后,接口带宽是聚合后的总带宽,cost会按聚合带宽计算,这一点容易被忽略,导致选路不符合预期。
变更前先做路由快照。改OSPF参数前,先保存 display ospf routing 和 display ospf peer 的输出。出问题时,对比快照和现场,往往比抓包分析快得多。
最后分享一个我自己坚持了很久的习惯。日常OSPF排障,我第一件事永远是打 display ospf error 和 display ospf peer brief,而不是抓包。错误表里的计数器是设备自己总结好的“诊断意见”,大部分邻居建立失败的问题,根源都写在几个关键计数里。这些年处理过的OSPF故障,有Router-ID冲突的,有区域ID写错的,有MTU不匹配的,有认证不统一的,几乎没有一个需要靠抓包才能定位。先把这两条命令用熟,再谈抓包,你的OSPF排障效率会快上一个台阶。