
上一篇把单区域的 OSPF 骨架搭起来邻居起来了、路由也通了很多人在这一步就觉得事情结束了。但真到现场,一个 OSPF 域里挂了三十几台设备、几百条网段问题就冒出来了LSDB链路状态数据库动辄上千条 LSA任何一条链路抖动都会触发全网 SPF 重算CPU 曲线跟着往上窜更麻烦的是某个分支的接入层天天插拔抖动被泛洪到整个域核心也跟着抖。这时候就得上 OSPF 多区域Multi-Area OSPF用区域边界把故障域切开把明细路由挡在区域内部只往骨干区送汇总。这篇接着上篇的代码往下走讲的是华为 VRP 平台上从单区域演进到多区域的完整配置过程区域怎么划、ABR 怎么成型、汇总掩码怎么算、Stub 和 NSSA 怎么选、虚连接什么情况下才能碰以及我这些年踩过的邻居起不来、路由有但不通的坑。适合已经能独立配单区域 OSPF、准备接手稍大一点网络的朋友也适合正在准备网络方向认证、想把理论落到命令行上的人。1. 从单区域到多区域把问题想明白再动手1.1 单区域 OSPF 在什么规模下开始“撑不住”我一直不太赞成“设备超过多少台就必须划区域”这种拍脑袋的说法规模不是唯一变量链路稳定性和网络变更频率同样关键。判断要不要动手我一般看三个信号。第一个信号是 LSDB 体积和 SPF 计算频率。单区域内每台路由器都维护同一份拓扑库任何一台设备新增一个接口、任何一条链路 up/down都会产生新的 Router-LSA 并泛洪全域每台设备都要跑一次完整的 SPF。十台设备、几十条链路的时候感知不到等到三五百条 LSA再叠加接入层频繁抖动你就会看到display cpu-usage里 OSPF 任务占比时不时冒尖。第二个信号是路由震荡的传播范围。某栋楼的接入交换机端口反复闪断本来只影响本楼但在单区域里这条 LSA 会传到核心、传到另一个城市的分支害得远端设备陪着重算。这种“局部故障全局买单”的模型是划区域最直接的理由。第三个信号是路由条目对设备资源的占用。分支的明细网段在核心设备上其实没必要逐条存在核心只关心“到某个分支走哪条路”。把明细挡在区域边界内核心路由表能瘦一大圈这比换硬件省钱得多。注意不要为了划区域而划区域。一个只有五六台设备、链路极其稳定的办公网硬拆成三个区域带来的配置复杂度和排障成本远大于那点 LSDB 开销。1.2 区域划分的四条硬规则与两条软建议OSPF 多区域有几条规则是硬性的违反了协议直接不干活配置前必须刻在脑子里。规则一所有非骨干区域必须与骨干区域Area 0直接相连。不直接相连的区域收不到 Type 3 区域间路由也送不出去。这一点是很多新手翻车的地方——两个分支区域之间拉一根线就想互访不行必须绕回 Area 0。规则二骨干区域不能被分割。Area 0 必须是逻辑上连续的一整块。如果物理上被切开了比如中间一段链路故障或规划失误要用虚连接临时缝合。规则三ABR 必须至少有一个接口在 Area 0。只有同时连接骨干区域和非骨干区域的路由器才是真正的区域边界路由器ABR才会产生 Type 3 汇总 LSA。一台设备连着两个非骨干区域它不叫 ABR产生不了区域间路由。规则四ABR 只把从一个区域学到的 Type 3 路由注入到它连接的其他区域且从非骨干区域学到的 Type 3 不会回灌到另一个非骨干区域。这条规则本质上就是 OSPF 的防环机制靠它保证区域间不会出现路由环路。两条软建议是我自己的经验一是按地理或管理边界划区域一栋楼、一个园区、一个业务分区各成一个区域出问题时“哪个区域的事”一目了然二是单个区域内设备数控制在 50 台以内、区域数控制在个位数这不是协议限制是人的排障能力限制。1.3 区域类型选型对照表多区域落地绕不开区域类型的选择。除了普通区域还有 Stub、Totally Stub、NSSA、Totally NSSA 四种。它们的差别在于“允许什么 LSA 进来、默认路由怎么来”我用一张表把关键差异列清楚后面配置时对照着看。区域类型允许 Type 3允许 Type 4/5外部路由引入默认路由来源典型场景普通区域是是区域内有 ASBR 即可手工或 ASBR 通告骨干区、需要完整路由的核心区Stub是否禁止不能有 ASBRABR 自动下发 Type 3 默认路由末端分支只有一条出口Totally Stub否仅默认否禁止ABR 自动下发 Type 3 默认路由末端分支路由表要极简NSSA是Type 5 否Type 7 是允许以 Type 7 泛洪ABR 或 ASBR 下发分支有自己的出口但想省 LSATotally NSSA否仅默认Type 5 否Type 7 是允许ABR 下发默认分支有出口且路由表要极简选型的判断逻辑其实很简单这个区域有没有自己的外部出口。没有出口、只有一条路通骨干那就 Stub 系有出口、需要引入外部路由那就 NSSA 系。至于要不要“Totally”取决于这个区域里的设备性能和你对路由表整洁度的要求——Totally 系连 Type 3 明细都挡掉只给一条默认路由路由器是省了但排障时你在区域内部看不到具体网段得跑到 ABR 上去查。2. 拓扑与地址规划先定边界再敲命令2.1 案例网络结构与设备角色这次用的场景是一个典型的“总部加两个分支”结构设备角色和区域划分如下和上篇的单区域配置保持衔接上篇里所有设备都在 Area 0这次把两个分支切出去。核心路由器 R1位于总部属于 Area 0同时下连两台汇聚设备作为整个域的骨干节点Router ID 规划为 10.0.0.1。总部汇聚 R2一侧接 R1Area 0另一侧下挂总部接入网段Area 1是第一个 ABR。分支出口 R3一侧接 R1 的点对点链路Area 0另一侧下挂分支 A 的网段Area 2是第二个 ABR。分支接入 R4纯 Area 2 内部设备负责分支 A 的终端接入。分支 B 出口 R5规划上属于 Area 3但物理链路只连到 R4Area 2不直接连骨干需要靠虚连接打通——这个设计是故意留的用来演示虚连接的正确用法和风险。外部出口 R6模拟 ISP 侧通过静态路由引入 OSPF产生 Type 5 外部路由。区域划分上Area 0 只承载 R1 与 R2、R3 之间的互联链路保持骨干区极简Area 1 放总部接入Area 2 放分支 AArea 3 放分支 B。这种“骨干只跑互联、业务网段全下沉”的划法是我比较推荐的骨干区的 LSDB 始终很小SPF 计算压力低。2.2 接口地址与 Router ID 规划表地址规划这件事我在项目里见过太多“边配边想”的情况最后掩码冲突、网段重叠排障排到怀疑人生。开工前先把表拉出来配完一条勾一条效率反而高。设备接口IP 地址/掩码所属区域Router IDR1GE0/0/010.0.12.1/30Area 010.0.0.1R1GE0/0/110.0.13.1/30Area 0—R2GE0/0/010.0.12.2/30Area 010.0.0.2R2GE0/0/110.1.1.1/24Area 1—R2LoopBack010.1.255.1/24Area 1—R3GE0/0/010.0.13.2/30Area 010.0.0.3R3GE0/0/110.2.1.1/24Area 2—R4GE0/0/110.2.1.2/24Area 210.0.0.4R4GE0/0/210.2.2.2/24Area 2—R4GE0/0/010.0.45.2/30Area 2—R5GE0/0/010.0.45.1/30Area 310.0.0.5R5GE0/0/110.3.1.1/24Area 3—R6GE0/0/110.0.16.2/30Area 010.0.0.6Router ID 全部使用 Loopback0 地址且统一按 10.0.0.X 规划好处是哪怕物理接口全换一遍Router ID 也不变邻居关系和 LSA 的 Originator 保持稳定排障时看日志不会对不上号。提示Router ID 一旦选定别随便改。改 Router ID 等于换了身份所有邻居关系会重建LSA 全部重发生产网里做这个动作要挑窗口期。2.3 规划阶段最容易翻车的三个点第一是互联链路掩码用 /30 还是 /24。点对点链路用 /30 是基本素养两个可用地址刚好够用不会浪费。但在 VRP 上要注意network命令用的是反掩码/30 对应的反掩码是 0.0.0.3写错一位就是整个网段都不生效而且不会报错只能靠display ospf interface去查。第二是LoopBack 接口要宣告进区域。很多人只宣告物理接口结果邻居的 Router ID 可达但 ping 不通某些依赖 Router ID 的场景比如虚连接直接卡住。LoopBack 是稳定存在的地址宣告进去区域内的 SPF 树才有稳定的叶子节点。第三是骨干区域不要塞业务网段。我见过把办公网段直接挂在 Area 0 的配置结果骨干区 LSDB 膨胀到上千条完全失去了划区域的意义。骨干区只保留设备间的互联和必要的 LoopBack业务网段一律下沉到非骨干区域。3. 分步配置把骨干区先立起来3.1 Area 0 的基础配置配置顺序上我习惯先把骨干区彻底打通再一个区域一个区域地往外接。这样任何一步出问题排查范围都很小。以下是 R1 的完整配置VRP 平台上network用的是反掩码这点和 Cisco 的写法一致但和华为自己文档里某些地方的正掩码写法要区分开别混。# R1 全局配置 sysname R1 interface LoopBack0 ip address 10.0.0.1 255.255.255.255 interface GigabitEthernet0/0/0 ip address 10.0.12.1 255.255.255.252 interface GigabitEthernet0/0/1 ip address 10.0.13.1 255.255.255.252 interface GigabitEthernet0/0/2 ip address 10.0.16.1 255.255.255.252 ospf 1 router-id 10.0.0.1 area 0.0.0.0 network 10.0.0.1 0.0.0.0 network 10.0.12.0 0.0.0.3 network 10.0.13.0 0.0.0.3 network 10.0.16.0 0.0.0.3R2 和 R3 的骨干侧配置同理只宣告 Area 0 内的接口。这里有个替代写法在接口下直接ospf enable 1 area 0.0.0.0效果一样但我不太推荐混用——一个网络里两种风格并存后面接手的人看配置会很累。统一用一种团队里约定好。参数上前文没提这里补一句华为设备 OSPF 默认参考带宽是 100 Mbit/s千兆接口 cost 为 1万兆接口算出来是 0.1取整后也是 1。这意味着千兆和万兆在选路时权重相同跨区域选路可能选错。如果网络里有万兆链路务必调整参考带宽ospf 1 bandwidth-reference 10000调成 10000 Mbit/s 后千兆 cost 是 10万兆 cost 是 1选路才有意义。这个参数全网必须一致否则 cost 比较就没有可比性。3.2 非骨干区域接入与 ABR 成型骨干区邻居全 Full 之后开始往 R2 上挂 Area 1。关键在于R2 同时加入了 Area 0 和 Area 1此刻它才真正成为 ABR开始为每个区域生成 Type 3 汇总 LSA。# R2 配置 ospf 1 router-id 10.0.0.2 area 0.0.0.0 network 10.0.12.0 0.0.0.3 area 0.0.0.1 network 10.1.1.0 0.0.0.255 network 10.1.255.0 0.0.0.255注意 Multi-Area 场景下network命令只是匹配接口网段不要求精确到接口地址但一旦网段重叠行为会变得很奇怪。比如 10.1.1.0/24 被宣告进 Area 1同设备的另一个 10.1.1.4/30 接口也会被一并拉进去。规划时尽量让各区域网段互不重叠、边界清晰。R3 到 Area 2 的配置结构相同# R3 配置 ospf 1 router-id 10.0.0.3 area 0.0.0.0 network 10.0.13.0 0.0.0.3 area 0.0.0.2 network 10.2.1.0 0.0.0.255R4 是 Area 2 的纯内部设备只属于 Area 2它的配置更简单但也正因为简单容易被写错成“只宣告了部分接口”导致区域内部出现路由黑洞。# R4 配置 ospf 1 router-id 10.0.0.4 area 0.0.0.2 network 10.2.1.0 0.0.0.255 network 10.2.2.0 0.0.0.255 network 10.0.45.0 0.0.0.3R4 上10.0.45.0/30这条链路连的是 R5但 R5 规划在 Area 3这段链路的两个接口分属不同区域。这是非法的——一条链路的两个端点必须在同一个区域除非是虚连接。所以正确做法是把两端的接口都放 Area 2再通过虚连接让 Area 3 逻辑上连回骨干。3.3 逐段落验证的检查清单每配完一层我都要跑一遍这几条命令确认状态再往下一层走。一次性把配置全灌进去再排错是效率最低的做法。检查项命令期望结果邻居状态display ospf peer brief所有邻居 State 为 Full接口是否使能display ospf interface所有规划接口出现Area 号正确接口开销display ospf interface verboseCost 符合预期万兆明显小于千兆本机 Router IDdisplay ospf brief与规划表一致无冲突提示区域间路由display ospf routing出现 Type 3 路由条目实际转发表display ip routing-table protocol ospf路由已下发无 InactiveABR/ASBR 身份display ospf abr-asbrABR 节点标识正确特别说一下display ospf interface这条它的价值在于确认“接口到底有没有被宣告进 OSPF”。如果network反掩码写错了一位接口不会出现但命令行不会有任何报错你会一直困惑为什么邻居起不来。这个坑我踩过一次花了两个小时才发现是反掩码少写了一个 0。4. 收敛优化汇总、特殊区域与虚连接4.1 区域间路由汇总怎么算掩码多区域最大的收益之一就是把区域内的明细分段汇总成一条路由送到骨干核心设备只看到汇总条目。华为的命令是abr-summary注意它在产生 Type 3 的那个区域下配置也就是 ABR 上、属于被汇总区域的那部分配置。假设 Area 1 内部有 10.1.1.0/24、10.1.2.0/24 一直到 10.1.15.0/24 共 16 个网段它们的共同前缀是 10.1.0.0/2016 个 /24 恰好构成一个 /20。那么汇总配置就是# 在 R2 上配置把 Area 1 的明细汇总后发布给其他区域 ospf 1 area 0.0.0.1 abr-summary 10.1.0.0 255.255.240.0掩码计算过程16 个 /24 2 的 4 次方所以前缀长度 24 - 4 20即 255.255.240.0。这里的坑在于汇总网段必须能覆盖所有明细且不能覆盖到不属于本区域的网段。如果 Area 1 里还藏着 10.1.200.0/24它就不在 10.1.0.0/20 范围内会单独发布这没问题但如果 10.1.0.0/20 覆盖到了 Area 2 的地址那就是典型的路由黑洞——核心会把去往 Area 2 某个地址的流量错误地送到 Area 1。汇总之后如果某条明细链路挂了只要还有别的明细在汇总路由不会撤销这就叫“汇总路由的稳定性”。代价是区域外的设备感知不到具体哪条明细断了只能靠区域内自己收敛。这也是我建议“汇总粒度不要太粗”的原因过度汇总会把故障完全隐藏掉。如果引入外部路由对应还有asbr-summary在 ASBR 上配置汇总的是 Type 5 外部路由掩码算法完全相同。这两个命令的作用域别搞混一个管区域间Type 3一个管区域外Type 5。4.2 Stub 与 NSSA省 LSA 还是留灵活Area 1 是总部接入区只有一条路通向骨干不需要知道外部路由也不需要自己引入外部路由这是 Stub 区域的完美候选。Stub 的好处是 ABR 不会向它注入 Type 4 和 Type 5 LSA区域内设备的 LSDB 大幅减少同时 ABR 会自动下发一条 Type 3 默认路由。# R2ABR上配置 ospf 1 area 0.0.0.1 stub # R7Area 1 内部设备上必须同步配置 ospf 1 area 0.0.0.1 stub这里必须强调Stub 区域内所有路由器都要配stub因为 Stub 属性通过 Hello 报文的 E-bit 传递一边配一边不配E-bit 不一致邻居直接卡在 Init 状态起不来。这是我在现场见过的高频问题配置完邻居突然全 Down第一反应应该去看区域标志位。如果连 Type 3 明细都不想让区域内部看到可以在 ABR 上加no-summary变成 Totally Stubospf 1 area 0.0.0.1 stub no-summary注意no-summary只配在 ABR 上区域内设备只配stub。配反了状态机就乱套邻居可能时起时落。Area 3 的情况不同分支 B 自己有一条出口R5 上引入了一条静态默认这种“既有骨干通路、又有本地出口”的区域只能用 NSSA。NSSA 的核心机制是把外部路由以 Type 7 在区域内泛洪再由 ABR 在边界处把 Type 7 转换成 Type 5 发布出去。# R5 与 R4 上 ospf 1 area 0.0.0.3 nssa # R5 上引入外部路由 ospf 1 import-route staticType 7 转 Type 5 的时候ABR 会检查 P-bitPropagate bit和 FA 地址。如果引入时指定的下一跳在区域内可达Type 7 会被转换如果 FA 地址不可达转换后就是一条黑洞路由。所以 NSSA 场景下引入外部路由时务必确认 NextHop 在区域内可路由必要时用import-route static配合明确的 FA 地址控制。4.3 虚连接能不用就不用非用不可要小心回到 R5 的问题Area 3 的物理链路只连到 R4Area 2不直接连骨干违反“非骨干区域必须与骨干直连”的规则。修复手段就是虚连接Virtual Link通过 Area 2 这条传输区域把 Area 3 逻辑上接到 Area 0。虚连接的两端必须都是 ABR而且必须属于同一个传输区域。这里的配置点和直觉相反虚连接的配置放在传输区域下也就是 Area 2而不是目标区域 Area 3。# R3已与 Area 0 直连的 ABR ospf 1 area 0.0.0.2 vlink-peer 10.0.0.4 # R4另一端的 ABR需要同时属于 Area 2 和 Area 3 ospf 1 area 0.0.0.2 vlink-peer 10.0.0.3配置完R4 与 R3 之间会基于 Area 2 的路径建立一条逻辑的点对点链路状态可以通过display ospf vlink查看正常应为 Full。关于虚连接我的态度一贯是“应急工具不是设计工具”。原因有三第一虚连接的路径依赖传输区域的内部路由传输区域里任何一条链路抖动虚连接跟着抖稳定性天然弱于物理直连第二它会让排障路径变长看 LSDB 的时候要跨区域推第三传输区域不能是 Stub 或 NSSA区域类型选择被限制死。所以更合理的做法是调整物理拓扑让每个区域都真正直连骨干虚连接只在割接过渡期短时间使用。5. 排障实录邻居、路由和转发三个层面5.1 邻居起不来问题一定在 Hello 报文里邻居状态机卡在 Init 或 Down99% 是 Hello 报文没匹配上。Hello 报文中参与比对的字段有Hello/Dead 间隔、区域 ID、认证信息、Stub 标志位E-bit、网络掩码在广播网络上。任何一个不一致邻居就停在那不动。我常用的排查路径是先看display ospf peer看状态停在哪一步。停在 Init 说明收到了对方的 Hello 但对方没收到我的通常是单向链路或者 ACL 挡了组播。完全 Down 说明连 Hello 都没收到先确认接口有没有被宣告display ospf interface再看直连能不能 ping 通。提示OSPF 用 224.0.0.5 和 224.0.0.6 两个组播地址。如果链路中间有设备做了组播抑制或者接口上开了组播过滤Hello 会被静默丢弃表现为“物理通、路由协议不通”很容易误判成配置错误。这里有个华为平台特有的点值得单独说MTU 检查。VRP 的接口默认在 DD 报文中把 MTU 字段填 0也就是说默认不比对 MTU。但如果接口下配置了ospf mtu-enable就会携带真实 MTU 并参与比较这时两端 MTU 不一致比如一端是 1500另一端因为走隧道是 1400邻居会卡在 ExStart/Exchange 反复重传 DD 报文。排查时看display ospf interface verbose里的 MTU 值或者直接抓包看 DD 报文一眼就能定位。5.2 邻居 Full 了但路由不全先看 LSA 类型邻居起来了不等于路由就通。我在现场遇到过最典型的一种Area 2 的设备能看到 Area 1 的网段但看不到 Area 0 里某台设备的 LoopBack。查display ospf lsdb summary发现 Type 3 存在再查display ospf lsdb router发现某台设备的 Router-LSA 里没有那条 LoopBack 的链路描述——原因很简单那台设备的 LoopBack 根本没被network宣告进 OSPF。另一种情况是 Stub 区域里“少路由”。如果你在 Area 1 里发现完全看不到外部网段而且display ospf lsdb ase是空的别急着怀疑配置先确认这个区域是不是被配成了 Stub——Stub 区域本来就不接收 Type 5这是设计如此不是故障。还有一类更隐蔽的ABR 上的 Type 3 过滤。华为支持在区域下用filter做 LSA 过滤如果前人配过filter import或filter export而没写文档你会看到“明明该有的路由就是没有”。排查时用display current-configuration configuration ospf把整段配置拉出来看别只看自己改的那几行。5.3 路由表里有但 ping 不通问题多半在转发面路由存在但业务不通说明控制面已经收敛问题出在转发面。我最常遇到的三类第一类是单向路由。A 到 B 有路由B 到 A 没有回程流量被丢弃。用tracert从两端各跑一次很快就能确认。第二类是路由指向了错误的下一跳这种情况多发生在做了汇总之后。汇总路由把流量引到了一个实际不存在明细的路径上形成黑洞。判断方法是display ip routing-table 目的地址看精确匹配到哪条再看那条路由的来源是不是汇总。第三类是接口上配置了策略路由或 ACL把本该转发的流量挡了。这种最难查因为路由表完全正常。我的习惯是先用display ip interface brief确认接口 up再用display acl all扫一遍有没有可疑规则最后才怀疑硬件或运营商侧。5.4 多区域问题速查表下面这张表是我这些年攒下来的高频问题对照现场排障时按“现象—命令—原因”三步走能省掉大量试错时间。现象首选排查命令常见根因邻居一直 Downdisplay ospf interface接口未被 network 宣告反掩码写错邻居停在 Initdisplay ospf peer单向链路、组播被过滤、ACL 拦截邻居停在 ExStartdisplay ospf interface verbose两端 MTU 不一致且开启了 mtu-enable邻居反复 Up/Downdisplay ospf errorHello/Dead 间隔不一致、认证不匹配区域间路由缺失display ospf lsdb summaryABR 未成型、区域未直连骨干外部路由缺失display ospf lsdb ase区域被配成 Stub、ASBR 未引入汇总后出现黑洞display ip routing-table汇总网段覆盖了不属于本区域的地址虚连接起不来display ospf vlink传输区域被配成 Stub、一端不是 ABR路由有但不通tracertdisplay acl all单向路由、策略路由、ACL 拦截补一个独家经验多区域一起上量之后别只盯着邻居状态。我习惯在每次变更后跑一次display ospf lsdb的条目数统计和基线比一下。如果某次变更后 Type 3 数量突然翻倍大概率是某个区域的汇总没生效ABR 把所有明细都发出去了。这个数字比任何单条命令都更能反映整体健康状况。最后分享一个我在实际项目里的体会。多区域 OSPF 的复杂度八成不在配置本身而在“你知不知道自己划了几个区域、每个区域是什么类型、哪些地方做了汇总和过滤”。我现在的习惯是每做一个多区域方案先在文档里画一张区域类型和汇总网段的对照表配置完成后再用display current-configuration configuration ospf把整段贴到文档里和表格逐条核对。这套流程看起来笨但它把“配置漂移”这个最常见的隐患挡在了变更窗口之前——比事后拿着display ospf error一条一条猜要省心得多。