1. 为什么现在还要折腾IS-IS路由控制说实话IS-IS这个协议在很多数通人眼里属于“老古董”了。它比OSPF还早几年定型平时在企业网里见得少网上教程也远不如OSPF多。但真到运营商骨干网、大型数据中心内部互联、电力/交通这类专用网络里IS-IS反而是绝对主力。某运营商项目里核心层跑的就是IS-IS整整两年没重启过稳得一匹。我最初接触IS-IS也是赶鸭子上架——项目要求核心设备必须跑IS-IS我对着文档啃了几天又搭实验环境反复验证才把路由控制的逻辑理顺。这个协议表面上配置命令没几条但真要实现精细的路由控制坑一个接一个。今天这篇文章就把我实际做过的华为设备IS-IS路由控制实验完整拆开来讲包括设计思路、配置过程、踩坑记录全部是能直接复现的东西。如果你正准备考数通高阶认证或者要在现网里部署IS-IS这篇文章应该能帮你省下不少瞎折腾的时间。2. 项目拆解IS-IS路由控制到底在控制什么2.1 先弄懂IS-IS的工作模型IS-IS和OSPF一样都是链路状态协议核心思路都是“全网同步链路状态数据库然后各自算路”。但两者的组织方式差别很大。OSPF按区域划分区域之间靠ABR连接IS-IS则按Level划分——Level-1相当于OSPF的普通区域Level-2相当于骨干区域一台路由器可以同时属于Level-1和Level-2。这个差异带来一个关键影响OSPF的区域边界在路由器上ABR而IS-IS的区域边界在链路上。换句话说一条IS-IS链路只能属于一个区域路由器可以横跨多个区域但接口必须明确归属。设计区域拓扑时这一点必须想清楚。华为设备上启用IS-IS很简单但默认行为往往不是你想要的行为。举个例子默认情况下路由器会同时建立Level-1和Level-2邻居也就意味着所有路由都会在两层里传递。小规模实验无所谓但生产环境里这会造成路由表膨胀、收敛变慢。所以“路由控制”的第一步就是严格控制Level的启用范围。2.2 路由控制的四个维度做IS-IS路由控制实验核心是掌握四个控制维度Level控制决定路由在哪个层级传递L1只关心本区域L2关心整个路由域。合理规划L1/L2的边界能把路由震荡限制在局部。开销控制IS-IS的cost是接口级的可以通过修改接口开销影响路由选路。比起OSPF在接口上配costIS-IS还需要注意开销类型是narrow还是wide这直接决定cost的取值范围。路由渗透控制L1路由器默认看不到L2的路由需要L1/L2路由器做路由渗透leaking。渗透策略做得好既能保证连通性又能避免L1路由器承载过多路由。路由过滤与优先级通过filter-policy、路由优先级调整等手段控制路由的发布和接收。这部分和OSPF的route-policy思路类似但命令细节不同。我在实验里把这四个维度全部过了两遍接下来就按实际实验顺序一一说明。3. 实验环境搭建与基础配置3.1 拓扑设计与地址规划实验我用了三台华为AR系列路由器型号不同也没关系只要版本支持IS-IS就行。拓扑是最经典的三角链R1和R2互联网段10.1.12.0/24R2和R3互联网段10.1.23.0/24R1和R3之间没有直连强制让流量经过R2方便观察路由控制和选路行为区域规划采用了双区域设计R1在区域49.0001R3在区域49.0002R2同时连接两个区域作为L1/L2路由器。这样设计的好处是能完整演示L1/L2路由交互、路由渗透这些关键点。Loopback地址按设备编号规划R1用1.1.1.1/32R2用2.2.2.2/32R3用3.3.3.3/32。所有Loopback都宣告进IS-IS方便测试路由可达性。3.2 NET地址配置与注意事项IS-IS配置里最容易翻车的就是NET地址。NET是NSAP地址的一种格式是一长串十六进制数比如49.0001.0010.0100.1001.00。很多人第一次配置时被这个格式搞晕其实拆开看就三部分区域地址49.0001前面的49是私有地址段标识后面是区域号系统ID0010.0100.1001总共6字节用来唯一标识设备选择符00固定值表示这是NET地址华为设备上配置NET地址的命令如下isis 1 is-name R1 network-entity 49.0001.0010.0100.1001.00这里有个实操技巧系统ID建议用设备Loopback地址的IPv4形式改写。比如R1的Loopback是1.1.1.1写成系统ID就是0010.0100.1001每段补足4位。这样一眼就能看出NET对应的设备排障时不用翻文档。配置完NET后在接口下启用IS-IS即可interface GigabitEthernet0/0/0 isis enable 1 isis circuit-level level-2注意看这条circuit-level配置。R1在区域49.0001内但它连接的是R2而R2同时是L1/L2。如果不限制接口的circuit-levelR1和R2之间会同时建立L1和L2邻居这在小实验里无所谓但在真实场景中会导致L1区域内的路由和L2的路由混在一起。所以我在R1的接口上设了level-2让R1只参与L2路由R2作为L1/L2边界专门处理渗透。3.3 配置区域间互联与Level规划R2的配置是重点。它一头连着R1区域49.0001另一头连着R3区域49.0002属于典型的区域间路由器。isis 1 is-name R2 network-entity 49.0001.0020.0200.2002.00R2的NET区域地址我用了49.0001但这不是必须的。L1/L2路由器可以属于某个区域也可以配置多个区域地址。为了让R2既能和R1建立L2邻居又能和R3建立L2邻居我在两个接口上都启用了IS-IS。关键点在接口下的level配置interface GigabitEthernet0/0/0 isis enable 1 isis circuit-level level-2 interface GigabitEthernet0/0/1 isis enable 1 isis circuit-level level-2R3同样配置为纯L2设备interface GigabitEthernet0/0/0 isis enable 1 isis circuit-level level-2 isis 1 is-name R3 network-entity 49.0002.0030.0300.3003.00这样配置起来整个IS-IS路由域就全部跑在L2上L1仅保留默认创建。这是最稳妥的实验起点先把L2的底层邻居关系打通再逐步加入L1和渗透控制。如果你一上来就搞L1/L2混合排错时容易顾此失彼。3.4 验证基础连通性配置完成后先做基础验证。display isis lsdb查看链路状态数据库确认三台设备的LSP都已同步。LSPLink State PDU是IS-IS的链路状态通告类似于OSPF的LSA。正常情况下三台设备的LSP会在每台设备上都看到。display isis route查看IS-IS路由表。如果基础配置没问题R1应该能看到2.2.2.2/32和3.3.3.3/32的路由R3同理。这里我遇到一个经典问题R1能看到R3的Loopback路由但ping不通。排查后发现是接口下忘了配circuit-level限制R1和R2之间建立了L1邻居而R1的L1路由表里没有R3的L2路由。这就是Level控制没做好的典型症状。配置里加上circuit-level level-2后问题立刻消失。4. 核心实验一L1/L2路由交互与路由渗透4.1 为什么L1区域看不到L2路由IS-IS的设计原则是L1路由器只需要知道本区域的路由访问区域外一律走默认路由指向最近的L1/L2边界路由器。这个设计初衷是为了减少L1设备的路由表规模但代价是可能产生次优路径。具体来说R1如果只是L1路由器它不会收到R3所在区域49.0002的任何L2路由只有一条默认路由指向R2。如果R1要访问R3的Loopback流量会从R2转发R2再查自己的L2路由表找到R3。这个路径是合理的因为R1和R3不在同一个区域默认路由是最优解。但是有一个场景必须做路由渗透当R1所在区域内部存在多个L1/L2边界路由器时L1路由器只靠默认路由可能无法选择最优出口。我在实验里模拟了一个更复杂的场景在R1区域里再加一台边界路由器R4这样R1就有两个默认路由出口如果不做渗透R1只能随机选一个出口可能绕路。4.2 路由渗透配置实战华为设备上做L1到L2的路由渗透很简单只需要在L1/L2路由器上配置import-isis level-1 into level-2反之亦然。但家用实验环境里我们一般只需要L2到L1的渗透。在R2上配置isis 1 import-isis level-2 into level-1这条命令让R2把L2的路由包括R3的Loopback、其他区域的明细路由注入到L1。配置完成后R1的IS-IS路由表立刻多出几条L1路由display isis route IS-IS routing table ---------------- (All Routes) Tag 1 : Level-1 Destination Cost Type NextHop Interface 10.1.12.0/24 10 IP 10.1.12.2 GE0/0/0 3.3.3.3/32 20 IP 10.1.12.2 GE0/0/0 2.2.2.2/32 10 IP 10.1.12.2 GE0/0/0注意看3.3.3.3/32这条下一跳指向R2开销是20。这个开销是R1到R2的接口开销10加上R2到R3的接口开销10正好是路径累加。如果R2把L2的路由渗透到L1时做成默认路由那么R1去R3的路径开销会变成10到R210R2到R320仍然正确。但如果不做渗透R1只有默认路由指向R2开销也是10最终路径一样。差别在于渗透后R1能看到明细路由可以做更精细的选路策略。4.3 渗透策略的隐患与优化渗透配置看起来简单真放到生产环境里要小心一个问题L2路由全部灌进L1可能导致L1设备路由表爆炸。我在另一个实验里模拟了3000条L2路由渗透到L1R1的路由表直接多了3000条IS-IS路由内存占用明显上涨。解决办法是用route-policy过滤渗透的路由。比如只让R1学习到R3的Loopback路由route-policy leak-permit permit node 10 if-match ip-prefix local-loopback isis 1 import-isis level-2 into level-1 route-policy leak-permitip-prefix local-loopback里只匹配3.3.3.3/32。这样R1的路由表就只包含必要的外部路由而不是全量。这个思路在现网规划里非常实用路由渗透不是全量放行而是只放行“值得让L1知道”的明细路由。我实际做项目时L1区域边界设备通常只渗透两类路由本区域需要访问的关键业务网段需要做MPLS TE或其他特殊控制的明细路由其余都靠默认路由兜底。5. 核心实验二IS-IS开销控制与选路策略5.1 开销类型的选择narrow还是wideIS-IS的开销有两种类型narrow窄和wide宽。narrow模式下开销范围是1到63wide模式下是1到16777215。华为设备默认兼容两种模式narrow兼容但默认接口开销都是10。如果使用narrow以后想精确控制路径开销时会很吃力因为63的上限太低。所以我在实验环境里直接切到了wide模式isis 1 cost-style wide这个命令会改变IS-IS开销的编码方式。注意如果网络里既有老设备只支持narrow又有新设备支持wide会出现路由无法互通的情况。实际规划时要统一所有设备的cost-style或者在边界设备上做兼容模式。这个问题在现网中经常遇到升级老设备时尤其要小心。切换wide后接口开销可以配到很大。我在R1连接R2的接口上把cost从10改成50interface GigabitEthernet0/0/0 isis cost 50这样R1去往R3的路径开销变为50R1-R210R2-R360。如果我同时在R1和R3之间加了直连链路并把那条链路的cost设成20R1去R3就会优选新链路因为202040小于60。5.2 选路实验人为制造次优路径为了让选路实验更有说服力我调整了拓扑R1和R3之间加一根直连链路同时保留R1-R2-R3的路径。在R1上执行display isis route你会发现IS-IS选择了直连路径。这就引出IS-IS选路的一个重要原则IS-IS只算链路状态不会像BGP那样考虑AS路径长度。只要开销小它就走那条路。这个特性在MPLS网络中尤其关键因为MPLS的隧道选路往往依赖IS-IS的开销值。但这里有个大坑IS-IS默认只会把L1的明细路由和L2的明细路由分开算路当同一个目的地址同时存在于L1和L2时L1路由优先。我在R1上看到3.3.3.3/32同时有L1路由从R2渗透来开销50和L2路由从直连来开销20最终路由表里选择的是L2那条。如果两条都是L2则比较开销。所以做选路控制时不仅要关注开销大小还要搞清楚路由来自哪个Level。很多现网故障就是“L1路由优先”这个规则导致流量走了设计之外的老路。5.3 自动开销与手动开销的配合华为设备支持auto-cost可以让接口根据带宽自动计算开销。默认参考带宽是100M也就是说100M接口开销为10GE接口开销为1。如果全局开了auto-cost手动在接口下配isis cost就不生效。这个细节我一开始没注意导致想在某个接口上调大cost时怎么都不生效。后来才发现原因是R2上全局配置了auto-cost接口手动cost被忽略。解决办法是isis 1 auto-cost bandwidth-reference 10000带宽参考值改成10000Mbps后GE接口开销自动变成110GE接口开销也会按比例计算。但生产环境中我一般更倾向手动cost因为自动cost的结果不够直观也不方便统一规划路径。只在链路带宽差异极大的场景下auto-cost才能体现优势。6. 核心实验三路由过滤与路由优先级控制6.1 filter-policy控制路由发布与接收IS-IS的过滤有两个层面发布过滤和接收过滤。发布过滤在源设备上做控制哪些路由进IS-IS接收过滤在入方向做控制哪些路由进路由表。我实验里在R1上配了接收过滤只允许R3的Loopback进入路由表acl number 2000 rule 5 permit source 3.3.3.3 0 isis 1 filter-policy 2000 import这里用的是ACL也可以直接用ip-prefix。如果我想控制R1不能收到10.1.23.0/24这条路由只要ACL里不匹配就行。这个实验做完R1的路由表里就没有10.1.23.0/24了但IS-IS邻接关系不受影响。注意一点filter-policy import只影响本机路由表的加入不影响LSP的同步和转发。也就是说R1仍然知道R3的拓扑只是不把它放进路由表。这点和OSPF的filter-policy作用类似千万别和“过滤LSP”混淆。如果要彻底阻止某条路由在IS-IS域内传播需要在源头做export过滤比如在R3上配置acl number 2001 rule 5 deny source 4.4.4.4 0 rule 10 permit source 0.0.0.0 0 isis 1 filter-policy 2001 export这样R3的4.4.4.0/24这条路由根本不会进入IS-IS的LSP全网都看不到。这两个过滤方向配合使用就能实现“源头不发布入方向不接收”的完整控制。6.2 路由优先级调整华为设备上IS-IS路由的默认优先级是15OSPF是10静态路由是60直连路由是0。如果同一目的地址同时从IS-IS和OSPF学到OSPF的优先级更高会优先被选入路由表。但在某些特殊场景我们希望IS-IS的路由优先于OSPF这时可以调整IS-IS的优先级isis 1 preference 20这样IS-IS的优先级变成20比OSPF低选路时OSPF优先。如果想让IS-IS的优先级高于OSPF就设成5。注意这个命令只影响IS-IS路由的优先级不影响其他协议。我在实验里模拟了双协议场景R2同时跑IS-IS和OSPF同一网段从两个协议学到。默认情况下OSPF优先流量走OSPF路径。我通过preference把IS-IS优先级调高后流量切到了IS-IS路径。这个控制在双协议迁移阶段非常实用可以平滑切换流量优先级避免割接瞬间的中断。6.3 路由聚合的隐藏价值华为设备IS-IS支持在区域边界做路由聚合把多个明细路由聚合成一条通告出去。我在R2上配置isis 1 summary 10.1.0.0 255.255.0.0 level-2这样R2会把区域内的10.1.12.0/24、10.1.13.0/24等明细聚合为10.1.0.0/16通告给L2。聚合后L2的路由表只剩一条外区域设备的路由规模大大缩小。但聚合有个副作用如果明细路由出现震荡聚合路由不会跟着震荡这在某些场景是优点但也掩盖了真实的故障。我在现网遇到过聚合后的黑洞明细路由已经没了聚合路由还在通告流量发过去直接丢弃。所以做聚合一定要配合合理的明细路由监控手段不能只看聚合路由“还在”。7. 常见问题与排错经验速查7.1 邻居状态无法Up的问题IS-IS的邻居建立过程比OSPF简单没有DR/BDR选举那种复杂机制只有三次握手。所以邻居起不来问题基本集中在几个点NET地址区域ID不一致导致区域不匹配接口下没启用isis enablecircuit-level配置不匹配比如一端是level-1另一端是level-2-onlyMTU不一致导致LSP过大无法传输排查时我用得最多的命令是display isis interface display isis peerdisplay isis interface可以查看接口的level状态和开销display isis peer查看邻居状态。如果peer状态显示Up说明二层链路和IS-IS握手正常。如果一直卡在Initializing多半是区域ID或circuit-level不匹配。7.2 路由表里没有对方路由邻居虽然Up了但路由不通这种问题我遇到很多次。先看display isis route确认IS-IS路由表里有没有目标路由。如果有但全局路由表里没有就是filter-policy import误伤。如果IS-IS路由表里也没有那就要看LSP里是否携带了这条路由。还有一个容易被忽略的点L1区域的路由不会自动出现在L2区域。如果R1和R2是L1邻居R3在L2R2没做import-isis level-1 into level-2那么R3永远看不到R1的Loopback。反过来L2的路由也没法进L1除非配置渗透。这个问题我在实验里复现过很多新手不知道IS-IS默认不做区域间路由泄露所以认为“邻居起来了路由自然通”结果被坑。7.3 路由震荡和DIS选举IS-IS没有DR/BDR但L1/L2广播链路上有DIS指定中间系统。DIS负责在广播网络上周期发送CSNPComplete Sequence Number PDU相当于OSPF的DR。DIS选举优先级默认64数值越大越优先。我在实验里用命令调整了DIS优先级interface GigabitEthernet0/0/0 isis dis-priority 100DIS发生变化会导致广播链路上所有路由器重新同步LSDB引起短暂路由震荡。现网中如果发现IS-IS周期性震荡排查思路之一就是看DIS是否频繁切换。通过把核心设备设为高优先级可以稳定DIS角色。7.4 开销类型不匹配导致的路由不通这个问题在混合组网中最棘手。一台设备配了cost-style wide另一台还是narrow两者虽然能建立邻居但LSP里携带的开销信息可能会被错误解析。华为设备默认是narrow-compatible既发送narrow也接收narrow和wide。但如果一端强制wide另一端兼容模式还是可能出现路由不通。遇到这类问题我一般先把所有设备统一成同一种cost-style再逐一恢复。这不是偷懒而是排障时减少变量。统一后再排查其他问题就简单多了。8. 实验心得与生产环境落地建议整个实验做下来我对IS-IS的控制逻辑有了更深的体会。相比OSPFIS-IS的配置命令确实更朴素但它把路由控制的主动权交到了网络工程师手里。无论是Level规划、路由渗透、开销调整还是过滤策略每一步都直接影响全网的行为。生产环境里我见过不少网络工程师因为不熟悉IS-IS遇到问题只会重启进程或者把Level全部放开这其实是把控制权扔掉了。IS-IS的精细控制并不难关键是要理解L1/L2的特性和默认行为。我最后再分享几个实打实的建议区域规划先行IS-IS的区域边界在链路上一旦部署后期调整成本极高设计阶段就要把Level边界画清楚用wide cost-style除非有老设备兼容性约束否则别用narrow路由渗透要配合route-policy做过滤别全量灌入L1否则路由表迟早爆炸做过滤时一定要区分import和export方向很多“路由丢了”的故障其实是过滤方向配反了遇到路由选路不符合预期先看是L1还是L2路由再看开销别一上来就改全局配置实验做完后我又把整套配置套到了一个模拟的双区域汇聚组网里验证了路由渗透、过滤和选路控制稳定跑了两周没有出现异常。这套方法论放到真实项目中基本可以直接平移只是接口数量更多、链路复杂一些核心思路完全一致。希望这篇记录能帮你少踩几个坑尤其是在搞懂“为什么”之后再动手配置远比背命令有收获。