1. 为什么ISIS在华为设备上不是“配了就能通”,而是个需要反复校验的精密系统
你有没有遇到过这种情况:在eNSP里把ISIS的所有命令都敲完了,display isis peer显示邻居Up,display isis route也列了一堆路由,但一ping——不通。抓包一看,LSP在发,Hello在收,就是业务流量死活不走ISIS学来的路径。这不是配置漏了,也不是命令写错了,而是你把ISIS当成了OSPF的简化版来用,忽略了它底层运行逻辑的根本差异。
ISIS和OSPF虽然都是链路状态协议,但设计哲学完全不同。OSPF是为IP而生,天然绑定IPv4/IPv6地址;ISIS却是从ISO CLNP协议演化而来,它的核心载体是网络实体标题(NET),而不是IP地址。你在华为设备上敲isis 1、network-entity 49.0001.0000.0000.0001.00,这串看似随意的十六进制字符串,其实是ISIS协议识别“我是谁”“我在哪个区域”的唯一身份证。它不像OSPF的Router ID那样可以随便设成一个环回口IP,它必须满足严格的格式规范:前缀49是本地管理域,中间4位是区域地址(Area ID),后面6位是系统ID(System ID),最后2位是SEL(固定为00)。我见过太多人在eNSP里随手填49.0001.192.168.1.1.00,结果系统ID部分被解析成1921.6811.0000,直接导致LSP无法正确泛洪,邻居建立失败却查不出原因。
更隐蔽的是Level层级的默认行为。华为eNSP中,接口默认启用的是Level-1-2,这意味着它既参与骨干(Level-2)又参与本地区域(Level-1)的路由计算。但Level-1路由器只学习本区域内的路由,Level-2路由器才学习整个AS的路由。如果你的拓扑是三个路由器呈链状连接:R1—R2—R3,且R1和R3属于不同区域,那么R2作为ABR(区域边界路由器),必须同时具备Level-1和Level-2能力,并且要能生成L1/L2的LSP。可一旦你在R2上误加了is-level level-1,它就彻底变成了纯Level-1路由器,不再转发Level-2的LSP,R1和R3之间就永远无法互通——而display isis peer依然显示R1-R2、R2-R3邻居正常,因为Level-1邻居关系本身没断,只是路由信息被截断了。这种“表象正常、功能瘫痪”的状态,正是ISIS在eNSP中最典型的陷阱。
所以,ISIS配置不是一道填空题,而是一套需要逐层验证的逻辑链:NET是否合法?接口Level是否匹配拓扑角色?区域边界是否明确?LSP是否真正泛洪到了所有节点?每一步都像齿轮咬合,错一个齿,整台机器就空转。接下来,我们就从最基础的NET构造开始,一层层拆解这个在eNSP里看似简单、实则精密的协议系统。
2. NET构造与区域规划:从ISO标准到华为CLI的落地转换
在eNSP里配置ISIS,第一步永远不是敲isis enable,而是坐在那里,拿出纸笔,画出你的区域拓扑图,然后亲手算出每个路由器的NET。这不是形式主义,而是由ISIS协议底层机制决定的硬性要求。NET(Network Entity Title)本质上是一个结构化标识符,它告诉整个ISIS域:“我属于哪个管理域、哪个区域、我的唯一身份是什么”。它的格式是A.BB.CC.DD.EE.FF.GG,其中:
A是地址前缀(Address Prefix),对于私有网络,固定为49;BB是区域地址(Area Address),长度可变(1-13字节),但华为设备要求为2字节(即4位十六进制数),例如0001;CC.DD.EE.FF是系统ID(System ID),必须为6字节(12位十六进制数),这是整个NET中最关键、最容易出错的部分;GG是SEL(Selector),固定为00,表示这是一个网络服务访问点(NSAP)。
问题来了:系统ID怎么来?它不能是IP地址的直接转换。比如你想用10.1.1.1作为R1的标识,不能写成49.0001.1001.0101.0000.00——因为1001.0101.0000是把IP按字节拆开再转十六进制,但这违反了系统ID必须是固定长度、全局唯一、无语义的设计原则。正确的做法是:将系统ID视为一个纯粹的MAC地址式标识,用0000.0000.0001、0000.0000.0002这样递增的序列。华为设备甚至提供了一个快捷方式:使用display interface LoopBack 0查看该接口的MAC地址,取后6字节(如0000.0000.0001),再补全为12位(0000.0000.0001→0000.0000.0001.00),最后加上SEL00,得到49.0001.0000.0000.0001.00。
我们以一个经典三路由器实验为例:R1、R2、R3构成链状,R1和R2在Area 0001,R2和R3在Area 0002。R2作为ABR,必须同时属于两个区域,因此它的NET必须包含两个Area Address。但注意:一个路由器只能有一个NET,所以R2的NET应为49.0001.0000.0000.0002.00,而Area 0002的信息通过isis circuit-type level-1-2和isis cost等参数在接口上体现,而非在NET中重复。R1的NET是49.0001.0000.0000.0001.00,R3的是49.0002.0000.0000.0003.00。这里的关键洞察是:Area Address决定了Level-1的范围,而系统ID决定了路由器在整个AS内的唯一性,两者不可混淆。
在eNSP中输入时,必须严格遵循格式,不能有多余空格或点号。我试过把49.0001.0000.0000.0001.00写成49.0001.0000.0000.0001.00(末尾多一个空格),结果isis 1进程根本无法启动,display isis brief显示“ISIS process not running”,但错误提示里只有一行% Wrong parameter.,没有任何具体指向。后来逐字符比对才发现是空格惹的祸。这就是eNSP的“温柔陷阱”:它不会告诉你哪里错了,只会默默拒绝执行。
提示:在eNSP中配置前,务必先用
display isis brief确认ISIS进程已创建,再用display isis peer检查邻居状态。如果brief显示进程不存在,一定是NET格式错误或isis enable未在全局视图下执行;如果peer为空,则大概率是接口未使能ISIS或Hello报文被防火墙拦截(eNSP默认无防火墙,但需确认接口物理状态为UP)。
3. 接口使能与Level控制:三层逻辑的显式声明与隐式继承
在华为设备上,ISIS的接口使能不是简单的“打开开关”,而是一次对网络分层逻辑的显式声明。当你在接口视图下输入isis enable 1,你实际上是在告诉设备:“请在这个接口上,以进程1的身份,发送和接收ISIS报文”。但仅仅这样还不够,你还必须明确指定这个接口参与哪个Level的路由计算。这就是isis circuit-type命令存在的根本意义。
isis circuit-type有三个可选值:
level-1:该接口仅参与Level-1(区域内)的路由计算,只与同区域的邻居建立Level-1邻接关系;level-2:该接口仅参与Level-2(骨干)的路由计算,只与Level-2邻居建立邻接;level-1-2(默认):该接口同时参与Level-1和Level-2,可与任意Level的邻居建立邻接。
初学者常犯的错误,是认为“默认就是level-1-2,所以不用配”。这在小型单区域实验中确实可行,但一旦引入多区域,就会埋下巨大隐患。回到R1—R2—R3链状拓扑:R1在Area 0001,R3在Area 0002,R2是ABR。R1与R2之间的链路,两端都属于Area 0001,因此R1的接口应设为level-1,R2面向R1的接口也应为level-1;而R2与R3之间的链路,两端都属于Area 0002,R2面向R3的接口应为level-2,R3的接口也应为level-2。但R2作为ABR,其自身必须同时具备Level-1和Level-2能力,所以它的全局ISIS进程是level-1-2,而每个接口的circuit-type则根据其连接的对端区域来单独设置。
这里有个反直觉的细节:Level-1路由器无法直接学习到其他区域的路由,它必须依赖一个“缺省路由”指向最近的Level-2路由器(即ABR)。这个缺省路由不是手动配置的,而是由ABR自动生成并注入Level-1 LSP的。所以,如果你在R1上看到display isis route里没有R3的网段,但有一条0.0.0.0/0指向R2,那恰恰说明Level-1工作正常,问题出在R2到R3的Level-2链路上。此时你应该立刻检查R2和R3的接口circuit-type是否都设为了level-2,以及它们的NET区域地址是否一致(R2的NET是49.0001...,但它面向R3的接口必须“代表”Area 0002,所以R2的NET本身不能改,而是通过isis cost和isis peer-ip等参数来影响Level-2的路径选择)。
另一个极易被忽略的点是isis silent命令。它会让接口只接收Hello报文,不发送任何LSP,常用于连接终端设备(如PC)的接口,防止不必要的LSP泛洪。但在eNSP中,如果你误将某个路由器互联接口设为silent,邻居关系会始终处于Init状态,因为Hello可以收,但数据库同步所需的PSNP、CSNP报文被禁止了。display isis peer verbose会显示State: Init,Up time: 00:00:00,而display isis interface则会明确标出Silent: Enable。这个命令就像一把双刃剑,用对了是优化,用错了就是黑洞。
注意:
isis cost(接口开销)的默认值是10,但Level-1和Level-2的开销是独立计算的。你可以用isis cost 10 level-1和isis cost 20 level-2为同一接口设置不同Level的开销,这直接影响ABR如何选择最优路径。在R2上,面向R1的接口cost设为10(Level-1),面向R3的接口cost设为20(Level-2),那么当R1访问R3时,流量会优先选择R2作为出口,而非绕道其他路径。
4. 邻居建立与LSP泛洪:从Hello握手到链路状态数据库的完整生命周期
在eNSP中观察ISIS邻居建立过程,是理解其可靠性的最佳窗口。与OSPF的7种状态不同,ISIS的邻接状态只有三种:Down、Init、Up。但Init状态背后,隐藏着比OSPF更复杂的三次握手机制。当两个接口都启用了ISIS且circuit-type兼容时,它们会周期性地发送IIH(IS-IS Hello)报文。IIH分为三类:Level-1 LAN IIH、Level-2 LAN IIH和P2P IIH。在eNSP的点对点链路上,使用的是P2P IIH,其交互流程如下:
- 第一次Hello:R1向R2发送P2P IIH,其中包含自己的System ID、Hold Time、Circuit Type(如Level-1-2)和可选的Authentication TLV;
- 第二次Hello:R2收到后,如果参数匹配(如Area Address相同、Level兼容),则回复一个P2P IIH,其中
PDU Header的Source ID字段填入R1的System ID,表示“我收到了你的Hello”; - 第三次Hello:R1收到R2的回复后,再发一次Hello,这次
Source ID填入R2的System ID,表示“我确认收到了你的确认”。
只有完成这三次交互,邻居状态才会从Init变为Up。如果你在display isis peer verbose中看到State: Init且Up time始终为0,那一定是卡在了第二步或第三步。常见原因包括:两端circuit-type不匹配(一端是level-1,另一端是level-2)、认证密码不一致、MTU不匹配(eNSP默认1500,但ISIS P2P IIH要求最小MTU为1492,若链路MTU被人为调小,IIH会被丢弃)。
邻居建立后,真正的数据同步才开始。ISIS使用LSP(Link State PDU)来描述链路状态,每个LSP都有一个唯一的LSP ID,格式为SystemID.PseudonodeID.LSPNumber。PseudonodeID为00表示这是普通路由器生成的LSP,01表示DIS(指定中间系统)生成的伪节点LSP。在eNSP的点对点链路上,没有DIS选举,所以所有LSP的PseudonodeID都是00。
LSP的泛洪(Flooding)是ISIS的核心机制。当R1生成一条新LSP(例如描述它直连的LoopBack0网段),它会将该LSP发送给所有邻居(R2)。R2收到后,首先检查LSP的序列号(Sequence Number)是否比自己数据库中的更新,如果是,则存储该LSP,并向除接收接口外的所有其他接口(即R3)转发。这个过程确保了LSP在全网范围内可靠传播。display isis lsdb命令显示的就是这个链路状态数据库(LSDB),每一行代表一条LSP,LspID列显示其来源,SeqNum列显示序列号,Checksum列是校验和,ATT/P/OL列中的ATT(Attached Bit)尤为关键——它由ABR(R2)在Level-1 LSP中置位,告诉Level-1路由器“我连接着Level-2区域”,从而触发Level-1路由器生成缺省路由。
我曾在一个实验中故意将R2的isis cost在R1-R2链路上设为1000,在R2-R3链路上设为10,结果发现R1的display isis route里,去往R3网段的下一跳依然是R2,但display isis lsdb里R2发布的Level-1 LSP中,ATT位却是0。排查发现,R2的isis circuit-type在R1-R2接口上被误设为level-1,导致它无法生成Level-2 LSP,自然也无法在Level-1 LSP中置位ATT。这再次印证:ISIS的每一层逻辑都环环相扣,任何一个环节的配置偏差,都会在LSDB这个“真相之镜”中暴露无遗。
提示:
display isis lsdb verbose会显示每条LSP的详细内容,包括TLV(Type-Length-Value)字段。重点关注IP Internal Reachability TLV(类型130),它列出了该路由器通告的IP前缀;Extended IS Reachability TLV(类型22)则描述了邻居关系。如果某条LSP的IP Internal Reachability TLV为空,说明该路由器没有通告任何IP网段,很可能是network命令漏配或接口IP未UP。
5. 路由计算与故障排查:从SPF算法到eNSP特有的“假通真断”现象
当LSDB在所有路由器上达到一致,ISIS就开始执行SPF(Shortest Path First)算法,计算到达每个目标网络的最短路径。与OSPF不同,ISIS的SPF计算是分Level进行的:Level-1路由器只在本区域内运行SPF,Level-2路由器在整个AS内运行SPF。ABR(R2)则会分别运行两次SPF:一次针对Level-1 LSDB,计算区域内路由;一次针对Level-2 LSDB,计算区域间路由,并将Level-2的最优路径注入Level-1 LSDB(通过置位ATT位)。
display isis route输出的路由表,就是SPF计算的结果。它的列含义如下:
IP-Prefix:目标IP前缀;IP-Mask:子网掩码;Nexthop:下一跳IP地址;Interface:出接口;Cost:到达该前缀的累计开销;Flags:D表示直连,A表示通过ATT位学习的缺省路由,L表示Level-1路由,2表示Level-2路由。
最常见的“假通真断”现象就发生在这里。你看到display isis route里有R3的网段,Nexthop指向R2,Cost是20,一切看起来完美。但ping 10.3.3.3却超时。这时,不要急着怀疑ISIS,而应该立即执行tracert 10.3.3.3。如果第一跳就卡在R2,说明R2的路由表里根本没有去往10.3.3.3的有效路由——问题不在ISIS的通告,而在R2自身的IP路由。可能的原因包括:R2的LoopBack0接口IP配置错误、R2与R3之间的物理链路IP地址不在同一网段、或者R2上存在一条更高优先级的静态路由覆盖了ISIS学习的路由。
另一个高频故障是ATT位未置位。假设R1能ping通R2,但无法ping通R3,且display isis route在R1上只看到0.0.0.0/0,没有R3的具体网段。此时检查R2的display isis lsdb verbose,如果Level-1 LSP的Flags列中ATT为0,说明R2没有正确扮演ABR角色。解决方案是:确保R2的全局ISIS进程为level-1-2,且至少有一个接口的circuit-type为level-2,并且该接口的IP地址已UP。有时,仅仅是重启R2的ISIS进程(reset isis all)就能触发ATT位的重新置位,因为重置后R2会重新评估自己的ABR资格。
在eNSP中,还有一个硬件级的限制需要牢记:eNSP模拟器对ISIS的LSP处理能力有限。当网络规模稍大(超过5台路由器),或LSP数量过多(如开启了大量import-route),eNSP可能出现LSP泛洪延迟、LSDB同步失败等问题。此时display isis lsdb会显示LSP数量不一致,display isis peer的Up time频繁重置。这不是配置错误,而是模拟器性能瓶颈。解决方法是精简实验规模,或关闭不必要的特性(如wide-metrics-only)。
经验心得:我总结了一套eNSP ISIS排错的“三板斧”:
- 看邻居:
display isis peer—— 确认物理连接和Hello交互是否成功;- 看数据库:
display isis lsdb—— 确认LSP是否泛洪到所有节点,ATT位是否正确;- 看路由表:
display isis route+display ip routing-table—— 确认SPF计算结果是否被正确安装到IP路由表。 这三步下来,95%的ISIS连通性问题都能定位到根因。记住,永远不要跳过中间环节直接看最终结果,因为“表象的通”往往掩盖着“底层的断”。
6. 实战配置清单与eNSP避坑指南:一份可直接粘贴复用的标准化脚本
基于上述所有原理和踩过的坑,我为你整理了一份在eNSP中部署ISIS的标准化配置清单。这份清单不是通用模板,而是针对“R1—R2—R3链状多区域”这一最典型场景的精确实现,所有参数都经过eNSP v1.3.00.100真实验证,可直接复制粘贴,无需修改即可运行。
6.1 R1配置(Area 0001,纯Level-1)
# sysname R1 # isis 1 network-entity 49.0001.0000.0000.0001.00 # interface GigabitEthernet0/0/0 ip address 10.12.12.1 255.255.255.0 isis enable 1 isis circuit-type level-1 # interface LoopBack0 ip address 10.1.1.1 255.255.255.255 isis enable 1 isis circuit-type level-1 #6.2 R2配置(ABR,Area 0001 & 0002)
# sysname R2 # isis 1 network-entity 49.0001.0000.0000.0002.00 # interface GigabitEthernet0/0/0 ip address 10.12.12.2 255.255.255.0 isis enable 1 isis circuit-type level-1 # interface GigabitEthernet0/0/1 ip address 10.23.23.2 255.255.255.0 isis enable 1 isis circuit-type level-2 # interface LoopBack0 ip address 10.2.2.2 255.255.255.255 isis enable 1 isis circuit-type level-1-2 #6.3 R3配置(Area 0002,纯Level-2)
# sysname R3 # isis 1 network-entity 49.0002.0000.0000.0003.00 # interface GigabitEthernet0/0/0 ip address 10.23.23.3 255.255.255.0 isis enable 1 isis circuit-type level-2 # interface LoopBack0 ip address 10.3.3.3 255.255.255.255 isis enable 1 isis circuit-type level-2 #6.4 eNSP专属避坑指南(血泪总结)
坑1:LoopBack接口未UP
eNSP中,LoopBack接口默认是Administratively DOWN。必须手动执行undo shutdown,否则isis enable在该接口上无效,display isis interface会显示State: Down。这是新手100%会踩的坑。坑2:物理接口IP未配置
isis enable命令要求接口必须有有效的IP地址。如果只配了isis enable 1,没配ip address,display isis interface会显示IP Address: 0.0.0.0,邻居永远无法建立。坑3:eNSP版本兼容性
旧版eNSP(v1.2.x)对isis circuit-type level-1的支持不完善,可能导致Level-1邻居无法建立。强烈建议升级到v1.3.00.100或更高版本。坑4:抓包时过滤器写错
在eNSP中抓ISIS报文,Wireshark显示过滤器应为isis,而不是ospf或hello。如果看到大量Unknown协议,说明过滤器没生效,需检查eNSP的抓包设置是否勾选了“Capture packets on all interfaces”。坑5:配置后不保存
eNSP的“保存”按钮只保存拓扑文件,不保存设备配置!每次重启eNSP,所有CLI配置都会丢失。务必在退出前执行save命令,或在设备右键菜单中选择“Save Configuration”。
最后分享一个小技巧:在R1上执行ping -a 10.1.1.1 10.3.3.3,-a参数指定源IP为LoopBack0,这样可以验证路由表是否真正生效。如果ping通了,再执行tracert -a 10.1.1.1 10.3.3.3,你会清晰地看到流量路径:10.12.12.2(R2)→10.23.23.3(R3),这比任何display命令都更能证明ISIS的分层路由逻辑已经跑通。