☰
IS-IS区域迁移与路由汇总:从原理到实战避坑指南
2026/10/20 11:55:59 网站建设 项目流程

1. 从一次“区域合并”的翻车现场说起

去年我帮某企业做骨干网整合,原计划是把两个 Level-1 区域合并成一个,再把边界路由器的 Level-2 角色收敛掉。方案评审时大家都觉得 IS-IS 区域调整比 OSPF 简单——毕竟 IS-IS 的区域边界在路由器上,不用一根根链路去改 area。结果真到割接窗口,问题一个接一个:先是某台接入路由器一直报邻居 down,然后是 L1 区域内部突然多出一条指向奇怪方向的默认路由,最后是业务回程路径绕了一大圈。那次之后我把 IS-IS 的区域迁移和路由汇总重新摸了一遍,这篇文章就是当时经验的整理。

IS-IS 的区域迁移,本质上是改变一台设备在 Level-1/Level-2 层级中的位置,同时重新定义它向其他区域通告路由的方式。而路由汇总恰恰是区域迁移中最容易被忽略的伴生动作:边界点一旦移动,原先的汇总点可能变成旁路,明细路由和汇总路由之间会出现黑洞或次优路径。这两件事必须放在一起规划,不能只改 Level、只改 NET,然后指望路由自己收敛好。

这篇文章适合谁看?网络工程师、运维工程师,尤其是那些要碰企业骨干网、数据中心出口、运营商接入网的 IS-IS 使用者。下面这些内容不是理论堆砌,是我在设备上实际操作过的流程,也包含了一些常规文档里不会写的坑。

1.1 项目背景:为什么要做区域迁移

那次项目本身不复杂。客户早期网络规划时每个地市一个 Level-1 区域,随着业务扁平化,区域间流量越来越大,L1/L2 边界越来越多,LSP 泛洪也变得越来越不可控。方案是想把相邻几个区域合并成一个大区域,减少边界数量,同时把原来的边界路由器降级为纯 Level-1,只在核心保留少量 L1/L2 路由器。

听起来不难,对吧?IS-IS 的区域边界是“软边界”,一台路由器可以同时扮演 L1、L2 或者 L1/L2。区域合并似乎只要把设备的 Area ID 改一致,再把不必要的 L2 链路关掉就行。但真正操作时会发现,IS-IS 的 Level 关系、ATT 位、默认路由、路由泄漏、汇总配置,这些隐性的东西会一起跟着变。任何一个环节没考虑,业务就会给你颜色看。

1.2 IS-IS 的区域心智模型:和 OSPF 完全是两回事

先说清楚底层机制,这是后面所有操作的基础。

OSPF 的区域边界在链路上,一条链路属于哪个区域是固定的,ABR 连接多个区域。而 IS-IS 的区域边界在路由器上,路由器通过 NET 地址里的 Area ID 声明自己属于哪个区域,通过 is-type 声明自己参与哪一级 SPF 计算。一台路由器可以只有 Level-1 能力,也可以只有 Level-2 能力,多数情况是 Level-1-2。不同类型之间还能建立邻居关系,只要接口的 circuit type 匹配就行。

更关键的是 LSP 泛洪规则。Level-1 的 LSP 只在 Level-1 区域内泛洪,Level-2 的 LSP 在整个 Level-2 骨干域泛洪。一个 Level-1-2 路由器会维护两份独立的 LSDB:一份放 L1 的 LSP,一份放 L2 的 LSP。所谓“区域”,在 IS-IS 眼里并不是一张扁平的地图,而是两棵并行的 SPF 树,L1 树负责区域内部,L2 树负责区域间。

这就是为什么区域迁移不能只改一个 NET。你把一台纯 L1 路由器从 Area 49.0001 改成 49.0002,它在 Area 49.0001 里建立的所有 L1 邻接会全部失效,因为 L1 邻接要求双方 Area ID 一致。同时它的 L1 LSP 会从旧区域的 LSDB 中消失。如果这台设备此时没有 L2 上联,那它就彻底从网络中“掉线”了——但物理链路还是通的,路由却全没了。这种问题配置上根本看不出来,只有看路由表才会意识到严重性。

