
做网络这行的人大概都有过这样的时刻一开始整个环境就一个 OSPF 区域二十来台设备跑得好好的配置也简单network一通宣告完事。等到设备数量上去、接入层开始频繁抖动、某台接入交换机一天重启三回你就会发现核心设备的 CPU 和 LSDB 开始不淡定了——一台边缘设备接口翻动全网所有设备都要重算一遍 SPF。这时候才会想到要拆 OSPF 多区域。这篇内容讲的就是在 H3C 设备上把单区域 OSPF 改造成多区域的具体做法从区域规划的硬性约束、区域类型怎么挑、汇总和外部路由怎么引到邻居起不来的时候怎么一步步查。适合已经能独立配通单区域 OSPF、准备把网络做分层改造的运维和网络工程师看也适合在备考或者做实验环境练习的人拿来对着敲命令。我不打算复述手册里那些参数表重点写手册上不会告诉你、但真上手一定会撞上的东西。1. 单区域 OSPF 撑不住的几个信号以及多区域到底封住了什么1.1 一台边缘设备抖一下背后的代价比你想的大单区域 OSPF 最典型的症状不是不通而是通但时不时卡一下。我见过一个场景某办公区接入层十几台小交换机全部塞进区域 0其中一台下挂的终端网卡有问题接口反复 up/down。每次状态变化这台交换机都要产生一条新的 Type-1 LSA泛洪到全区域。所有运行 OSPF 的设备收到后都要把这条 LSA 塞进 LSDB然后重新跑一遍 SPF 计算。二十台设备跑一遍 SPF 可能也就几毫秒但如果这个口一分钟翻十次那就是十轮全量重算核心设备的 CPU 曲线会画出规律的尖峰。更麻烦的是这种抖动带来的路由震荡会沿着链路传导某些对时延敏感的语音或者视频流就会出现断续。多区域解决的第一个问题就是这个把不稳定的部分关进小笼子里。接入层放进区域 1接入层的链路抖动产生的 Type-1 LSA 只在区域 1 内泛洪区域 1 的 ABR 只会在必要的时候、用汇总后的 Type-3 LSA 通知区域 0。区域 0 里的核心设备完全感知不到那台小交换机在抽风SPF 也不用重算。这就是多区域最本质的价值——不是配置看起来更规范而是缩小故障域和计算域。1.2 LSDB 规模和 SPF 开销是两笔账很多人把多区域的好处只理解成LSDB 变小其实账要分两笔算。LSDB 变小确实直观单区域下每台设备的 LSDB 里都有全网所有路由器的 Type-1、所有广播网的 Type-2加上外部的 Type-5。拆成多区域后非骨干区域的普通设备 LSDB 里只剩本区域的 Type-1/2加 ABR 注入的 Type-3。这是一个存储和内存的问题。另一笔账是 SPF 计算的频率和范围。OSPF 的 SPF 是按区域算的一个区域内的拓扑变化只触发本区域的 SPF。区域 0 的拓扑变化确实会影响所有区域因为 Type-3 要重算但反过来区域 1 内部的变化对区域 2 来说是不可见的。如果你的网络里 80% 的不稳定因素来自接入层把接入层划出区域 0 之后区域 0 的 SPF 触发频率可能下降一个数量级。1.3 泛洪范围收窄之后收敛反而更好做还有个容易被忽视的点LSA 泛洪是需要带宽和 CPU 的。单区域里一条 Type-5 外部路由比如一台边界设备引入了一条明细要泛洪给所有设备每台都要判断自己是不是 ASBR、要不要重算外部路由。拆成多区域、再用stub或nssa把不需要外部路由的区域挡掉之后那些区域的设备连 Type-5 都收不到自然也不用为外部路由的频繁变化买单。这在引入路由变化比较频繁的出口环境里效果特别明显。2. 划分之前必须先嚼碎的三个硬约束2.1 区域 0 不是摆设它是所有区域间路由的中转站OSPF 的区域间路由有一条铁律非骨干区域之间不能直接交换 Type-3 LSA。换句话说区域 1 的路由要去区域 2路径必须是区域 1 → ABR → 区域 0 → ABR → 区域 2中间得在区域 0 里走一趟。这条规则刚接触时会觉得多余实际是为了防止区域间出现环路——因为 Type-3 LSA 携带的是我到某个网段的距离如果允许区域间任意互传距离向量式的传播就可能绕圈。落地时的具体约束就是一台 ABR 如果要同时连接区域 1 和区域 2它必须至少有一个接口留在区域 0。如果一台设备只连了区域 1 和区域 2、没有区域 0 的接口那它就不是 ABR两个区域的路由在它这里根本不会互相导入。我在排查中遇到过好几次两个区域都配了、路由就是不通的情况最后发现是这台中间的设备接口全划进非骨干区域了区域 0 是空的。2.2 ABR 的两个身份和三张表ABR区域边界路由器在 OSPF 里是个特殊角色它至少连接两个区域且其中一个必须是区域 0。它的关键动作有三个把区域 1 内的 Type-1/2 拓扑转换成 Type-3 摘要注入区域 0把区域 0 的 Type-3重新注入区域 1如果它自己还是 ASBR引入了外部路由它还要为其他区域生成 Type-4告诉人家ASBR 在这里。所以 ABR 上同时存在三套东西多个区域的 LSDB、一张区域间路由表、一张本地计算出的路由表。查 ABR 的问题时display ospf lsdb要配合区域参数一起看display ospf routing看的是它最终选出来的路由两者对不上往往就是汇总或者区域类型配错了。2.3 区域编号的两种写法与命令行上的习惯OSPF 的区域 ID 可以写成十进制整数1也可以写成点分十进制0.0.0.1设备内部把它当作 32 位无符号数处理所以area 1和area 0.0.0.1是同一个区域。区域 0 同理area 0和area 0.0.0.0等价。我的习惯是统一用十进制原因是敲起来短、看配置文件时不容易和 IP 地址混淆。但如果你的区域划分是按地理或者按楼层映射的用点分十进制会更有语义比如area 0.0.10.1对应 10.1 网段的那个片区。关键是整个网络里保持同一种写法避免有人写area 1有人写area 0.0.0.1虽然设备认但看配置的人容易误判成两个区域。3. 在 H3C 设备上把区域真正切出来的完整动作3.1 开局三件事router-id、参考带宽、区域划分表动手敲命令之前先把三样东西定下来能省掉后面一大半返工。第一是 router-id。H3C 设备如果没手动指定会用 Loopback 接口地址最大的那个作为 router-id没有 Loopback 就用物理接口里地址最大的。这个自动选择在设备重启、接口地址调整后可能变化一旦变化这个设备产生的所有 LSA 都要重新生成邻居关系也要重建。所以生产环境一定要手动指定通常用 Loopback0 的地址比如router-id 10.0.0.1而且每台设备的 router-id 必须全网唯一。第二是参考带宽。H3C 默认的bandwidth-reference是 100单位 Mbps开销计算公式是参考值 ÷ 接口带宽小于 1 的取 1。这意味着千兆口算出来 0.1 取整成 1万兆口算出来 0.01 也取整成 1最后千兆和万兆的开销一模一样选路完全看不出差异。现在千兆起步、万兆普及的环境里这个默认值必须改。我一般改成bandwidth-reference 100000100G这样千兆口开销 100、万兆口开销 10层次就出来了system-view ospf 1 router-id 10.0.0.1 bandwidth-reference 100000这里有个细节bandwidth-reference改了之后已经建立的邻居和已计算的路由不会立刻按新开销重算因为开销是随接口的 LSA 一起泛洪出去的。改完要触发一次重新计算稳妥的做法是在业务窗口内把所有设备的参考值一次改齐然后逐台reset ospf process这个命令会断邻居慎用或者干脆规划阶段就定好别等上线后再动。第三是区域划分表。哪几台设备做 ABR、每个区域包含哪些网段、区域类型是什么、要不要汇总这些在一张纸上写清楚。OSPF 多区域最怕边配边想。3.2 宣告网段的两种方式用哪种取决于你的排错习惯H3C 上把接口纳入 OSPF 有两条路。第一条是进入 OSPF 区域视图用network命令宣告网段ospf 1 area 0 network 10.0.0.0 0.0.0.255 network 10.1.1.0 0.0.0.3 quit area 1 network 192.168.10.0 0.0.0.255注意这里的掩码是反掩码wildcard mask跟 ACL 的写法一致。0.0.0.255对应 24 位掩码0.0.0.3对应 30 位掩码。这里最容易犯的错是把正掩码写进去比如写成network 10.0.0.0 255.255.255.0设备不报错但匹配结果完全不对——它会按反掩码解释成前 8 位固定、后 24 位任意结果可能把一堆不该进来的接口卷进去或者一个都没匹配上。判断标准很简单配完立刻display ospf interface看一眼该在里面的是不是都在。第二条是在接口视图下直接挂区域interface GigabitEthernet1/0/1 port link-mode route ip address 10.1.1.1 255.255.255.252 ospf 1 area 0我个人更倾向第二种原因有两个。一是所见即所得接口属于哪个区域一眼就能看出来不用在 OSPF 视图和接口视图之间来回对照。二是不会因为反掩码写错而悄悄漏掉接口。缺点是大批量接口时敲得比较啰嗦而且如果接口地址变了区域归属不会自动跟着变——不过这一点两种方式都一样。提示两种方式不要混用。一旦用network宣告了某个网段又在接口下挂ospf area排查时的判断依据会变得很混乱。3.3 silent-interface 和 Loopback 的组合用法多区域环境里有一个非常实用的命令silent-interface。它让某个接口的网段照样被宣告进 OSPF、照样产生路由但接口上不发也不收 OSPF 报文。这个命令的典型场景是连接终端的接口和 Loopback 接口。比如你有一台三层交换机下挂一堆 PC 的 VLAN 接口这些接口根本不需要跑 OSPF但它们的网段需要让其他设备学到。用silent-interface处理既宣告了网段又避免了在这些接口上无谓地发 Hello 报文——更重要的是避免有人在这类接口上接个什么设备意外建立起邻居关系。ospf 1 silent-interface Vlan-interface 10 silent-interface Vlan-interface 20 silent-interface LoopBack 0Loopback 一定要静默因为它是个环回口本身不接任何东西发 Hello 是纯浪费。而且 Loopback 有个额外好处只要设备活着这个接口就永远是 up 的用它做 router-id 和宣告管理网段最稳定。我习惯每台设备都配一个 Loopback0地址规划成统一的10.0.0.x/32静默宣告进区域 0。4. 区域类型怎么挑stub、stub no-summary、NSSA 的取舍4.1 stub 区域挡掉的是 4 类和 5 类不是所有外部信息stub 区域的设计意图很直白这个区域里的设备不需要知道外部路由的明细只需要一条默认路由指向 ABR 就够了。配置上ospf 1 area 2 stub配完之后ABR 会做两件事一是不再把 Type-4 和 Type-5 注入这个区域二是自动产生一条 Type-3 的默认路由0.0.0.0/0注入进去。注意这个默认路由是 ABR 自动生成的不需要你手动配default-route-advertise这是 stub 区域的固有行为。这里有个坑stub 区域内的所有设备都要配stub漏掉一台就建不起邻居。原因在 Hello 报文的 Option 字段里stub 区域的路由器会在 Hello 里打上 E-bit 置 0 的标记两端不匹配就停在 Init 或者直接不建立。查这个问题时display ospf peer会显示邻居状态异常但不会直接告诉你区域类型不匹配得靠display ospf interface看两边区域的 stub 标记。另外一条硬性限制stub 区域里不能有 ASBR。因为 stub 的语义就是我不收外部路由你在里面再引入外部路由就自相矛盾了。所以如果这个区域里有设备需要import-route那就只能用 NSSA。stub no-summary更进一步连 Type-3 的区域间明细也不收了只保留一条默认路由。这种配置一般用在只有终端、没有任何跨区域访问需求的末梢区域比如一个独立的办公楼层所有流量都往上走没有任何需要按目的网段精细选路的场景。好处是这类设备的 LSDB 里只剩本区域的 Type-1/2 和一条默认路由资源占用压到最低。缺点是万一以后这个区域里新增了一台服务器需要被别的区域访问就得回头改配置。4.2 NSSA既要挡住外部路由又要往里引外部路由NSSA 解决的是 stub 解决不了的矛盾这个区域需要引入外部路由比如接了条专线、挂了个出口但又不希望接收其他区域泛洪过来的大量 Type-5。ospf 1 area 3 nssaNSSA 的行为是阻断 Type-4 和 Type-5 进入但允许区域内的 ASBR 产生Type-7 LSANSSA 专属的外部路由类型。Type-7 只在本区域泛洪到了 NSSA 的 ABR 那里由 ABR 负责把它转换成 Type-5 再发到其他区域去。这里有个默认行为的坑NSSA 的 ABR 默认不会往区域里注入默认路由这和 stub 不一样。如果你希望 NSSA 内的设备能通过默认路由访问外部需要在 ABR 上显式配ospf 1 area 3 nssa default-route-advertise还有nssa no-summary效果是连 Type-3 明细也挡掉只发一条默认路由同时保留 Type-7 的能力。这个在末梢 需要引入少量外部路由的场景里比较合适。几种区域类型的对比我整理成一张表配的时候对着看区域类型阻断的 LSA允许的 LSA默认路由来源是否允许 ASBR普通区域无1/2/3/4/5需手动default-route-advertise允许stub4、51/2/3ABR 自动注入 Type-3 默认不允许stub no-summary3、4、51/2ABR 自动注入 Type-3 默认不允许NSSA4、51/2/3/7需配nssa default-route-advertise允许NSSA no-summary3、4、51/2/7需配nssa default-route-advertise允许选型上的经验判断如果这个区域的设备只有一条出口往上走、也没有引入外部路由的需求直接stub如果区域内确实要引入外部路由用nssa如果区域里全是终端设备连跨区域精细选路都不需要再考虑no-summary那两档。别一上来就上no-summary把路走窄了后面改起来麻烦。5. 汇总和外部引入多区域配置里最容易埋雷的两块5.1 abr-summary 挡的是明细不是路由本身区域间汇总的目的是把区域内的多条明细网段合并成一条 Type-3 发出去减少区域 0 和其他区域的路由表规模。命令在 ABR 的源区域视图下配ospf 1 area 1 abr-summary 192.168.0.0 255.255.0.0这里用的是正掩码跟network的反掩码相反这是很多人第一次配会写错的地方。配这条命令的前提是ABR 在区域 1 内确实有 192.168.0.0/16 覆盖范围内的明细路由。如果明细不存在汇总不会生成。而且汇总只影响 ABR 向外发出的 Type-3不影响区域 1 内部的路由区域 1 里的设备照样看到明细——这点经常被误解成汇总之后区域 1 里也变一条了。还有一个隐蔽的问题汇总之后如果区域 1 内某条明细网段断了只要还有其他明细存活这条汇总路由就不会撤销发往那个断掉的网段流量会打到 ABR 上然后被丢弃因为 ABR 上那条明细已经没了。如果这条汇总配了not-advertise情况反过来——汇总网段整个被抑制。这个行为在规划汇总范围的时候要考虑清楚别把汇总范围划得比实际网段大太多否则会引入一块黑洞地址。5.2 asbr-summary 和 import-route 的连招顺序外部路由的汇总要用asbr-summary位置在OSPF 视图下不是区域视图ospf 1 import-route direct type 1 asbr-summary 172.16.0.0 255.255.0.0asbr-summary只对本机引入的Type-5/Type-7 路由生效对从别的 ASBR 学来的外部路由不管用。所以它通常紧跟在import-route后面配。import-route后面有几个参数值得说。type 1和type 2决定外部路由的开销计算方式Type-1 是外部开销 到 ASBR 的内部开销随内部路径变化Type-2 是只看外部开销内部开销不计入比较。默认是 Type-2。多条外部路径并存的时候Type-1 更能反映真实远近我在多出口环境里一般用 Type-1只有单一出口的时候用默认的 Type-2 就行省事。另外import-route direct这条命令要特别小心。它会把本机所有直连网段都引入成外部路由包括管理口、互联口甚至你不想暴露的网段。稳妥的做法是用route-policy过滤route-policy EXPORT permit node 10 if-match ip address prefix-list SERVER_NETS quit ospf 1 import-route direct route-policy EXPORT这样只有匹配前缀列表的网段才会被引入。别嫌麻烦一次性把策略写对比后面从路由表里一条条往回删省事得多。5.3 虚连接不连续骨干区域的缝合线以及它的代价现实网络里经常遇到一种情况某个区域因为历史原因没有直连区域 0或者区域 0 被割裂成了两块。OSPF 的解法是虚连接Virtual Link在两台 ABR 之间、穿过一个传输区域建立一条逻辑链路ospf 1 area 1 vlink-peer 10.0.0.2在另一端对应的 ABR 上也要配vlink-peer 10.0.0.1两边的 router-id 互指。配完之后两台设备之间会出现一条逻辑上的区域 0 链路display ospf peer里能看到邻居状态是 Full。虚连接有三条限制必须记住第一传输区域必须是普通区域不能是 stub 或 NSSA因为虚连接的报文要在里面正常泛洪stub 区域会挡掉必要的 LSA第二虚连接是依赖底层路由的也就是说传输区域里两台设备之间必须有可达路由否则虚连接起不来这就是个先有鸡还是先有蛋的问题规划时要先确认传输区域内的路由是通的第三虚连接会增加复杂度能靠调整物理连接或者区域划分解决的就别用虚连接。我见过一个案例两台 ABR 之间隔了一个 stub 区域非要配虚连接结果邻居一直卡在Init查了半天才发现是区域类型不匹配。这种问题在文档里写得清楚但真到现场容易忽略因为你脑子里想的是这两台设备之间的物理链路是通的啊。6. 邻居起不来、路由算不对按这个链路往下查6.1 display 命令的查看顺序比命令本身更重要排查 OSPF 问题最怕一上来就display ospf routing看路由表因为路由表是结果不是原因。我固定的查看顺序是这样的第一步display ospf brief看进程状态、router-id、区域数量、SPF 调度次数。这里能快速判断 OSPF 进程本身是不是正常、router-id 有没有冲突。第二步display ospf interface看每个接口属于哪个区域、网络类型是什么、cost 是多少、DR/BDR 是谁、Hello 和 Dead 定时器数值。绝大多数邻居起不来的问题在这一步就能定位到——要么接口根本没进 OSPF要么两边区域号不一致要么定时器不匹配。第三步display ospf peer看邻居状态。加上verbose参数能看到更多协商细节包括邻居的 router-id、DR/BDR 选举结果、DD 报文交互情况。第四步display ospf lsdb分区域看。display ospf lsdb router、display ospf lsdb summary、display ospf lsdb ase分别看 Type-1、Type-3、Type-5。注意 Type-3 要在对应区域下看因为同一个网段的 Type-3 在不同区域里内容不一样。第五步才轮到display ospf routing和display ip routing-table对比 OSPF 算出来的路由和实际进表的路由差异往往说明有更优的静态路由或者路由策略在干扰。6.2 卡在 Init、Two-way、ExStart 分别说明什么邻居状态机停在不同阶段指向的原因完全不同这张表可以直接当排查索引邻居状态常见原因排查动作Down接口未启用 OSPF、网段未宣告、接口 downdisplay ospf interface确认接口存在Init单向收到 Hello对端没收到我的检查单向链路、ACL 是否挡了组播 224.0.0.5Two-way双向通信正常但 DR 选举还没完成或双方都是 DROther等待 40 秒 wait timer检查 dr-priorityExStartMTU 不一致、router-id 冲突检查两端接口 MTUdisplay ospf brief看 router-idExchange/Loading报文丢失、链路质量差查接口错包、重传计数Full正常无需处理Two-way这个状态特别容易被误判成故障。在广播网络里非 DR/BDR 的路由器之间本来就是 Two-way 状态这是正常的——它们之间不需要交换完整的 LSA。判断标准是只要每台设备都和 DR、BDR 建立了 Full就是正常的。如果你看到某台设备和 DR 之间也是 Two-way那才是问题。ExStart卡住最常见的原因是 MTU 不一致。H3C 设备的接口默认不检查 DD 报文里的 MTU 字段但如果有人开了ospf mtu-enable或者两端设备来自不同厂商、默认行为不同就会出现一方认为 MTU 不匹配、拒绝进入 Exchange 的情况。处理方式是统一两端 MTU或者在接口下undo ospf mtu-enable关掉检查。我个人倾向统一 MTU关检查只是掩盖问题真到大包传输的时候还是会炸。6.3 汇总不生效和 cost 一样的两个隐蔽坑第一个坑abr-summary配了但display ospf lsdb summary里看不到汇总路由。原因通常有三个——ABR 在这个区域里没有对应的明细路由汇总掩码写成了反掩码或者这条命令配在了错误的区域视图下应该配在产生明细的那个区域而不是接收汇总的区域。我吃过一次亏把abr-summary配在了区域 0 里结果区域 0 的 Type-3 是收到了一堆明细但是汇总压根没生成。第二个坑多区域配完之后路径选择跟预期不一样明明有万兆链路却走了千兆。这基本可以断定是bandwidth-reference没改。默认值 100 的情况下千兆和万兆的 cost 都是 1OSPF 只能按其他因素比如 router-id 大小、接口顺序来打破平局结果就变成了看运气选路。改参考带宽的时候注意这个值要在全网所有 OSPF 设备上保持一致否则各设备算出来的 cost 基准不同选路会变得完全不可预测。7. 配完一套多区域我会逐项核对的清单每次做完多区域改造我都习惯按固定顺序过一遍核对清单这套动作能把 90% 的低级错误挡在上线之前。先看区域覆盖是否完整。display ospf interface逐台设备过一遍确认每个应该跑 OSPF 的接口都在、区域号正确、没有多余接口混进来。特别注意互联链路两个 ABR 之间的互联口如果被漏掉区域 0 就断了一截而这种现象在路由表上不一定立刻看得出来。再看邻居关系是否全 Full。display ospf peer输出的每一行都要确认状态是 Full而且要确认 DR/BDR 的分布符合规划。如果某个广播网段里出现了预期之外的 DR多半是dr-priority忘了配或者配置之后没重启 OSPF 进程导致没生效——优先级修改不会立刻触发重新选举。然后看 LSDB 里的 LSA 数量。display ospf lsdb分区域统计一下如果某个区域的 Type-3 数量远超预期说明汇总没配或者配错位置了如果 stub 区域里出现了 Type-5那一定是有人在某台设备上漏配了stub。再看路由表里的路由来源。display ip routing-table protocol ospf过滤一下重点看有没有预期之外的外部路由、有没有该汇总没汇总的明细。这里还能发现一个常见问题默认路由的出处不对。比如 stub 区域里应该只有 ABR 注入的一条默认路由如果出现了两条甚至更多就要查是不是有人手动配了default-route-advertise。最后看 SPF 调度次数。display ospf brief里的 SPF 计数隔一段时间看两次如果数值在稳定期还在快速上涨说明网络里有东西在频繁触发拓扑变化得回去查是哪个接口在抖。注意整套改造过程中reset ospf process是最后手段。它会清空所有邻居重建过程可能持续几十秒到几分钟业务会中断。能用undo加redo解决的配置调整就别动这个命令。最后分享一个我自己的小习惯多区域改造完成后我会把每台设备的 OSPF 相关配置用display current-configuration configuration ospf导出来和改造前做一次 diff。差异里经常能发现一些顺手多配了一条的东西比如某个接口被误挂进了区域、某条汇总掩码少写了一位。配置文件本身的差异比路由表更容易暴露这类问题因为路由表只反映结果配置才反映意图。