我第一次正经做IS-IS区域迁移和路由汇总,是在一个把两个城域网合并成一张骨干网的改造项目里。当时接入侧一个区域用了老的地址规划,核心侧已经换了新的区域地址,两边的IS-IS进程虽然都通,但LSP互相看不到,路由表里全是缺胳膊少腿的条目。折腾到半夜才想明白,根子不在BGP也不在接口,而在IS-IS的区域边界和路由汇总方式上。从那以后我就意识到,IS-IS这块内容看着不起眼,真正动手做迁移和汇总时,处处都是细节,少想一步就会断网。
这篇文章就把我这些年碰过的IS-IS区域迁移与路由汇总问题整个捋一遍。适合正在做网络割接、区域合并、路由优化的朋友参考,也适合刚接触IS-IS的读者当一份实操笔记看。先说明白,IS-IS不是OSPF那种“区域=接口集合”的模型,L1、L2、NET地址、区域地址这些概念如果没完全吃透,迁移时一定会踩坑。
1. 区域迁移与路由汇总的基本前提
很多人一上来就问“IS-IS区域迁移怎么配”,但忽略了IS-IS的区域模型和OSPF很不一样。IS-IS里没有Area 0、Area 1这样的编号,区域是靠NET地址中的Area Address字段来识别的,路由器的级别又分成Level-1、Level-2和Level-1-2。区域迁移说白了就是修改NET地址里的Area Address部分,但牵一发动全身,邻接关系、路由泄漏、默认路由、汇总边界全都跟着变。
1.1 先搞清Area、Level和NET的对应关系
IS-IS路由器的身份由NET(Network Entity Title)决定,常见格式是49.0001.1920.0010.1001.00。其中49是私网地址标识,0001就是区域地址,中间的1920.0010.1001是System ID,最后两位是SEL,固定为00。两台路由器能不能建立Level-1邻接,看的就是Area Address是否一致;Level-2邻接不依赖区域地址,只要都在骨干区域就能建。
这就引出了Level角色的意义。Level-1路由器相当于OSPF里的非骨干区域内部路由器,只维护本区域的LSDB,默认通过最近一台Level-1-2路由器产生的默认路由访问区域外。Level-2路由器维护整个L2骨干的LSDB,负责跨区域路由。Level-1-2路由器则是区域出口,同时参与L1和L2的SPF计算,并负责在L1和L2之间传递必要信息。
区域迁移要改的,就是NET里的Area Address。比如要把一台路由器从49.0001迁到49.0002,本质上是让它的L1邻接关系从“和49.0001区域的路由器建”变成“和49.0002区域的路由器建”。但L2部分几乎不受影响,只要链路两端都是L2或L1-2,L2邻接照常起来。这个特性是IS-IS区域迁移比OSPF改区域配置要温和的根本原因。
1.2 哪些场景会逼着你做区域迁移和路由汇总
第一个典型场景是网络合并。两套独立运营的网络要互通,原来分别是49.0001和49.0002,合并后不可能让核心区域继续裂成两块,否则L2路由明细全要互相传递,LSDB和路由表大到不可接受。这时候不是给边界加个汇总就完事,最好直接把区域边界重新划齐。
第二个场景是地址重新规划。老区域地址和新地址规划不匹配,或者为了后续扩展空出连续地址段,需要把一批设备整体挪到新区域。这类迁移往往伴随着路由汇总一起做,因为新区域地址通常规划成有规律的聚合块,方便在L1/L2边界汇总。
第三个场景是故障域收敛和性能调优。某个区域的L1路由器太多,LSDB同步频繁,SPF计算开销大,把一部分设备拆到新区域,同时在边界做汇总,能显著压缩LSP洪泛范围和路由表规模。
路由汇总解决的是另一个维度的痛点。IS-IS的L1区域内部跑明细路由没问题,但到了L2骨干,如果每个区域都把几千条明细通告上来,骨干网所有路由器都得维护全量明细。通过Level-1到Level-2的汇总,可以把一个区域的一组连续前缀聚合成一条或几条路由,骨干只需要维护聚合路由,收敛速度和设备性能都能得到明显改善。
1.3 迁移前必须画清楚的三张图
动手之前别急着敲命令,至少先把现状摸清楚。第一张图是区域拓扑图,标清楚每台路由器当前的Area Address、System ID、Level类型,以及哪些设备是L1/L2边界。第二张图是地址规划图,把每个区域的接口地址段、Loopback地址、以及未来要作为汇总块的连续网段标出来。第三张图是邻接关系图,哪些链路是广播网,哪些是点对点,DIS在哪台设备上,这些在迁移后都可能变化。
尤其是System ID,它在一个IS-IS域内必须全局唯一。很多迁移事故不是区域地址改错,而是两台设备的System ID设计重复,改完NET后LSP被互相覆盖,路由表直接混乱。迁移前把System ID规划好,用设备编号、上联位置等信息设计一套易读的编码规则,比事后排查重复省太多时间。
另一个要提前确认的点是每条链路的网络类型。IS-IS在广播链路上会选举DIS,迁移后如果DIS变了,整个链路所有路由器的LSP序列号、伪节点相关状态都会重建,同步流量会瞬间放大。如果链路是P2P类型,这方面的影响就小很多。所以迁移窗口尽量挑在业务低峰,而且要按照“先加新区域地址,再删旧区域地址”的节奏走,避免全网同时重启IS-IS进程。
2. 区域迁移的实操步骤与平滑过渡方案
IS-IS的NET配置支持在同一台设备上最多配置多个区域地址,这是平滑迁移的关键。理论上可以让设备同时属于旧区域和新区域一段时间,让邻接关系逐步切换,而不是在所有链路同时断开。
2.1 用多区域地址过渡替代“改完重启”
最保险的区域迁移方式是“加法优先”。假设现在全网都是49.0001,目标是把A、B两台L1路由器迁到49.0002。先在A、B的IS-IS进程下新增一个NET:49.0002.1920.0010.1001.00,保留原来的49.0001。这样A、B和旧区域设备的L1邻接仍然存在,同时它们开始尝试与配置了49.0002区域地址的设备建立L1邻接。
这里有个细节:多NET配置下,路由器会通告多个区域地址,邻居是否建L1邻接取决于两端是否有交集。如果链路对端还是49.0001,L1邻接还能维持;如果对端已经迁到49.0002,则两端交集49.0002,L1邻接照建。这样就能做到一台一台、一条链路一条链路地切换,而不是全网同时断。
等到所有涉及设备和链路都加上了49.0002,再进入“减法阶段”,逐个删除旧的49.0001 NET。每删除一个区域地址,旧区域的L1邻接会随之断开,LSP重新洪泛。整个过程可以精细控制。需要额外留意的是,多区域地址阶段,L1路由器会认为本区域同时有多个区域地址,某些实现在计算L1到L2的默认路由和汇总时行为不完全一样,最好在过渡窗口内多观察路由表,确认无异常后再删旧地址。
2.2 单台设备修改NET的完整配置过程
单台设备的迁移过程并不复杂,但顺序有讲究。拿一台L1/L2路由器为例,实际操作我一般按下面这个顺序来。
第一步,准备好新NET地址。System ID保持原值不动,只改Area Address段。比如原来System ID是1920.0010.1001,新区域是49.0002,那么新NET就是49.0002.1920.0010.1001.00。System ID如果不小心改了,邻居会把这台设备当成全新路由器,所有LSP要全量重传。
第二步,进入IS-IS配置视图,执行类似下面这样的配置:
router isis 1 net 49.0001.1920.0010.1001.00 net 49.0002.1920.0010.1001.00某些设备上net命令可以多次执行来增加区域地址。加入新地址后,不需要重启进程,邻接关系按上面说的逻辑自然变化。
第三步,观察邻接状态和LSDB。用show命令确认新区域方向的L1邻接已经建立,LSP同步完成,再准备删除旧地址。典型验证命令是:
show isis neighbors show isis database重点看老区域方向的L1邻居是否还在、新区域方向的L1邻居是否出现、LSP中通告的区域地址是否同时包含49.0001和49.0002。
第四步,删除旧NET:
no net 49.0001.1920.0010.1001.00删除后旧区域邻接断开,路由重新收敛。此时在设备上再执行show isis route,确认所有通过旧区域学到的路由已经切换到新路径,或者通过默认路由指向新的L1/L2边界。
这里要记住一点:虽然IS-IS支持动态增删NET,但并不是所有设备在修改NET后都能完美保持邻居状态。我遇到过部分老版本软件,删除旧NET后邻接会卡在Init状态,必须手动clear isis或者重启进程。所以迁移窗口内要准备好中断操作的时间预算,不能假设“动态修改=永远不断流”。
2.3 迁移期间邻接、DIS和路由收敛的变化
区域迁移不只是改一个数字,它牵扯到整个广播域内的DIS重选和伪节点更新。如果一条广播链路上原来DIS是A设备,迁移后A的区域地址变了,LSP重新生成,DIS可能会重新选举到B设备,导致该链路上所有设备重新同步LSP,瞬时网络流量呈倍数上涨。P2P链路没有DIS,影响要小得多。
另一个容易被忽视的是ATT位。L1/L2路由器在Level-1 LSP里设置ATT位,向L1区域宣告“我这里有出口”。当区域边界移动后,ATT位置可能改变,L1路由器算出来的默认路由下一跳可能指向另一台L1/L2路由器。如果这台设备在迁移后没有及时通告新LSP,L1区域可能出现一段时间的“无默认路由”状态。
所以在实际割接时,我会先迁移L1/L2边界设备,让新区域的出口先就位,再迁移纯L1设备。迁移一台L1/L2路由器,确认它在L1区域里已经通告了ATT位,并且L2侧已经能看到新区域路由后,再动下一台。如果反着迁移,纯L1设备会出现“旧出口已消失、新出口还没起来”的尴尬窗口。
3. 路由汇总的设计与配置
路由汇总是区域迁移最好的搭档。尤其是把区域边界重新划分后,原来的明细路由如果想直接扔到L2骨干,整个网络的路由表会爆炸。IS-IS汇总分几个方向,对应的配置位置和含义完全不同。
3.1 IS-IS汇总的三种方向
第一种是Level-1到Level-2的汇总,在L1/L2边界路由器上做。它把本区域L1学到的明细路由聚合后通告进L2骨干。这样骨干网看到的是一个区域的聚合前缀,而不是几十上百条明细。
第二种是Level-2到Level-1的汇总。场景通常是L1路由器需要访问外部区域,但L1不允许保留大量外部明细路由。L1/L2路由器把来自L2的组播或外部路由汇总后,以明细或默认路由的形式下发给L1。注意,IS-IS的L1路由器默认通过ATT位产生的默认路由访问区域外,不会拿到L2明细路由。如果业务需要L1看到部分外部明细,需要开启路由泄漏,此时汇总要结合泄漏规则一起做,否则泄漏进来的还是明细。
第三种是在L2区域内做汇总。如果整个网络本身就是平坦的L2区域,边界不涉及L1/L2,也可以直接对某些连续前缀做聚合,减小L2 LSDB中的IP前缀数量和SPF计算量。
这三种方向里,第一种最常用,也是区域合并时最优先要做的。第二种要谨慎,因为把外部路由汇总后泄漏进L1,可能让L1设备选择次优路径。第三种适用于纯L2骨干场景,配置相对直接。
3.2 边界汇总配置示例
以一台L1/L2路由器为例,假设本区域现在有10.1.0.0/24、10.1.1.0/24、10.1.2.0/24三条明细,需要汇总成10.1.0.0/16通告到L2。IS-IS进程下配置如下:
router isis 1 summary-address 10.1.0.0 255.255.0.0 level-1-2level-1-2表示这条汇总既影响L1到L2的通告,也影响L2到L1的通告。如果只想在L1到L2方向生效,就写level-1;只想在L2到L1方向生效,就写level-2。汇总地址可以配多个,但要保证掩码比明细路由的掩码短,否则不会产生聚合效果。
配置后,边界路由器会抑制更具体的路由向外通告,同时生成一条聚合路由。验证方式直接看对端设备路由表:
show isis route show ip route如果对端L2路由器看到的明细条目仍然很多,说明汇总没有生效。常见原因是汇总块内部至少有一条路由没有进入IS-IS路由表,或者配置的汇总前缀与实际明细之间还有间隙。还有一点,汇总命令只在IS-IS进程内生效,不会影响直连接口路由和引入的外部静态路由。如果要汇总重发布进来的外部路由,得看协议实现是否支持。
3.3 汇总掩码怎么定才不产生黑洞和次优路径
汇总最怕的是“盲汇总”。你汇了一条10.0.0.0/8,但内部实际只有10.1.0.0/16这一段有路径,其他段全是空。流量到了汇总点,要么被转发到空接口,要么在设备上找不到明细而丢包。所以汇总前必须确认聚合块内的所有地址空间都有真实的转发路径。
举个例子。两个区域合并后,A区域地址是10.1.0.0/16,B区域地址是10.2.0.0/16。如果只汇总成10.0.0.0/8,那么10.3.0.0这段没有对应区域,流量进来就是黑洞。正确做法是分成两条汇总:10.1.0.0/16和10.2.0.0/16,或者10.0.0.0/9。千万别贪图一条汇总好看,把一个不存在的网段也聚进来。
另一个问题是最长掩码优先带来的次优路径。IS-IS和IP路由一样,收到汇总路由和明细路由并存时,明细优先。如果某个区域汇总后,外部同时还能通过其他方式学到更具体的路由,会出现流量绕路。迁移和汇总完成后,要对比全网路由表,确认所有更优的明细路径都在预期位置。
路由黑洞还有一层原因是汇总后没有黑洞路由兜底。某些实现中,summary-address会自动生成一条指向Null0的聚合路由,防止环路,但不是所有实现都默认这样做。如果设备不支持自动黑洞路由,需要在IP路由表手动配置一条指向Null0的汇总黑洞路由,否则当明细路由全部失效时,聚合路由可能造成环路。
3.4 汇总后的验证与回退操作
验证汇总生效不能只看边界路由器本身,要在远离汇总点的设备上确认。一般我会在L2核心和另一个L1区域各选一台路由器,分别看它们收到的前缀数量。核心设备看到的应该是聚合后的条目,而不是一堆明细。还要确认聚合路由的下一跳是L1/L2边界路由器,而不是某个普通L1路由器。
如果发现汇总结果不符合预期,回退也简单:删掉summary-address命令即可,明细路由会在下一个LSP周期恢复通告。不过要注意,删除汇总后,LSP会重新生成,对端设备立刻开始处理大量新前缀,短时间内CPU和内存占用会上升。所以回退动作尽量在业务低峰做。
汇总和区域迁移经常一起操作,我个人的建议是先做迁移,等全网所有区域都在新拓扑下稳定运行,再逐台加汇总。迁移过程中加汇总会让问题叠加,比如某个区域的地址还没有完全切换到新NET,但汇总已经把这些地址聚成了一个大块,流量直接指向了错误的边界,排查起来非常痛苦。先迁移后汇总,每一步验证清楚,才是稳妥的节奏。
4. 区域迁移与汇总的高频故障速查
这部分是实战里踩过最多的坑。我把它整理成一张速查风格的经验清单,方便各位直接对照。
4.1 改完NET后邻接无法建立
这是区域迁移第一天最常遇到的问题。改了新NET后,L1邻接一直Init,L2也起不来。排查顺序我固定这么走。先看两端System ID和区域地址是否匹配,用show isis neighbors看错误状态。再查认证配置,如果IS-IS配置了hello认证、LSP认证,区域地址变化后所有LSP都会重新生成,认证密钥不匹配会把邻居直接卡死。
还有一个容易忽略的原因是链路两端的Level类型不匹配。一端是Level-1,一端是Level-1-2,但中间区域地址交集为空,L1邻接就建不起来;而L2邻接又因为对端没有使能Level-2而失败。最常见的现象是:一台设备改了NET但忘了改is-type,保持level-1,对端新区域已经是level-1-2,于是两边只能建L1邻接,L2路由全部缺失。
4.2 汇总后路由出现黑洞,但又ping不通黑洞地址
这个现象很经典。边界路由器汇总后,核心路由表出现了一条完美的大网段汇总路由,但业务访问该网段内某些地址时丢包,日志里没有ICMP不可达,ping黑洞地址也通。问题往往出在摘要路由的下一跳是某个已经失效的边界设备。
IS-IS虽然会随着拓扑变化重新计算SPF,但如果区域内有多个L1/L2边界,汇总路由可能同时从多个边界泄漏进L2,形成等价路由。其中一个边界的明细路径已经断裂,但聚合路由还存在,流量就可能被负载分担到已经不可达的边界上。解决思路是检查所有L1/L2边界的汇总配置是否一致,让聚合路由只能由确定存活的边界通告;必要时调整度量值,保证汇总路由下一跳收敛到正确设备。
另外,summary-address如果带了tag或者没有匹配到任何明细时不会生效,某些实现会静默不生成汇总。遇到这种情况,先在边界路由器上执行show isis route确认明细路由确实在IS-IS路由表里,再确认汇总命令没有被其他的策略路由或filter覆盖。
4.3 迁移后L1区域默认路由漂移
迁移前L1区域的默认路由指向边界路由器A,迁移后突然指向了边界路由器B,但B到外部区域的路径质量更差。这是ATT位和LSP洪泛时序导致的。区域边界移动后,每台L1/L2路由器都会在自己的L1 LSP中重新设置ATT位,L1路由器根据收到的所有ATT位置重新计算默认路由,选择最近的Level-1-2路由器。
如果不想让默认路由漂移,可以对汇总和默认路由做策略控制,比如在某些边界设备上关闭ATT位置,让L1区域只有一个出口;或者在L1/L2边界配置inter-route leaking和汇总时,通过调整metric来优先选择特定出口。这个动作必须在迁移前设计好,迁移后再临时改策略,邻居之间的LSP重新同步窗口内默认路由会消失几秒钟。
4.4 System ID冲突与LSP分片问题
区域迁移中最隐蔽的坑是不同区域的设备提前规划了相同的System ID。合并前两套网络互不感知,各用各的System ID,看起来没事;合并后系统ID冲突,LSP会被错误地认为是同一台路由器发出的,LSDB里出现大量重复校验和,路由表乱成一片。
排查方法很简单,在网络里任意一台路由器上show isis database,看是否有相同System ID但不同片段编号的LSP。正常情况一台路由器只有一个System ID,它的LSP片段编号从00开始递增。如果两个完全不同的设备System ID一致,会在各自片段中出现内容冲突。
LSP分片问题主要发生在汇总和迁移触发了大量路由变更时。IS-IS单条LSP有容量上限,超限后需要分片扩展。如果网络本身没有配置分片扩展,而迁移后某个区域的路由明细猛增,LSP可能无法承载全部TLV,导致部分路由没有通告出去。迁移和汇总完成后,记得检查每个区域的LSP分片数量,必要时调整分片扩展配置。
5. 最后一次踩坑后的经验沉淀
区域迁移这件事,看着就是改个NET地址,实际做起来牵涉到LSP洪泛范围、DIS重选、ATT位置、汇总边界、认证等等一堆东西。我自己经历过的两次割接,一次顺利得让我以为IS-IS迁移很简单,另一次把整个核心网的IS-IS进程全重启了。差别就只在于迁移顺序和是否在迁移前做了汇总设计。
现在我做任何IS-IS区域调整,都会先拉一遍全网IS-IS邻居关系,把L1/L2边界、DIS、System ID全列出来,然后按“先边界后L1、先新增后删除”的顺序操作。每动一台设备,至少等两个LSP刷新周期,确认邻接稳定、路由表无异常,再继续下一台。路由汇总一定放在区域迁移全部结束、网络拓扑稳定之后,并严格控制汇总块内部的空路由。
还要补一句经验:IS-IS的排错思路和OSPF不同,别一上来就查OSPF那样的area配置。IS-IS不看你接口属于哪个区域,只看NET里的区域地址是否匹配、LSP是否洪泛到正确的设备。把这个模型刻在脑子里,迁移和汇总就成功了一大半。