1.3 那次的故障现场:默认路由“野”了

我们当时的割接操作是先把两台边界路由器改成纯 L2,准备之后统一改 NET。改完 is-type 以后,L1 邻居全部 down,这是预期内的。但随后出现了一个意外:区域内其他 L1 路由器突然学到了一跳指向某台旧边界设备的默认路由,而且是优先路径。

原因就是 ATT 位。IS-IS 里,Level-1-2 路由器会在自己生成的 L1 LSP 里置位 ATT(attach)位,告诉区域内的 L1 路由器“我这个节点可以到达 L2 骨干”。L1 路由器收到带 ATT 的 LSP,就会生成一条默认路由指向这台 L1/L2 路由器。我们的旧边界设备虽然已经改成纯 L2,但它的某个接口上还残留着 L1 circuit type,导致它继续参与 L1 SPF、继续往 L1 LSDB 里发 LSP,ATT 位自然还在。于是 L1 区域的默认路由方向就没变,流量还往已经失去 L2 能力的旧边界跑。

这给了我们一个非常深刻的教训:区域迁移操作前,必须把设备上每个接口的 circuit type、每台设备的 is-type、NET 里的 Area ID、L1/L2 LSDB 里的残留 LSP,全部核对一遍。任何一个角落漏掉,都会变成隐形的路由环路或黑洞。

2. 迁移前必须理清的三个底层约束

区域迁移不是靠感觉操作,背后有三个硬约束必须提前确认:NET 的结构与多 NET 过渡、接口 circuit type 与设备 is-type 的配合、ATT 位对默认路由的影响。

2.1 NET 的组成与双 NET 平滑过渡

NET(Network Entity Title)是 IS-IS 节点的名字,格式类似 49.0001.0100.0000.0001.00。其中 49.0001 是 Area ID,0100.0000.0001 是 System ID,最后 00 是 SEL(通常为 00)。System ID 在一台设备上必须唯一,而且一台设备配置多个 NET 时,所有 NET 的 System ID 必须一致,只有 Area ID 可以不同。

这个“多 NET”机制就是区域迁移最有力的平滑工具。实际操作中,我建议不要直接删除旧 NET 再添加新 NET,而是先添加新 NET,让设备同时保留新旧两个身份一段时间。这样旧邻居还能通过旧 NET 维持部分邻接,新邻居通过新 NET 建立关系,LSDB 不会瞬间清空,路由表也不会发生剧烈震荡。

但是要注意:多 NET 不是让一台设备同时成为两个独立区域的“正常路由器”,它的作用是过渡。多个 Area ID 在同一个进程里共存,LSP 的生成和泛洪会变得复杂,尤其是一台设备同接口形成跨区域的 L1 邻接时,LSDB 维护开销不小。所以双 NET 过渡只能在割接窗口内使用,确认新区域稳定后立即删除旧 NET。

2.2 接口 circuit type 与设备 is-type 的配合

IS-IS 接口有三种 circuit type:Level-1、Level-2、Level-1-2。设备整体能力由 is-type 决定,接口 circuit type 决定了这个接口能建立哪一级邻居。区域迁移时,很多人只关注改 is-type,忽略了接口级别,结果出现一种典型问题:设备已经是纯 L2,但某些接口还是 Level-1-2,于是它继续接受 L1 LSP,继续参与 L1 SPF,看起来像“幽灵 L1 路由器”。

反过来也一样,比如一台设备要从 L1/L2 降级为纯 L1,如果骨干接口没有从 Level-2 改成 Level-1,那它和管理面已经隔离的 L2 邻居之间会不断 flap。IS-IS 邻居建立本身是很快的,但频繁的邻居状态变化会导致 LSP 序号快速递增、CSNP 频繁发送,影响整个域的稳定性。

