很多人在做路由重发布实验时,习惯把目光盯在import-route那几条命令上:OSPF 引一下 IS-IS,IS-IS 再引一下 OSPF,看到路由表里出现对方协议的路由就算“通了”。但一旦把场景换成“双向双点”,也就是两台边界设备同时在两个协议之间做双向引入,问题就完全不一样了。路由回馈、次优路径、无效 LSA 大量增加,甚至路由震荡,这些才是双点重发布真正要面对的东西。
这篇内容围绕“双向双点重发布实验”展开,我用一台模拟拓扑把整个实验完整跑了一遍。文章会覆盖拓扑设计、无防环配置下的问题现象、基于 Tag 与 Route-Policy 的解环方案,以及最后的验证和调优细节。适合正在准备高级网络认证、或者在生产网络中需要对多协议域做冗余互通的工程师参考。
1. 双向双点重发布到底在模拟什么网络困境
1.1 从“单点”到“双点”:重发布的核心逻辑变化
先看单点重发布。网络只有一个边界节点,比如设备 A 同时运行 OSPF 和 IS-IS,此时把 OSPF 路由引入 IS-IS,或者把 IS-IS 路由引入 OSPF,方向都很明确。即便不做任何防环策略,最坏情况也只是 A 自己把一条已经引入的路由再从另一个协议引回来,在 A 本身形成路由回馈。由于边界只有一个,回馈路径不闭合,实际危害相对有限。
但双点重发布不一样。两台边界设备同时连接两个路由域,OSPF 域和 IS-IS 域在 R2、R3 两个节点上重叠。此时如果把两个方向的路由都无脑引入,就会形成四条重发布通道:
| 通道 | 设备 | 方向 | 作用 |
|---|---|---|---|
| 1 | R2 | OSPF 引入 IS-IS | 把 OSPF 域路由发布到 IS-IS 域 |
| 2 | R2 | IS-IS 引入 OSPF | 把 IS-IS 域路由发布到 OSPF 域 |
| 3 | R3 | OSPF 引入 IS-IS | 把 OSPF 域路由发布到 IS-IS 域 |
| 4 | R3 | IS-IS 引入 OSPF | 把 IS-IS 域路由发布到 OSPF 域 |
四条通道互相交织,A 边界引入的路由,很可能被 B 边界再次引入到原来的协议域。这就是“双点”和“单点”最本质的区别:回馈路径是闭合的,环路真的会转起来。
1.2 生产网络里为什么要用这种危险设计
有人会问,既然双点双向重发布这么容易出问题,为什么还要这么设计?答案是冗余和负载分担。
真实的园区网或企业网里,OSPF 域通常承载核心业务网段,IS-IS 域可能承载传输网或另一张业务网。两个域之间如果只有一个边界节点,一旦这台设备宕机或链路中断,跨域路由就完全中断。双点边界本身就是标准的冗余架构。另一个场景是两台边界设备分担跨域流量,避免单台设备成为瓶颈。
所以在实验环境里把问题做出来,比直接给一份“正确配置”更有价值。只有亲眼看到无防环场景下路由表如何被污染,才能理解 Tag 设计和 Route-Policy 过滤为什么必不可少。
2. 实验拓扑与地址规划:先让两张路由表干净起来
2.1 网络拓扑设计思路
实验拓扑采用经典的“双点双归属”结构。OSPF 域有四台设备,R1、R2、R3、R4 组成一个环形区域,全部位于 OSPF Area 0。IS-IS 域由 R2、R3、R5 组成,R5 同时连接到 R2 和 R3,两台设备作为 IS-IS Level-2 路由器。R2 和 R3 同时运行 OSPF 与 IS-IS,就是双点边界。
为了让“双向”这个特征更明显,我在 OSPF 域侧用 R1 的 Loopback 地址 1.1.1.1/32 作为 OSPF 域内需要发布到 IS-IS 的代表性路由;在 IS-IS 域侧用 R5 的 Loopback 地址 9.9.9.9/32 作为需要发布到 OSPF 的代表性路由。这样两个方向都有明确的源头路由,不会被其他链路路由干扰判断。
OSPF 域内的环形拓扑还能顺便观察路由回馈在域内的传播。R2 把 1.1.1.1/32 引入 IS-IS 后,R3 从 IS-IS 学到这条路由,如果 R3 再把它引回 OSPF,OSPF 域内就会出现一条关于 1.1.1.1/32 的外部路由,这就是典型的路由污染。
2.2 接口地址与协议基础配置
拓扑地址规划如下:
| 设备 | 接口 | 地址 | 所属协议域 |
|---|---|---|---|
| R1 | Loopback 0 | 1.1.1.1/32 | OSPF |
| R1 | GE0/0/0 到 R2 | 10.0.12.1/30 | OSPF |
| R1 | GE0/0/1 到 R4 | 10.0.14.1/30 | OSPF |
| R2 | Loopback 0 | 2.2.2.2/32 | Router-ID |
| R2 | GE0/0/0 到 R1 | 10.0.12.2/30 | OSPF |
| R2 | GE0/0/1 到 R3 | 10.0.23.2/30 | OSPF |
| R2 | GE0/0/2 到 R5 | 10.0.25.2/30 | IS-IS |
| R3 | Loopback 0 | 3.3.3.3/32 | Router-ID |
| R3 | GE0/0/0 到 R2 | 10.0.23.3/30 | OSPF |
| R3 | GE0/0/1 到 R4 | 10.0.34.3/30 | OSPF |
| R3 | GE0/0/2 到 R5 | 10.0.35.3/30 | IS-IS |
| R4 | Loopback 0 | 4.4.4.4/32 | Router-ID |
| R4 | GE0/0/0 到 R3 | 10.0.34.4/30 | OSPF |
| R4 | GE0/0/1 到 R1 | 10.0.14.4/30 | OSPF |
| R5 | Loopback 0 | 9.9.9.9/32 | IS-IS |
| R5 | GE0/0/0 到 R2 | 10.0.25.5/30 | IS-IS |
| R5 | GE0/0/1 到 R3 | 10.0.35.5/30 | IS-IS |
基础配置以华为 VRP 命令为例。R1 的 OSPF 配置如下:
interface LoopBack0 ip address 1.1.1.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.14.1 255.255.255.252 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.0.12.0 0.0.0.3 network 10.0.14.0 0.0.0.3R5 的 IS-IS 配置如下:
interface LoopBack0 ip address 9.9.9.9 255.255.255.255 interface GigabitEthernet0/0/0 ip address 10.0.25.5 255.255.255.252 isis enable 1 interface GigabitEthernet0/0/1 ip address 10.0.35.5 255.255.255.252 isis enable 1 isis 1 is-level level-2 network-entity 49.0001.0000.0000.0005.00R2 和 R3 需要同时启用两个协议,但注意它们的接口不要交叉使能。OSPF 相关接口只跑 OSPF,IS-IS 相关接口只跑 IS-IS,这样拓扑语义才清晰。
3. 不加防环直接重发布:路由表会乱成什么样
3.1 四条重发布通道的行为推演
先按最原始的方式,在 R2 和 R3 上分别执行双向引入。
R2 上的引入配置:
ospf 1 import-route isis 1 isis 1 import-route ospf 1R3 上的引入配置与 R2 完全一致。此时四条通道全部打开,没有任何过滤。
以 1.1.1.1/32 为例推演一遍。这条路由由 R1 通过 OSPF 通告,R2 和 R3 从 OSPF 域学习到。两台设备执行import-route ospf 1后,1.1.1.1/32 被注入 IS-IS。假设 R2 先发布,R3 作为 IS-IS 邻居会通过 LSP 学习到这条 IS-IS 外部路由。此时 R3 的 IS-IS 路由表中已经存在从 R2 过来的 1.1.1.1/32。R3 再执行import-route isis 1时,就会把这条本来源自 OSPF 的路由,以 IS-IS 外部路由的身份再次引回 OSPF。
于是 OSPF 域内出现了不该出现的东西:一条外部类型的 1.1.1.1/32 路由。R4 或 R2 可能会看到这条路由,尽管因为 OSPF 内部路由优先级更高,选路不会立刻被带偏,但 LSA 数量增加了,路由表里出现冗余条目,整个 OSPF 域的表项被污染。
9.9.9.9/32 方向更麻烦。R5 原发这条路由进入 IS-IS,R2、R3 引入到 OSPF 后,两台边界设备再执行import-route ospf 1,把从 OSPF 学到的 9.9.9.9/32 又注入回 IS-IS。R5 会从 IS-IS 域收到大量关于自己直连网段的外部路由宣告,产生“自己学自己”的诡异局面。
3.2 路由回馈与次优路径的具体现象
我实际配置完无策略重发布后,在 R5 上执行路由查询,看到 9.9.9.9/32 在 IS-IS 路由表里有多个来源,一部分来自 R2,一部分来自 R3。原因是 R2 和 R3 各自从 OSPF 学到的 9.9.9.9/32,又通过import-route ospf写回了 IS-IS。R5 本身的原发路由虽然是直连优先级最高,不会立刻被覆盖,但这种回馈路由已经存在于 LSDB 中。
更直观的问题是次优路径。在 R1 上查看 9.9.9.9/32 的 OSPF 外部路由,因为 R2 和 R3 引入时默认Cost Type为 Type-2,默认 Cost 为 1,全网会看到两条完全等价的外部路由。R1 访问 9.9.9.9/32 时可能在 R2、R3 之间做负载分担,但 R2 到 R5、R3 到 R5 的实际链路带宽或质量可能完全不同。等价负载反而造成部分流量走了慢路径。
OSPF 的 Type-2 外部路由有个特性:路由开销只包含 ASBR 引入时设置的 Cost,不叠加 ASBR 到目标网段经过的内部链路 Cost。这意味着无论内部拓扑如何变化,全网对这条外部路由看到的开销都一样,等价路由的产生几乎必然。
IS-IS 方向同样存在次优路由。R5 访问 1.1.1.1/32 时,会看到 R2、R3 分别引入的两条 IS-IS 外部路由。如果两条路径的开销设置相同,就会形成等价路由或负载分担。此时候选路径的优劣完全取决于 R2 与 R1、R3 与 R1 之间链路的真实开销,但引入动作本身没有考虑这一点。
3.3 为什么 OSPF 这边是“污染”,IS-IS 那边是“危险”
两种协议对回馈路由的容忍度不一样。
OSPF 内部路由(区域内、区域间)优先级为 10,外部路由优先级为 150。即便 OSPF 域内被灌入了来自 IS-IS 回馈的外部路由,只要内部路由还存在,选路时内部路由优先,外部路由只是冗余表项。所以说 OSPF 这边的问题更多是“污染”:路由表不干净、LSA 数量膨胀、排查困难。
IS-IS 的情况要危险得多。IS-IS 没有像 OSPF 那样把外部路由优先级压得很低。在 IS-IS 路由表里,Level-2 路由之间主要靠 Cost 比较,回馈的外部路由如果 Cost 设置不当,完全可能超越原生 Level-2 路由成为优选路径。前面 R5 那条 9.9.9.9/32,如果在某些场景下 R5 的直连路由因接口状态变化暂时消失,回馈路由就可能被激活为可用路径,而这条回馈路由的下一跳又指向 R2 或 R3,R2/R3 到达 9.9.9.9/32 的路径又依赖 IS-IS 域,双向依赖直接形成环路。这也是生产环境里“双点双向重发布必须配防环”的核心原因。
4. 解环方案:Tag 标签与 Route-Policy 的组合设计
4.1 防环标签语义:出去一个标,回来一个滤
双点重发布的解环思路,不是禁止双向引入,而是给每条路由标记来源,再在回灌方向把带有“外地户籍”的路由拦截下来。
我采用两个 Tag 值的语义约定:
| Tag 值 | 语义 | 数据流向 |
|---|---|---|
| 100 | 路由源自 IS-IS 域 | IS-IS -> OSPF |
| 200 | 路由源自 OSPF 域 | OSPF -> IS-IS |
在这个约定下,R2 和 R3 执行完全相同的策略:
- 把 IS-IS 路由引入 OSPF 时,拒绝带有 Tag 200 的路由(这些路由是 OSPF 域发出去后又被另一个边界带回的),放行其余路由,并打上 Tag 100。
- 把 OSPF 路由引入 IS-IS 时,拒绝带有 Tag 100 的路由(这些路由是 IS-IS 域发出去后又被另一个边界带回的),放行其余路由,并打上 Tag 200。
这个规则理解起来很简单:从哪个协议域出去,就贴哪个域的标签;回来的时候,只认自己域的标签,看到对方域的标签直接丢弃。
以 9.9.9.9/32 为例。R5 原生发布到 IS-IS 时无 Tag。R2 执行 IS-IS 引入 OSPF,放行这条路由并打 Tag 100。R3 从 OSPF 域学习到 Tag 100 的 9.9.9.9/32 后,执行 OSPF 引入 IS-IS 时,匹配到 Tag 100,直接拒绝。这就切断了回灌链条。但 R3 自己依然可以从 IS-IS 域学习到 R5 原生的 9.9.9.9/32,并把它引入 OSPF,打上 Tag 100。所以 OSPF 域里最终能看到 R2、R3 各自引入一条 9.9.9.9/32,来源都是 IS-IS 原生路由,没有重复回灌。
4.2 R2 与 R3 完全一致的策略配置
在 R2 和 R3 上配置完全相同的 Route-Policy。
首先是 OSPF 视角的引入策略,负责把 IS-IS 路由引入 OSPF:
route-policy OSPF_IN deny node 5 if-match tag 200 route-policy OSPF_IN permit node 10 apply tag 100 ospf 1 import-route isis 1 route-policy OSPF_INnode 5把带 Tag 200 的回灌路由直接拒绝,node 10放行其余 IS-IS 路由并打 Tag 100。这里的apply tag 100会体现在 OSPF Type-5 LSA 的 Route Tag 字段中,域内其他路由器能够感知到。
然后是 IS-IS 视角的引入策略,负责把 OSPF 路由引入 IS-IS:
route-policy ISIS_IN deny node 5 if-match tag 100 route-policy ISIS_IN permit node 10 apply tag 200 isis 1 import-route ospf 1 route-policy ISIS_INnode 5拒绝带 Tag 100 的 IS-IS 回灌路由,node 10放行其余 OSPF 路由并打 Tag 200。
这里有个容易被忽视的细节:Route-Policy 中deny node 5只是不匹配该路由,并没有显式“丢弃”动作,但路由被策略拒绝后不会进入目标路由协议,效果等同于过滤。两个策略都必须配在两台边界设备上,不能用“R2 配一边、R3 配另一边”的方式,否则回灌链路没有完全切断。
4.3 重发布时的路由过滤清单(Prefix-List)
实验环境里我引入的是整个协议域的路由,包括 Loopback、互联链路网段。生产环境里如果直接对整张路由表执行双向重发布,会导致大量无效路由被引入对端协议域。更常见的做法是配合前缀列表,只放行需要跨域通告的目标网段。
比如在 R2/R3 上定义 IS-IS 侧允许引入 OSPF 的目标前缀:
ip ip-prefix OSPF_TO_ISIS permit 1.1.1.1 32 route-policy ISIS_IN permit node 10 if-match ip-prefix OSPF_TO_ISIS apply tag 200如果目标是要让 IS-IS 域学到 OSPF 域内的所有业务网段,就把这些网段逐一写进前缀列表。这个做法的意义是让重发布行为变得可预期,而不是把两张路由表全部倒进对方域里。做实验时也可以只针对代表性路由做过滤,其他互联网段不参与重发布,观察现象会更干净。
5. 实测验证与路径调优
5.1 防环前后路由表对比
配置防环策略后,我重新检查了几台设备的路由表。
在 R5 上查看 1.1.1.1/32 的 IS-IS 路由,正常情况下只有两条来源:R2 引入、R3 引入,且都是原生 OSPF 路由注入,Tag 为 200。不会出现“R2 引入的 OSPF 路由又被 R3 从 IS-IS 引回 OSPF”这类循环条目。
在 R1 上查看 9.9.9.9/32 的 OSPF 外部路由,R2 和 R3 各自发布一条 Type-5 LSA,来源都是 IS-IS 原生路由。路由表里没有出现从 OSPF 域回流到 IS-IS 域又再次注入的重复条目。
在 R4 上检查 OSPF 的 LSDB,1.1.1.1/32 只有 R1 通告的 Router LSA,没有多余的 Type-5 外部 LSA。这说明防环策略把回灌路径彻底切断了。
一个直观的验证方法是观察外部 LSA 的 Advertising Router。防环前,9.9.9.9/32 的 Type-5 LSA 不仅来自 R2、R3,还可能因为回灌产生更多通告者。防环后,通告者固定为 R2、R3 两处,数量稳定。
5.2 用 Cost 与 Type 控制优选路径
防环解决的是“有没有环”的问题,选路还需要单独调优。双点重发布天然会产生两条外部路径,实际网络通常不希望完全等价负载,而是希望有主备或者按业务做分流。
在华为设备上,控制 OSPF 外部路由优先级有两种手段。第一种是调整引入时的 Cost 值,比如让 R3 引入 9.9.9.9/32 时 Cost 更大,全网就会优先走 R2:
route-policy OSPF_IN permit node 10 if-match ip-prefix IS_TO_OSPF apply tag 100 apply cost 10R2 不调整 Cost,保持默认 1;R3 调整 Cost 为 10。由于 OSPF 外部路由默认是 Type-2,Cost 越大优先级越低,全网对 9.9.9.9/32 的优选下一跳会稳定指向 R2。
第二种是更改外部路由类型。OSPF 外部路由支持 Type-1 和 Type-2。Type-2 不考虑到达 ASBR 的内部路径开销,适合目标网段距离 ASBR 较近的场景;如果外部目标网段在 ASBR 远端,更合理的是使用 Type-1,让路径开销叠加内部链路 Cost,全网选路会更真实:
ospf 1 import-route isis 1 route-policy OSPF_IN type 1这里提醒一句:很多实验里大家习惯用默认 Type-2,但生产环境中外部路由的选路经常因为 Type-2 的“无视内部开销”特性出现反直觉的次优路径。改成 Type-1 后,双点引入才能体现真实的路径优劣。
IS-IS 方向的 Cost 调整逻辑类似,在引入 OSPF 路由时通过apply cost调整,或者修改接口的 IS-IS Cost 值来影响域内选路。
5.3 这个实验里最容易翻车的三个细节
第一个翻车点是 Tag 值在协议间传递的问题。OSPF 的 Route Tag 承载在 Type-5 LSA 中,跨设备传递没有问题。但 IS-IS 的 Tag 属性是否随 LSP 传播,不同厂商甚至不同型号的设备表现可能不一样。做实验前最好先在邻居设备上确认能否匹配到对端传入的 Tag,否则防环策略会失效。华为 AR 上我用的是路由策略的 Tag 属性,在 IS-IS 进程中可以通过匹配 Tag 完成防环,但如果你在生产环境跨厂商设备做类似方案,一定要先验证 Tag 传递行为。
第二个翻车点是只在一台边界上配策略。双点重发布防环必须是两台边界设备对称配置,只配 R2 不配 R3,回灌路由会从 R3 漏进来。这个坑非常隐蔽,因为路由表不会立刻断,只会多出一些奇怪的外部路由,等到排障时才会发现。
第三个翻车点是 Route-Policy 节点顺序。华为 Route-Policy 是顺序匹配,deny节点必须放在permit节点之前。如果先写了permit node 10,再写deny node 5,那么所有路由在node 10就已经被放行并打了 Tag,node 5永远不会执行。节点号之间留出间隔,便于后续插入新策略。
还有一个经验可以分享:实验做完后,不要只盯着路由表看,把display ospf lsdb和display isis lsdb的输出也对比一下。LSDB 里的 External LSA 和 IS-IS LSP 数量能直接反映回灌是否被切断。路由表可能因为优先级设置暂时掩盖问题,但 LSDB 不会撒谎。
这个实验做完之后,我对“路由重发布”有了完全不同的理解。它不只是几条引入命令的事,而是一套包含方向语义、过滤策略、选路调优的完整设计。尤其是双点场景,能否在动手配置前把四条通道的流量画清楚,几乎决定了这个实验能不能一次做对。如果后续还想继续深入,可以在这个拓扑上叠加路由引入的度量规划,或者给 OSPF 外部路由加前缀汇总,让整个跨域路由表进一步瘦身。