ENSP里搭好拓扑、敲完ospf 1、network命令一刷,邻居列表刷出一排 Full,路由表里目标网段也躺得好好的——然后 ping 不通。这个画面我见过太多次了,尤其是刚把"回路"和 OSPF 放在一起练的时候:有人把 Loopback 当成"随便配个地址的测试口",结果两台设备的 Router ID 撞在一起,邻居每隔四十秒翻一次;也有人把两台交换机双上行接成环,插上线的一瞬间整个模拟器风扇狂转,CPU 直接顶满。
先纠个可能让新手困惑的点:标题里的 "OPSF" 是 "OSPF" 的手误,全称 Open Shortest Path First,开放式最短路径优先,链路状态型内部网关协议的标准缩写就这一个,没有 OPSF 这个协议,看到它直接按 OSPF 理解就行。而"回路"这个词在网络实验语境下其实是个多义词,它至少对应三种完全不同的东西,配置手法、踩坑方向、排查工具全都不一样。这篇就从这三个"回路"入手,把 ENSP 环境下的 Loopback 环回接口配置、OSPF 邻居建立、区域划分与防环机制、汇总与默认路由下发,一条线捋下来,配上完整可复现的配置和我在实际调试中攒下来的排查路径。适合已经会配 IP 地址、知道静态路由怎么回事,但一上 OSPF 就只会network一下然后干等的朋友;也适合想把自己零散的 OSPF 知识串成体系的人。
1. 先把"回路"拆开:ENSP里它至少对应三种东西
很多人卡壳的根本原因不是命令不会敲,而是把三件事混成了一件。你在搜索框里敲"回路配置",出来的结果可能一半讲 Loopback 接口,一半讲生成树防环,还有一半在讲路由重分发造成的次优路径。三者的配置对象、故障表现、排查入口完全不同,先分清楚再动手,能省掉大量瞎试的时间。
1.1 Loopback 环回接口:一个永远 UP 的虚拟口
Loopback 是设备内部的一个软件接口,没有对应的物理芯片,只要设备没关机,它就永远是 UP 状态,不会因为网线拔了、光模块坏了而 down。这个特性在 OSPF 场景里价值巨大:如果你的 Router ID 是手动绑在某个物理接口地址上的,那个接口一抖,OSPF 进程可能就要重新选 Router ID、重新建邻居、重新泛洪 LSA,整个区域跟着抖一下。绑到 Loopback 上就完全不会有这个问题。
配置本身极简,两行就够:
interface LoopBack0 ip address 10.1.1.1 255.255.255.255注意掩码写255.255.255.255,也就是 /32。有人在 ENSP 里图省事写255.255.255.0,然后在 OSPF 里network 10.1.1.0 0.0.0.255,看起来也通,但这就把一个"主机地址"伪装成了一个"网段",后面做汇总、做路由过滤的时候会非常难受。我的习惯是:Loopback0 专门做 Router ID,永远 /32;需要模拟业务网段的,单独开 Loopback1、Loopback2,用真实的掩码长度。这样地址职责清晰,排查时看到 10.x.x.x/32 就知道是设备身份,看到 192.168.x.x/24 就知道是业务网段。
还有一个新手常问的点:为什么我配了 Loopback,ping自己通,别人却 ping 不到?因为 Loopback 地址默认不参与任何路由协议,你不把它宣告进 OSPF,对端设备的路由表里根本没有这条路,报文到了对端直接被丢掉。这不是故障,这是设计如此。
1.2 二层环路:插上线的那一刻才是灾难开始
第二种"回路"是真正意义上的物理环路,典型场景是两台交换机之间拉了两根线,或者三台交换机接成一个三角形。ENSP 里这个坑特别容易踩,因为模拟器不会像真机那样有端口保护,你把线连上去,广播帧就开始无限循环转发,几秒钟内设备的 CPU 占用率飙升,ping延迟从个位数跳到几百毫秒甚至直接超时,控制台敲命令都卡。
判断方法很直接:看接口的收发速率。如果两个口的入方向流量几乎等于出方向流量,而且数值大得离谱,那基本可以确定成环了。真机上还会有大量的广播报文计数增长,ENSP 里你直接看接口的包计数变化速度就能看出来。
处理方式有两种。一是物理上别接成环,实验拓扑能不环就不环,尤其是刚学 OSPF 的时候,二层环路会把你所有的排错方向都带偏。二是必须要环(比如练生成树、练链路聚合),那就先把 STP 打开,确认根桥选举正常、阻塞端口状态正确,再往上叠三层配置。我的建议是:做 OSPF 实验时,拓扑先用最简单的链状或星状,等路由部分吃透了,再单独开一个实验去玩二层冗余。两件事混在一起做,出了问题你根本判断不出是二层还是三层。
1.3 路由回流与次优路径:最隐蔽的一类"回路"
第三种"回路"不形成真正的转发死循环(三层有 TTL 兜底,真环路会表现为 TTL 耗尽),而是路由走向绕远,形成次优路径。典型表现是:A 到 B 明明有直连链路,流量却绕了一大圈从另一台设备过去;或者更糟,两台设备互相把对方当成下一跳,报文在两者之间来回弹,直到 TTL 归零。
OSPF 里这类问题最常见的成因是多区域场景下 ABR 对区域间路由的处理不当,或者外部路由引入时没有做过滤和标记。比如两台 ABR 同时连接骨干区域和一个普通区域,普通区域内部又有一条直达链路,这时候从普通区域访问骨干区域的某个网段,可能会先出区域、再进区域,绕一个来回。这种问题不看拓扑图光看路由表是发现不了的,必须把tracert的结果和拓扑对照着看。
三类"回路"的区别我整理成一张表,配置前扫一眼能少走很多弯路:
| 类型 | 配置对象 | 典型症状 | 排查入口 |
|---|---|---|---|
| Loopback 环回接口 | 设备虚拟接口 | Loopback 地址 ping 不通、Router ID 抖动 | 路由表是否有该 /32 条目、是否宣告进协议 |
| 二层物理环路 | 交换机端口与 STP | CPU 飙高、延迟抖动、广播泛洪 | 接口收发速率、STP 端口状态 |
| 路由次优/回流 | 区域划分与路由策略 | 路径绕远、TTL 耗尽、时延异常 | tracert 路径与拓扑比对、LSA 明细 |
2. 拓扑与地址规划:动手前先定死这几件事
我见过太多人打开 ENSP 就开始拖设备、连线、配地址,配到一半发现网段冲突了,或者 Router ID 重了,然后从头再来。规划这十分钟,能省掉后面一小时的返工。这一节给出一套可以直接抄的规划方法,拓扑规模不大但五脏俱全,能覆盖后面要讲的所有知识点。
2.1 拓扑选型:三台路由器加一个 ABR 就够了
我这套实验用三台路由器,R1 和 R3 各挂业务网段,R2 夹在中间做区域边界路由器(ABR)。链路连接是 R1 的 G0/0/0 接 R2 的 G0/0/0,R2 的 G0/0/1 接 R3 的 G0/0/0。区域划分上,R1 和 R2 之间的链路划进骨干区域 area 0,R2 和 R3 之间的链路划进 area 1。这样 R2 天然成为 ABR,一台设备同时持有两个区域的链路状态数据库,后面讲区域间路由、讲汇总、讲防环,全都能在这个拓扑上演示出来。
为什么不直接三台全塞进 area 0?因为单区域环境下你永远看不到 ABR 的行为,也看不到 Type 3 LSA 是怎么产生的,更别提区域间汇总和防环了。OSPF 真正有意思、也真正容易出错的部分,全在多区域。有人觉得多区域复杂,想先单区域跑通再扩展,这个思路没错,但你要知道单区域跑通只验证了"能通",没验证"路由是怎么算出来的"。我的建议是:单区域跑一遍确认基础无误,然后立刻加上第二个区域,因为从单区域到多区域的这一步,才是理解 OSPF 的分水岭。
设备选型上,ENSP 里路由器用 AR 系列,三层交换机用 S 系列,两者都支持 OSPF,接口命名规则略有差异(路由器是 G0/0/0,交换机是 GE0/0/1 或 Vlanif)。做纯路由实验我一律用路由器,避免接口命名混淆。如果非要练三层交换机,记得先把对应端口port link-type access加入 VLAN,再在 Vlanif 上配地址,别直接在物理口上敲 IP,那是配不上的。
2.2 地址与 Router ID 规划表
地址规划的核心原则是可读性优先于节省。实验环境不缺地址,缺的是你三个月后回头看还能一眼看懂。我的编号习惯是:10.0.X.Y,X 是设备编号,Y 固定为 1 表示 Loopback。链路网段用XY.1.1.0/24,X 和 Y 是两端设备的编号,比如 R1 和 R2 之间就是12.1.1.0/24。这个习惯看起来土,但它在你排查问题时能省下大量"这台设备的地址到底是哪个"的确认动作。
规划表如下:
| 设备 | 接口 | 地址/掩码 | 区域 | 用途 |
|---|---|---|---|---|
| R1 | LoopBack0 | 10.0.1.1/32 | — | Router ID、测试源 |
| R1 | LoopBack1 | 192.168.10.1/24 | area 0 | 模拟业务网段 A |
| R1 | G0/0/0 | 12.1.1.1/24 | area 0 | 互联 R2 |
| R2 | LoopBack0 | 10.0.2.2/32 | — | Router ID |
| R2 | G0/0/0 | 12.1.1.2/24 | area 0 | 互联 R1 |
| R2 | G0/0/1 | 23.1.1.2/24 | area 1 | 互联 R3 |
| R3 | LoopBack0 | 10.0.3.3/32 | — | Router ID、测试源 |
| R3 | LoopBack1 | 192.168.30.1/24 | area 1 | 模拟业务网段 B |
| R3 | G0/0/0 | 23.1.1.3/24 | area 1 | 互联 R2 |
Router ID 我全部手动指定为对应设备的 Loopback0 地址,不依赖自动选举。自动选举的规则是先比 Loopback 地址大小、再比物理口地址大小,虽然结果可预测,但一旦拓扑调整、加了新接口,选出来的 ID 可能就变了。Router ID 变了意味着 OSPF 进程要重置邻居关系,这在生产环境里是不可接受的抖动源,实验里养成手动指定的习惯,将来迁移到真实环境不用改肌肉记忆。命令是:
ospf 1 router-id 10.0.2.2注意这个router-id参数写在ospf 1后面,如果进程已经起来了再改,需要reset ospf process才能生效,而且这个动作会中断所有邻居,敲之前心里要有数。
2.3 为什么不直接把业务网段配在物理口上
有人会问:业务网段为什么非得用 Loopback 模拟,直接在 R1 的物理口上多加一个从地址不行吗?技术上可以,但 Loopback 有个物理口比不了的优势:它永远不会 down。物理口一旦 down,绑在上面的网段就随之消失,OSPF 会立刻撤销这条路由,整个区域泛洪一遍更新。如果你的业务网段是直接挂在物理口上的次要地址,链路一抖,路由就跟着抖,虽然会恢复,但这段空窗期里所有指向该网段的流量全部黑洞。
用 Loopback 承载业务网段,只要设备活着,路由就一直在。真实的网络设计里,服务器网段、管理网段、业务汇聚网段,凡是要求高可用的,基本都是这么处理的。代价是 Loopback 上的流量最终还是要从某个物理口出去,所以物理链路断了照样不通,但至少路由表不会跟着跳,收敛过程更干净,不会出现"路由还在但下一跳已经失效"的中间态。
3. Loopback 的三重身份与 OSPF 宣告的正确姿势
Loopback 在 OSPF 里不是"配了就完事"的配角,它同时承担三个角色:Router ID 的载体、稳定业务网段、以及链路探测的测试源。三个角色对配置的要求略有不同,混在一起配容易出现"ID 对了但网段没宣告""网段宣告了但掩码写错"这类低级问题。
3.1 基础配置与三个高频疏漏
先看一段完整的 R1 配置:
sysname R1 interface LoopBack0 ip address 10.0.1.1 255.255.255.255 interface LoopBack1 ip address 192.168.10.1 255.255.255.0 interface GigabitEthernet0/0/0 ip address 12.1.1.1 255.255.255.0 ospf 1 router-id 10.0.1.1 area 0.0.0.0 network 12.1.1.0 0.0.0.255 network 192.168.10.0 0.0.0.255三个高频疏漏,我按踩到的频率排序。
第一个,忘了宣告 Loopback1。Router ID 用的 Loopback0 只提供身份,不参与路由计算,你不network它,别人就学不到 192.168.10.0/24。这个错误的表现是:邻居 Full、路由表里有对端互联链路、但 ping 不通对方的业务网段,因为对端压根没这条路由。
第二个,network命令的掩码写反了。OSPF 的network后面跟的是反掩码(通配符掩码),不是子网掩码。network 192.168.10.0 0.0.0.255是对的,写成255.255.255.0就是错的,而且错得很隐蔽——命令能敲进去,不报错,但匹配不到任何接口,结果就是"我明明配了就是不通"。判断方法:network后面的第二个参数如果长得像子网掩码,基本就是写错了。
第三个,一个接口被多条network语句重复匹配。比如你已经network 192.168.0.0 0.0.255.255,又写了一条network 192.168.10.0 0.0.0.255,两条都命中 Loopback1。这种情况下 OSPF 会取匹配范围最小的那条,也就是按 /24 处理,和你的预期一致,但如果是反过来写(先精确后粗略),行为就不一定符合直觉了。我的做法是每条network都精确到接口的实际网段,不做大范围通配,多写几行的成本远低于排查时的困惑。
3.2 检查工具:三条命令定位宣告是否生效
配完不要急着重启进程,先用这三条命令依次确认:
display ospf interface display ospf peer display ip routing-table protocol ospf第一条看的是"哪些接口真的进入了 OSPF"。输出里每个接口会带上所属区域、网络类型、开销、邻居数量。如果 Loopback1 没出现在这个列表里,说明network没匹配上,回去检查反掩码。这一条是最直接的验证,比看配置管用,因为配置里写着不等于生效了。
第二条看邻居状态。正常应该是Full,如果是2-Way,说明双方都收到了对方的 Hello 但没建立邻接,多出现在广播网络上非 DR/BDR 的路由器之间,属于正常;如果一直停在Init或者Down,那就是 Hello 报文层面就没对上,往后看第四节。
第三条看 OSPF 学到的路由。这里有个细节:OSPF 学到的路由在路由表里会标注协议来源和开销,但路由器自己直连的网段不会以 OSPF 路由的形式出现,它们属于直连路由,优先级更高。所以你在 R1 上查不到 192.168.10.0/24 的 OSPF 路由是正常的,那是它自己的直连网段;你去 R3 上查,才应该看到这条 OSPF 路由,下一跳指向 R1 和 R2 之间的链路。
3.3 用 Loopback 做测试源:避开"能 ping 通但说不清从哪来"
排错时最忌讳的做法是ping对端的互联接口地址,因为这个动作的源地址是出接口地址,路径选择可能和你真正关心的业务流量完全不同。正确的做法是带上源地址参数:
ping -a 10.0.1.1 10.0.3.3以 R1 的 Loopback0 为源,ping R3 的 Loopback0。这个报文走的是完整的三层转发路径,从 R1 出物理口、经 R2 转发、到达 R3,回程同理。它验证的是"业务网段之间的端到端连通性",而不是"两个直连接口能不能互通"。这两个概念差得很远:前者通过说明路由、转发、回程全都正常,后者通过只说明链路层没问题。
tracert也是同理,默认源地址同样是出接口,很多次优路径问题是靠tracert的跳数异常才发现的。如果发现报文绕了一圈才到对端,回到第二节的拓扑图对照,看是不是区域划分导致的路径绕行。这个动作建议养成习惯,每次配完 OSPF 不只是 ping 一下,而是tracert看一眼路径,路径和拓扑一致才叫真的通了。
4. 邻居从 Init 到 Full:每个状态卡住分别意味着什么
OSPF 邻居建立有一套明确的状态机,从 Down 一路走到 Full,共七个状态。新手最容易犯的错是"看到邻居没起来就重启进程",重启十次也没用,因为问题不在进程本身。真正有效的做法是看它卡在哪个状态,每个状态对应的故障范围是非常清晰的,缩小范围之后一次就能命中。
4.1 状态机与每个状态对应的排错方向
| 状态 | 含义 | 卡住的常见原因 |
|---|---|---|
| Down | 未收到任何 Hello | 接口未宣告、物理链路断开、区域号不匹配 |
| Init | 收到 Hello 但对方列表里没有我 | Router ID 冲突、单通、认证参数不对称 |
| 2-Way | 双方互见,但未建邻接 | 广播网络上非 DR/BDR 之间,属正常 |
| ExStart | 开始协商主从关系 | MTU 不一致、Router ID 冲突 |
| Exchange | 交换数据库描述报文 | MTU 不一致、LSA 头部异常 |
| Loading | 请求缺失的 LSA | 对端 LSDB 异常、链路不稳导致重传失败 |
| Full | 邻接关系建立完成 | 已达最终状态,无需处理 |
这张表我建议直接抄下来贴在实验环境的桌面上。七个状态里,2-Way是最容易被误判为故障的,因为在广播网络(比如以太网)上,非 DR/BDR 的路由器之间本来就不建立 Full 邻接,这是设计行为,目的是减少邻接数量、降低泛洪开销。你看到两台设备之间是2-Way,只要 DR 和 BDR 都和它们建立了 Full,那就是健康的。
4.2 Init 状态:八成是 Router ID 撞了
Init的含义很具体:我收到了你的 Hello 报文,但你的 Hello 报文里的邻居列表中没有我的 Router ID。正常情况下,我收到你的 Hello 之后,会把你加入邻居列表,你收到我的 Hello 后也会把我加入,双方互见就进2-Way。如果一直停在Init,说明有一方的 Hello 报文没能正常送达,或者对方认为我"不是它认识的那个我"。
最常见的成因就是两台设备的 Router ID 相同。这种配置错误在批量部署时特别容易出,因为你复制粘贴配置模板,忘了改 ID。判断方法很简单,两边各敲一次:
display ospf brief看Router ID那一行,两边一样就立刻改。改完记得reset ospf process,否则不生效。另一种成因是单向可达,比如 R1 能到 R2,R2 回不来,可能是某一边的接口掩码配错导致网段判断不一致,或者中间有三层设备拦了组播。OSPF 的 Hello 报文发往224.0.0.5这个组播地址,如果中间有设备没开组播转发,报文就到不了对端,表现同样是单向的Init。
4.3 ExStart 卡死:盯着 MTU 看
ExStart是协商主从关系的阶段,双方要比 Router ID,大的当 Master。这个阶段卡住,八成以上是MTU 不一致。原因是数据库描述报文(DD 报文)里携带了接口 MTU 的字段,如果一边是 1500 一边是 1400,双方会反复重传 DD 报文却始终无法推进,看起来就像僵住了。
ENSP 里改 MTU 很直接:
interface GigabitEthernet0/0/0 mtu 1400但要注意,两端必须改成一样的值,单边改只会换一种方式卡住。排查时先在一端display interface GigabitEthernet0/0/0看 MTU 字段,再去另一端对,两边一致但这个状态还是不走,再考虑 Router ID 冲突(是的,Router ID 冲突在两个不同阶段都能表现出来)。还有一个不常见但确实存在的成因是两端 OSPF 版本或某些扩展能力协商失败,这种情况在同一个模拟器环境里几乎不会出现,但如果混了不同版本的镜像,就要留意。
提示:改完 MTU 之后邻居不会自动恢复,必须重置 OSPF 进程或者等它自己超时。急着验证的话直接
reset ospf process,敲之前确认这个设备上没有其他不该中断的邻居。
4.4 一条完整的排查链路示范
假设现象是:R1 和 R2 之间的邻居一直停在Init。我的操作顺序是这样的。
第一步,在 R1 上看接口有没有进 OSPF:display ospf interface。如果 G0/0/0 不在列表里,直接回去查network命令,这是最快能排除的一类问题。
第二步,看两端的 Router ID 是否冲突:display ospf brief,两边对照。冲突就改,改完重置进程。
第三步,看两端的区域号是否一致:display ospf interface里每个接口会标出所属区域。区域号不一致时,邻居根本建立不起来,通常表现为Down而不是Init,但值得顺手确认。
第四步,看物理层和链路层:display interface GigabitEthernet0/0/0,确认接口状态是 UP、协议状态是 UP。ENSP 里有时候连线看起来连上了,实际端口没起来,尤其是你从设备面板上拖线的时候拖偏了,看着像插上了实际没插。这种情况重连一次就好。
第五步,如果以上全对,考虑单向可达。在 R1 上pingR2 的接口地址,通了说明链路层没问题;如果不通,回到链路层查。通了但邻居还是 Init,就看是不是认证配置不对称,一边开了 MD5 一边没开,Hello 报文会因为认证失败被丢弃,表现也是单向的。
这个顺序的价值在于从最便宜的检查做起。前两步只需要看输出,不用改配置;后面几步涉及改配置和重启进程,成本高。排查这件事,永远是先做零成本的观察,再做有成本的变更。
5. 防环机制:SPF 天生无环,环路都是人配出来的
OSPF 内部靠 SPF 算法计算最短路径树,算法本身保证了区域内不会出现转发环路——这是 Dijkstra 算法的数学性质,不需要额外的防环机制。所以你在单区域里配 OSPF,基本上不可能配出真正的转发环路。环路的来源集中在三个地方:区域间的路由传递、外部路由的引入、以及人为的路由策略配置。这一节把这三种情况拆开讲。
5.1 区域内为什么天然无环
SPF 的计算过程是:每台路由器根据 LSDB 里的 Type 1 LSA(路由器 LSA)和 Type 2 LSA(网络 LSA)构建出整个区域的拓扑图,然后以自己为根,用 Dijkstra 算法算出到每个节点的最短路径树,最后根据树上的节点生成路由。树上不会有环,这是树的定义决定的。所以区域内路由天然无环,这一点不需要你操心。
真正需要操心的是"树之外"的部分。比如区域间路由,它不是算出来的,是从 ABR 那里"听来的";外部路由更不是算出来的,是引入方告诉你的。凡是"听来的"路由,就有被错误信息污染的可能。
5.2 区域间路由的传递规则与水平分割
ABR 在区域间传递路由时有一条硬规则:从骨干区域学到的 Type 3 LSA,可以传给非骨干区域;从非骨干区域学到的 Type 3 LSA,不会再传回骨干区域。这条规则就是 OSPF 区域间的水平分割,目的是防止路由信息在区域之间来回反弹。
这条规则带来的一个实际影响是:所有非骨干区域必须直接或间接连到骨干区域,否则区域间的路由传不过去。ENSP 里搭一个 R1(area 0)—R2(area 1)—R3(area 2)的拓扑,你会发现 R1 和 R3 之间学不到对方的路由,因为 R2 不会把 area 1 的路由传进 area 2,它只会把 area 0 的路由传出去。解决办法是配一条虚连接(Virtual Link),让 area 2 逻辑上连到骨干区域。
虚连接的配置是这样的,在穿越区域的 ABR 上配:
ospf 1 area 0.0.0.1 vlink-peer 10.0.3.3对端的 ABR 上也要配一条指向自己的,两边的vlink-peer填的是对方的 Router ID,不是接口地址。这一点特别容易错,因为其他命令里让你填的都是接口地址。填错了虚连接起不来,表现是display ospf vlink里状态一直是 Down。
5.3 外部路由引入:环路的真正高发区
外部路由(Type 5 LSA)是环路的高发区,因为它是从别的路由协议或者静态路由引入进来的,引入方对这条路由的原始路径没有完整的认知。典型场景是两台设备同时引入同一条外部路由,又互相从对方那里学到了对方引入的版本,形成"我引入的路由从你那里学回来"的回路。
防护手段有两个,我一般同时用。第一个是路由标记(route-tag),引入的时候打上标记,收到带同样标记的路由就丢弃,防止回灌:
ospf 1 import-route static tag 100第二个是过滤策略,在引入时用路由策略精确控制哪些网段可以进来,不要图省事import-route static一把梭。外部路由引入这个问题,我踩过一次印象很深:两台边界设备互相引入,路由表看起来能通,但tracert显示报文在两台设备之间弹了两次才出去,延迟从 2ms 变成 8ms。当时怎么查都查不出来,最后对比两边的 LSDB 才发现同一条外部路由有两个来源。
判断是否存在这种问题,最快的办法是在两台设备上分别查display ospf lsdb ase,看同一条外部路由是否有多条 Type 5 LSA,且Advertising Router不同。如果有,再去看Forwarding Address和Tag,基本就能定位。
6. 汇总、默认路由与特殊区域:把路由表压下去
实验拓扑规模小,路由表怎么看都清爽,但真实环境里一个区域几百条路由,不汇总的话 LSDB 会撑得很大,SPF 计算频率也会上升。汇总这件事在 ENSP 里练一遍,比看十遍原理管用。这一节讲区域间汇总、外部路由汇总、默认路由下发的三种方式和特殊区域的取舍。
6.1 区域间汇总:在 ABR 上做,注意生效条件
区域间汇总的配置位置在 ABR 上,针对的是某个具体区域:
ospf 1 area 0.0.0.1 abr-summary 192.168.0.0 255.255.0.0这条命令的含义是:把 area 1 内部所有落在192.168.0.0/16范围内的明细路由,汇总成一条 Type 3 LSA 发给其他区域。注意它是针对"源区域"配的,也就是你在 ABR 上,为某个区域配汇总,汇总的是那个区域里的路由。
生效有三个前提,缺一不可。一是必须配在 ABR 上,普通路由器配了不生效。二是被汇总的明细路由必须真实存在于那个区域的 LSDB 里,如果子网路由没有全部出现,汇总路由可能不会生成。三是汇总后的掩码必须能覆盖所有明细路由,配小了会漏,配大了会把不属于自己的网段也带进去。
这里有个很典型的坑:汇总路由生成后,如果明细路由全部消失,汇总路由也会跟着消失,这是符合预期的。但如果部分明细路由消失,汇总路由会保留,流量打到一个已经不存在的子网时就会黑洞。这个行为在实验里看不出来,真实环境里会造成非常难查的间歇性故障。我的做法是配汇总的同时手工加一条指向 null0 的静态路由做兜底,方向一致,防止黑洞。
6.2 默认路由下发:三种方式怎么选
默认路由下发给下游设备,OSPF 里有三种常见做法,选择哪一种取决于你的场景。
第一种,default-route-advertise,在 ASBR 上用,前提是本机路由表里要有一条真实的默认路由(比如指向 ISP 的静态默认路由),否则不生效。好处是它会把默认路由作为 Type 5 LSA 泛洪到整个 OSPF 域,所有区域都能收到。缺点是如果本机的默认路由没了,这条 LSA 也会撤销,下游跟着断。
第二种,default-route-advertise always,加always参数表示不管本机有没有默认路由,都强制下发。这个参数要慎用,因为如果本机实际上没有出口,下游设备会把流量全送到你这里,然后你这边再丢,等于是把黑洞放大到全网。
第三种,在 Stub 区域或 NSSA 区域里,ABR 会自动下发一条 Type 3 的默认路由,不需要额外配置。这种方式最干净,因为它天然限制了范围,只在那个区域内生效。
我把三者的区别列成表格:
| 方式 | 配置位置 | LSA 类型 | 生效条件 | 适用场景 |
|---|---|---|---|---|
| default-route-advertise | ASBR | Type 5 | 本机需有默认路由 | 出口路由器向全网下发 |
| 加 always 参数 | ASBR | Type 5 | 无条件 | 出口路由不稳定但需保持下发 |
| Stub/NSSA 自动 | ABR | Type 3 | 区域类型为 Stub/NSSA | 末梢区域简化路由 |
6.3 Stub 与 NSSA:要不要为了省路由牺牲灵活性
Stub 区域的设计初衷是:末梢区域不需要知道外部路由,只需要一条默认路由出去就行。配置很简单,在区域内的所有路由器上都要配:
ospf 1 area 0.0.0.1 stub注意"所有"这两个字,单边配会导致邻居关系建立失败,因为 Hello 报文里的 Stub 标志位不一致。这个坑我踩过,两边配到一半去接电话,回来忘了另一边,然后花了二十分钟查邻居为什么起不来。
Stub 的代价是这个区域里不能有 ASBR,也就是不能引入外部路由。如果你的末梢区域里恰好有一台设备需要引入外部路由(比如接了一条专线),那就得用 NSSA。NSSA 允许区域内存在 ASBR,外部路由以 Type 7 LSA 的形式在区域内传递,到 ABR 那里再转换成 Type 5 发出去。
选型上我的经验是:纯末梢、没有任何外部路由需求的,用 Stub;有外部路由需求的,用 NSSA;两者都不确定的,先别配,等路由表撑不住了再说。特殊区域不是配了就更"高级",它是以牺牲灵活性换简化,配错了排查成本比省下的那点 LSDB 空间高得多。
7. 五个真实症状的排查动作对照
理论和配置讲完,最后落到实际。这一节把我在 ENSP 里遇到频率最高的五个症状和对应的排查动作列出来,都是可以直接照着做的。这些症状的共同点是:现象看起来很像,但根因完全不同,凭感觉猜基本猜不中。
| 症状 | 最可能的原因 | 第一步动作 |
|---|---|---|
| 邻居 Full 但业务网段 ping 不通 | 业务网段未宣告、回程路由缺失 | 在两端分别查路由表是否有对方业务网段 |
| 邻居每隔约 40 秒重建一次 | Router ID 冲突、链路抖动 | 查两端 Router ID、查接口错误计数 |
| ping 通但延迟异常、tracert 绕路 | 区域划分导致次优路径 | tracert 对比拓扑、查 LSA 明细 |
| 邻居卡在 ExStart 不动 | MTU 不一致 | 两端对比接口 MTU |
| 全网突然大面积不通 | 二层环路、STP 收敛、CPU 打满 | 查接口收发速率、查 STP 状态 |
第一个症状最常见,排查思路是"分段验证":先 ping 直连的接口地址确认链路通,再 ping 对端的 Loopback0 确认路由通,最后 ping 业务网段确认宣告通。三跳验证下来,问题必然落在其中一段,范围一下就缩小了。
第二个症状有个快速判断技巧:看邻居重建的间隔。如果是有规律的、大约 40 秒一次,基本可以确定是 Router ID 冲突或者 Hello/Dead 定时器不匹配;如果是无规律的,那就是链路本身在抖,去看接口的错误包计数和物理状态。
第五个症状最凶险,因为它影响面大、来得快,而且在 ENSP 里特别容易触发。判断顺序是:先看设备 CPU、再看接口流量、最后看 STP。如果 CPU 高但同时接口流量不大,可能是路由震荡导致的 SPF 频繁重算,去看display ospf error有没有异常计数;如果接口流量爆表,那就是二层环路,拔线或者开 STP。
8. 几个我踩过之后才记住的细节
第一个细节,reset ospf process这个命令敲之前要停一秒。它在实验里随手就敲,但在真实环境里会瞬间切断所有邻居、清空 LSDB、重新收敛,整个网络会有几秒的中断。养成习惯:敲之前先display ospf peer看一眼有多少邻居,心里有个数字,再决定要不要敲。实验里随便练,但把这个动作的仪式感建立起来,比背十遍命令有用。
第二个细节,ENSP 里保存配置这个动作别偷懒。模拟器偶尔会崩,配了半小时的拓扑没了,重来一遍的挫败感很强。我的做法是每到一个小阶段就save一次,成本一秒,收益巨大。另外拓扑文件本身也要另存备份,改坏了能回滚。
第三个细节,地址规划表要写在拓扑旁边,不要只记在脑子里。我见过太多人配到第三台设备的时候忘了第一台用的什么网段,然后开始display到处翻。一张纸、一个文本文件,五分钟的事,能省掉后面反复确认的时间。
第四个细节,关于抓包。ENSP 里抓包能看到 Hello 报文的实际字段,包括 Hello 间隔、Dead 间隔、区域号、认证类型、邻居列表。邻居起不来又查不出原因的时候,抓一次包往往比敲十条命令管用,因为你能直接看到"报文到底发了没有""发出去的字段对不对"。这个技能建议早点练,比对着文档猜高效得多。
第五个细节,也是最容易被忽略的一个:实验做通了不代表理解了,能给别人讲明白才算。我自己的检验方法是,配完之后关掉配置,凭记忆把每一条命令的用途复述一遍,凡是卡壳的地方,就是没真懂的地方,回去补。OSPF 这个东西,配置命令就那么十几条,但每条背后对应的是一个机制,机制没搞清楚,换个拓扑就又不会了。