所以迁移前,请把你设备上每一个 IS-IS 接口的 circuit type 列出来,对照一张表:接口名、当前类型、目标类型、连接的邻居类型、变更窗口。这张表比任何脚本都重要。

2.3 ATT 位与默认路由:看不见的路径变化

前文已经提到 ATT 位。这里再展开一下原理和排查方法。Level-1-2 路由器在 L1 LSP 中设置 ATT 位,表示“本节点可以到达 L2 骨干”。L1 路由器收到带 ATT 的 L1 LSP,就会生成一条到该节点的默认路由。如果区域内有多个 L1/L2 边界,L1 路由器会选择最近的(metric 最小的)一个作为默认出口。

区域迁移一定会改变 ATT 的分布:原先有 3 台 L1/L2 边界,合并后可能只剩 1 台;或者一台 L1/L2 降级为纯 L1,ATT 位消失。这时区域内所有 L1 路由器的默认路由指向都会变,影响所有去往区域外的流量。

检查方法很直接:查看 LSP 中的 ATT 位。在主流设备的 IS-IS 数据库视图里,L1 LSP 通常会显示 attach 标志。如果发现某些 L1/L2 边界路由器本应贡献 ATT,但 LSP 里没看到,或者相反——一台纯 L1 设备居然还在 LSP 里带 ATT,那一定是 circuit type 或 is-type 配置不一致,立即排查。

3. 区域迁移的标准操作流程:以 L2/L1 边界调整为例

下面给一套我实际用的操作流程,以“把两台 L1/L2 边界路由器中的一台降级为纯 L1,并把另一台保持为新的 L1/L2 边界”为例。同样适用于区域合并或重新分区,关键是步骤顺序不能乱。

3.1 迁移前基线采集与风险评估

操作前,至少要采集以下信息:

  • 每台设备的 is-type、每个 IS-IS 接口的 circuit type、NET 配置;
  • 当前邻居表:show isis neighbor,记录邻居 System ID、接口、状态、uptime;
  • 当前 LSDB:show isis database level-1和show isis database level-2,重点关注是否有残留 LSP;
  • 当前路由表:show ip route isis,记录外部前缀的下一跳和 metric;
  • 当前默认路由的产生源:找出 ATT 位贡献设备。

采集完成后,对每一项变更做风险评估。例如,把边界设备从 L1/L2 改为 L1,它的 L2 邻居数量是多少?这些邻居会不会因为边界减少而出现区域间路由中断?它的 L1 区域内有没有需要依赖它作为默认出口的节点?如果有,迁移后这些节点的默认出口会切到哪台设备?有没有备份路径?

我把这些整理成一张迁移前 CheckList,逐项打勾。宁可慢一点,也不能凭感觉。

3.2 过渡期双 NET 配置与邻居重建

关键操作步骤:

  1. 添加新 NET,保留旧 NET。例如设备原 NET 是 49.0001.0100.0000.0001.00,新区域是 49.0002,则在 IS-IS 进程下增加net 49.0002.0100.0000.0001.00。
  2. 把需要保留骨干功能的接口明确为 Level-2。如果这台设备目标是保留为 L1/L2 边界,骨干口保持 Level-2,接入口保持 Level-1。如果目标是降级为纯 L1,则需要先把骨干口从 Level-2 改为 Level-1,但这会导致旧 L2 邻居断开,要放在业务低峰。
  3. 调整 is-type。如果设备要从 L1/L2 降级为 L1,确认所有 L2 邻居都已经有替代路径后再改。
  4. 等待新邻居建立。观察新 Area 下的 L1 邻居是否 UP,LSDB 是否同步。
  5. 验证此前端到端路径已恢复后,再删除旧 NET。删除旧 NET 前,建议先在设备上备份配置并记录旧 NET 值。

这里有个容易犯的错:直接改 is-type 让设备变成纯 L1,却没有先添加新 NET。纯 L1 设备在 IS-IS 里无法和不同 Area ID 的设备建立 L1 邻居,如果它的新 NET 还没配,它跟谁都不亲,孤立无援。双 NET 的价值就在于让设备在新旧身份之间“脚踏两条船”,把切换风险降到最低。

3.3 验证清单与快速回退方案

迁移后验证,我按这个顺序来:

  1. 邻居表:show isis neighbor,Level-1 和 Level-2 邻居状态都应该是 UP,且邻居类型符合预期。
  2. LSDB:show isis database,确认旧区域 LSP 已经老化消失,新区域 LSP 数量正常。
  3. 默认路由:查看 L1 区域内设备的默认路由下一跳,确认指向新 L1/L2 边界,而不是已经降级的旧设备。
  4. 明细路由:抽查几条跨区域前缀的路由表项,确认下一跳和 metric 符合预期。
  5. 业务路径:对关键服务器地址做 traceroute,确认往返路径一致或至少符合网络设计。

一旦出现异常,我的回退策略是:不要试图在原配置上修修补补,直接把设备配置恢复为变更前备份,并立即检查邻居和路由。IS-IS 收敛速度很快,回退配置一般在一分钟内生效。前提是你变更前一定保存了完整配置,而且回退时不包含任何“临时调试”残留。

4. 路由汇总的两种方向和五个关键点

区域迁移做完以后,立即要处理的是路由汇总。IS-IS 默认不自动汇总(除部分厂商对由协议自动生成的路由有特殊处理外),区域间路由会以明细前缀的形式在 L2 骨干里传播。区域越大,L2 LSDB 里的前缀越多,SPF 计算和内存消耗越高。所以迁移后重新设计汇总点是刚需。

IS-IS 的路由汇总有两个方向:L1 到 L2、L2 到 L1。方向的差异决定了配置位置和路由行为。

4.1 L1 到 L2 汇总:summary-address 的落点

L1 到 L2 的汇总,配置在 L1/L2 边界路由器上。它描述的是:当这台路由器把 L1 区域内的路由注入 L2 时,把满足一定掩码范围的明细前缀聚合成一条前缀,只向 L2 通告这条汇总。

配置逻辑类似:

router isis 1 net 49.0001.0100.0000.0001.00 is-type level-1-2 summary-address 10.1.0.0 255.255.0.0 level-1

这个命令的意思:把区域内 10.1.0.0/16 范围内的 Level-1 路由汇总为一条 10.1.0.0/16,并向 Level-2 通告。level-1关键字限定了参与汇总的路由来自 Level-1。

注意一个细节:汇总命令不是“前缀越小越好”。如果你把 10.0.0.0/8 直接汇总,但区域内只有 10.1.0.0/16 和 10.2.0.0/16 两个段,中间大量地址实际上并不存在。其他区域发往 10.3.x.x 的流量会全部被吸引到这台边界,然后丢弃,形成黑洞。所以汇总边界必须与实际地址规划对齐。

4.2 L2 到 L1 汇总:路由泄漏与聚合的配合

默认情况下,L1 区域看不到区域外的明细路由,只有一条通过 ATT 位生成的默认路由指向最近的 L1/L2 边界。如果需要在 L1 内下发明细或汇总路由,必须显式配置路由泄漏(route leaking)。

路由泄漏的本质,是把 L2 的路由重新注入 L1 的 LSDB。在很多厂商实现里,需要先在 L1/L2 边界路由器上开启 Level-2 到 Level-1 的重分发,再通过 summary-address 对注入的路由做聚合。例如:

router isis 1 net 49.0001.0100.0000.0001.00 is-type level-1-2 redistribute isis level-2 into level-1 summary-address 172.16.0.0 255.255.0.0 level-2

这里level-2表示只对 Level-2 来源的路由做汇总,并把汇总结果注入 Level-1。

区域迁移后最容易踩的坑就在这里:旧边界设备上配置了 L2→L1 泄漏和汇总,但迁移后真正的出口已经挪到新边界设备上,旧设备的泄漏和汇总就成了“过期配置”。L1 区域内的设备通过旧边界学到的汇总路由,下一跳方向可能已经不通,或者需要绕一大圈才能到达目标网络。所以区域迁移后,必须同步清理和重新配置所有边界上的泄漏与汇总策略。

4.3 metric、tag 与抑制明细:汇总设计要点

汇总路由的 metric 怎么定?多数实现默认取区域明细路由中最大的 metric,也有实现取最小或可配置。无论默认如何,我建议都显式指定汇总路由的 metric,否则不同厂商设备混跑时,汇总路由的 cost 可能不一致,影响选路。

tag 是一个被低估的工具。你可以给不同区域的汇总路由打不同的 tag,然后在路由策略里基于 tag 做过滤和优先级控制。比如迁移过程中,旧区域路由保持 tag 100,新区域路由用 tag 200,策略里优先选 tag 200。这比单纯比前缀长度和 metric 要灵活得多。

抑制明细也要谨慎。有些厂商支持suppress或summary only之类的参数,让明细路由不注入 L2,只保留汇总路由。这在减少 L2 前缀数量上很有效,但也意味着如果汇总路由失效,L2 区域彻底失去到该区域的路径。我的建议是:在迁移期间不要抑制明细,等稳定后再开启,避免排查时找不到根因。

4.4 汇总路由的查询与验证

配置汇总后,要能在设备上看到汇总效果。通用的验证思路是:

  • 查看 IS-IS 进程下的汇总配置是否生效;
  • 查看 BGP/路由表里是否出现汇总前缀,下一跳是否是预期的边界设备;
  • 在各个 L2 路由器上查看汇总前缀的 metric;
  • 对明细前缀做 traceroute,确认流量路径经过了汇总点,而不是黑洞。

我通常还会在 L1 区域内部选一台路由器,查看它到外部两个不同目标网段的路径。如果其中一条明细路由是经过泄漏下发的,另一条是走默认路由的,能直观看出区域迁移后的选路是否符合预期。

5. 区域重建以后最容易踩的坑:黑洞、次优路径与 LSP 震荡

区域迁移与路由汇总的坑,我在实践中归纳为三类:黑洞、次优路径、LSP 震荡。每一类都值得单独说。

5.1 汇总黑洞:汇总前缀与明细路由脱节

黑洞的成因有两个。一是汇总半径过大,把不存在的地址段也聚合进来了;二是区域迁移后,明细路由已经不在这个边界上了,但汇总配置还在。第二种在迁移场景中更隐蔽。

举个例子:旧边界路由器 A 原来承载区域 X,配置了summary-address 10.1.0.0/16。迁移后区域 X 的出口改到了新边界路由器 B,A 上不再有区域 X 的明细路由。如果 A 的汇总配置没有删除,其他 L2 路由器可能仍然通过 L2 LSDB 学习到 10.1.0.0/16,下一跳指向 A。A 收到这些流量后,查本地路由表发现没有明细,直接丢弃。这时你去 ping 10.1.1.1,可能通,因为某些设备上默认路由还在;但如果你 ping 一个区域 X 里已经不存在的地址,它一样会被 A 吸引,形成黑洞口。

解决思路:汇总配置和明细路由必须绑定,只有当边界设备确实拥有对应明细时才允许通告汇总。迁移后把用不到的summary-address全部清掉,再在新边界上按新规划重新配置。

5.2 次优路径:泄漏之后聚合的位置不对

IS-IS 默认的 L1 设计是“区域内部最优,区域间走默认”。一旦做了路由泄漏,L1 区域内的路由器就会看到来自外部的前缀,并可能因为前缀匹配优先于默认路由,选择一条特定路径。如果泄漏点在多个边界上配置不一致,就会出现次优路径。

区域迁移会放大这个问题。原来边界 A 负责泄漏并汇总某个外部前缀,迁移后 A 的 L2 角色消失,但泄漏配置可能被保留;同时新边界 B 也配置了泄漏。L1 区域内的路由器对同一外部前缀可能看到两个来源,一个来自 A、一个来自 B。由于 L1 SPF 计算基于 metric,某些路由器会选择路径较短的 A,但 A 到 L2 骨干的路径已经没了或者绕远,实际转发性能很差。

这种问题用配置审查很难发现,必须结合路由表看下一跳。我排查时会在受影响的路由器上执行:

show ip route 172.16.0.0 255.255.0.0 show isis route 172.16.0.0 255.255.0.0

如果发现同一前缀有多个 IS-IS 来源,就逐个 traceroute 到源头,确认哪条路径是合理的,然后调整边界上的泄漏配置或汇总 metric,把次优路径压掉。

5.3 LSP 震荡与保护手段

区域迁移过程中,设备的 LSP 会反复更新,邻居也会反复 flap。在大型网络里,这种震荡可能波及整个 L2 域,导致 SPF 频繁重算。我见过一台边界设备因为 is-type 反复修改,LSP 序号在几分钟内从 0x00000001 跳到 0x00000012,周边设备的 CPU 直接拉满。

保护手段有两个。一是利用 IS-IS 的 overload bit(过载位),在区域迁移期间给边界设备设置 overload,避免其他路由器把中转流量引过来。overload 置位后,其他路由器仍然可以到达这台设备的直连路由,但不会把它作为中间跳。这样即使 LSP 反复更新,转发面也不会出现大面积黑洞。等迁移完成、验证通过后再清除 overload。

二是控制操作节奏。不要在同一台设备上连续多次修改配置,每改一步就等邻居稳定、LSDB 收敛,至少观察 1 到 2 分钟,再执行下一步。IS-IS 的 LSP 老化时间是 1200 秒,刷新间隔通常 900 秒,频繁的路由变化不会立刻导致旧 LSP 消失,但会推高 LSP 版本号。版本号飞涨的 LSP 是所有 IS-IS 网络工程师的噩梦。

5.4 一套简单的验证闭环

迁移完、汇总配完,我最后会跑一套闭环验证:

  1. 在 L1/L2 边界路由器上,检查所有 summary-address 对应的明细路由是否存在;
  2. 从中心 L2 路由器上,对每个汇总前缀做 ping 和 traceroute;
  3. 从 L1 区域内随机选几台路由器,连接到外部多个目标网段,确认路径方向和 metric;
  4. 采集 LSP 的序列号,观察一段时间内没有异常增长;
  5. 检查设备 CPU,确认 SPF 计算频率回到正常水平。

只有这五步全部通过,我才会把维护窗口关闭。

6. 几个值得长期保留的操作习惯

最后分享几个我一直在用的经验,不算多高深,但每次都能救命。

第一,IS-IS 区域迁移一定要提前保存 LSP dump。迁移前后的 LSDB 差异是排查一切问题的基础。没有基线,你连“哪条路由是新增的”“哪条路由是消失的”都说不清楚。

第二,配置汇总时,先配明细再配汇总,删除时反着来。也就是说,先确认明细路由已经在边界上,再添加 summary-address;删除时先删汇总配置,再动明细路由。这样可以避免中间态的黑洞窗口。

第三,不要把区域迁移和路由汇总放在同一个变更窗口内“顺手做掉”。它们之间有依赖,但各自的验证标准不同。合并成一个变更,出问题时你根本分不清是区域的问题还是汇总的问题。我通常先做区域迁移,验证业务通,再单独做汇总调整。

第四,多 NET 过渡虽然好用,但不是用来长期养着的。双 NET 状态超过一周,大概率会忘记清理,后面排障时你会被多重身份搞晕。定一个规矩:迁移窗口结束后 24 小时内删除旧 NET。

IS-IS 区域迁移这件事情,理论门槛不高,难的是把每个隐性机制都放在心里:Area ID 决定 L1 邻居关系,is-type 决定设备参与哪棵树,circuit type 决定接口邻居能力,ATT 位决定默认路由方向,泄漏和汇总决定区域间路径。这些机制单独看都很清楚,一旦在真实网络里交错起来,任何一个都会成为故障点。希望这篇整理能让你在下次动手时少踩几个坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询