资讯动态

IS-IS实验入门:从Hello报文到LSDB同步的实操解析

发布时间:2026/10/27 4:30:07 来源:尧图企业网站定制
1. 项目概述这不是教科书里的IS-IS而是实验室里能ping通、能抓到包、能改参数的真实协议实验“2. IS-IS 基础实验”这个标题看起来平平无奇像是某本网络工程师认证教材第二章的小节编号。但如果你真把它当成“照着书敲几行命令就完事”的练习十有八九会在第一次查看LSDB时卡住在邻居状态从Init卡在2-Way时反复刷新show isis neighbor在路由表里找不到那条本该由LSP泛洪出来的前缀——然后默默关掉GNS3点开视频平台搜“IS-IS为什么起不来”。我带过不少刚接触链路状态协议的学员他们最大的误区就是把IS-IS当成OSPF的“换皮版”来学都是LSA/LSP、都有区域划分、都用SPF算路由……可一旦动手配置连最基础的system-id怎么填、NET地址为什么必须以00结尾、Level-1和Level-2路由器之间到底谁发Hello、谁发LSP全乱套。这组实验的核心价值从来不是“学会配置IS-IS”而是亲手拆解一个真实运行在网络设备底层的、不依赖IP层的链路状态协议是如何自举、同步、收敛的。它解决的是“协议栈黑盒”问题当你在路由器上敲下isis enable背后发生了什么Hello报文长什么样LSP如何分片CSNP和PSNP怎么协同保证数据库同步这些不是理论题是Wireshark里能逐字节看到的二进制流。适合三类人直接抄作业一是备考CCIE/HCIE的考生需要把协议细节抠到比特位二是企业网运维人员手头正有一台老款华为NE40E或思科ASR9K要割接IS-IS三是高校网络课程设计者需要一套不依赖云平台、能在本地EVE-NG或GNS3跑通的最小可行实验拓扑。我这次用的是一台物理机VMware Workstation跑EVE-NG社区版底层镜像为Cisco IOSv 15.6(2)T所有配置和抓包结果均来自实测环境没有一处是“理论上应该如此”。2. 实验整体设计与思路拆解为什么必须从单区域、单链路、无认证开始2.1 拒绝“一步到位”的陷阱先让两台路由器互相认识再谈路由计算很多教程一上来就画个三区域拓扑配Level-1-2路由器加MD5认证最后发现邻居起不来就开始怀疑镜像版本、怀疑内存分配、怀疑虚拟化兼容性。这完全违背了排错的基本逻辑——协议栈的每一层都必须验证其独立可达性。IS-IS的启动流程是严格分阶段的物理层up → 数据链路层LLC/SNAP封装正常 → Hello报文双向收发成功 → 邻居状态机迁移 → LSP交换 → LSDB同步 → SPF计算 → 路由注入。其中Hello阶段失败后续所有步骤都是空中楼阁。所以我设计的第一组实验只包含两台路由器R1和R2直连一条以太网链路不配置任何区域划分默认Level-2不启用任何认证甚至关闭所有无关服务如CDP、LLDP。目标极其明确在R1上执行show isis neighbor看到R2的状态是UP在R2上执行同样命令看到R1的状态是UP用Wireshark在链路上捕获到Type: L1 Hello和L2 Hello报文。这个阶段不关心路由表有没有条目不关心LSP内容只验证“邻居发现”这一最基础能力是否成立。实测下来这个最小闭环能在5分钟内完成且99%的初学者都能一次成功。一旦这步卡住问题一定出在system-id格式、NET地址拼写、接口ISIS使能顺序这三个地方而不是协议本身。2.2 为什么坚持用Cisco IOSv而非FRR或Quagga当前开源路由栈如FRRouting对IS-IS的支持已相当成熟但它的调试信息过于“干净”——show isis database输出的是结构化JSONdebug isis events打印的是高级别事件摘要。而真实设备厂商的IOS/XR/NX-OS其debug输出是按协议状态机逐帧打印的比如debug isis adj-packets会告诉你“Received IIH from 49.0001.0000.0000.0002.00 on GigabitEthernet0/1, level 2, holding time 27”。这种颗粒度是理解协议行为的关键。更重要的是企业现网设备90%以上仍是Cisco、华为、Juniper的商用系统它们的IS-IS实现细节如LSP刷新定时器默认值、CSNP重传机制、伪节点LSP生成规则与RFC标准存在细微差异。用FRR做实验就像用模拟驾驶器练车——能学会踩油门刹车但永远不知道真实雨天高速上ESP介入的微妙延迟。所以本实验所有命令、输出、抓包分析全部基于Cisco IOSv 15.6(2)T确保你学到的每一个debug开关、每一条show命令的字段含义都能直接迁移到生产环境。2.3 拓扑设计的底层逻辑用“单链路直连”暴露协议本质有人会问为什么不用环回口建邻居为什么不用点对点子网因为以太网多路访问链路MA才是IS-IS最典型、也最容易暴露问题的场景。在MA网络中IS-IS必须选举DISDesignated Intermediate System而DIS的选举规则优先级MAC地址、DIS发送CSNP的时机、非DIS路由器如何通过PSNP请求缺失LSP——这些机制在点对点链路上根本不存在。如果一开始就用loopback建邻居你永远看不到DIS相关的debug日志也理解不了为什么CSNP里会有“Pseudonode ID”字段。本实验采用真实以太网接口直连GigabitEthernet0/0强制触发DIS选举即使只有两台路由器这样在show isis interface输出中你会看到“Circuit Type: level-2, Circuit ID: R1.01”这样的关键信息而“Circuit ID”后缀的“.01”正是DIS选举产生的伪节点标识符。这个细节是区分“会配”和“真懂”的第一道分水岭。3. 核心细节解析与实操要点system-id、NET、区域划分三个概念如何咬合3.1 system-id不是IP地址是全局唯一的“身份证号”新手最容易栽跟头的地方就是把system-id当成IP地址来记。比如看到示例里写“49.0001.0000.0000.0001.00”就以为前面的“49”是区域ID“0001”是系统号。这是彻头彻尾的误解。system-id是一个6字节48位的二进制标识符与IP地址没有任何关系它的唯一作用是在整个IS-IS域内唯一标识一台中间系统路由器。在Cisco IOS中它被格式化为12个十六进制字符每两个字符一组用点号分隔即“XX.XX.XX.XX.XX.XX”。那么“49.0001.0000.0000.0001.00”这个值是怎么来的我们来拆解“49”是Area Address区域地址的前缀它属于CLNS地址族不是IP子网。IS-IS最初是为CLNPConnectionless Network Protocol设计的CLNS地址结构为Area Address System ID N-selector。其中Area Address长度可变1-13字节但最常见的是1字节如“49”。后面的“0001.0000.0000.0001”才是真正的System ID共6字节12个十六进制字符必须全局唯一。最后的“.00”是N-selectorNSAP Selector固定为“00”表示这是一个网络服务接入点用于标识上层协议此处为IS-IS。所以当你在R1上配置router isis然后执行net 49.0001.0000.0000.0001.00你实际上是在告诉路由器“我的CLNS地址是49.0001.0000.0000.0001.00其中system-id是0001.0000.0000.0001”。这个system-id会被封装在所有IS-IS PDUProtocol Data Unit的Header中是邻居识别你的唯一依据。如果R2的system-id也配成0001.0000.0000.0001两台路由器会互相认为对方是自己导致邻居状态机陷入死循环。我试过故意配错结果在debug isis adj-packets里看到“Duplicate system ID detected, dropping IIH from 49.0001.0000.0000.0001.00”。这个错误提示比任何文档都更直观地告诉你system-id的不可重复性。3.2 NET地址区域地址、system-id、N-selector的三位一体绑定NETNetwork Entity Title是IS-IS中一个极易混淆的概念。很多人以为它是个独立的地址其实它只是CLNS地址的一种特例——当N-selector为“00”时该CLNS地址就被称为NET。它的结构严格遵循Area Address.System ID.N-selector。其中Area Address可以是1字节如49、2字节如47.0001或更长但必须与同区域内的所有路由器保持一致。跨区域通信时Area Address不同是允许的但Level-2骨干必须能互通。System ID6字节全局唯一如前所述。N-selector固定为00。关键点在于一台路由器可以配置多个NET但所有NET的System ID部分必须完全相同。这是协议强制要求。例如R1可以同时配置net 49.0001.0000.0000.0001.00 net 49.0002.0000.0000.0001.00这两个NET共享同一个system-id0000.0000.0001只是Area Address不同0001 vs 0002。这在多区域部署中很常见一台Level-1-2路由器需要在多个Area中宣告自己因此要配置多个NET每个对应一个Area。但在本基础实验中我们只用一个NET且Area Address统一为“49”确保简单纯粹。配置时务必注意NET地址中的点号是分隔符不是小数点不能写成“49.1.0.0.0.1.00”这是非法格式必须是“49.0001.0000.0000.0001.00”这样的1222格式12位system-id2位area2位n-selector。3.3 区域划分的本质Level-1是“小区局域网”Level-2是“城市主干网”IS-IS的区域模型常被类比为OSPF但二者有根本区别。OSPF的Area 0是强制骨干所有非骨干区域必须与之直连而IS-IS的Level-2骨干是自动形成的——只要两台路由器都启用了Level-2能力它们之间就能建立Level-2邻接无论物理位置。Level-1路由器则只能和同一Area内的其他Level-1或Level-1-2路由器建立邻接并且Level-1路由器的路由表里永远不会出现其他Area的明细路由只会有一条指向最近Level-1-2路由器的默认路由0.0.0.0/0。在本实验中我们先只启用Level-2默认模式此时R1和R2都是纯Level-2路由器它们之间的邻接类型是“L2”LSDB里会同步整个Level-2域的拓扑。当你执行show isis database时看到的LSP ID形如“R1.00-00”其中“.00”表示这是普通LSP非伪节点而“R1.01-00”则是DIS生成的伪节点LSP。这个“-00”后缀是LSP分片标识主LSP为00后续分片依次为01、02……理解这一点才能看懂为什么有时show isis database会列出十几个LSP条目——不是路由器坏了是某个大LSP被分片传输了。等Level-2稳定后我们再升级R1为Level-1-2R2保持Level-2这时R1会同时维护Level-1和Level-2两套LSDB而R2的LSDB里只会有Level-2的条目。这种分离式数据库设计是IS-IS支持超大规模网络如运营商骨干网的核心优势也是它比OSPF更难入门的原因——你得同时管理两套独立的拓扑视图。4. 实操过程与核心环节实现从零开始一步步构建可验证的IS-IS邻居4.1 环境准备与初始配置5分钟搭建最小可行拓扑首先确认你的EVE-NG或GNS3环境已就绪。我使用的拓扑极其简单两台Cisco IOSv 15.6(2)T路由器R1和R2通过一个Cloud节点代表以太网交换机互联接口均为GigabitEthernet0/0。启动两台设备后进入特权模式执行以下初始化命令以R1为例R1# configure terminal R1(config)# hostname R1 R1(config)# no ip domain-lookup R1(config)# line console 0 R1(config-line)# logging synchronous R1(config-line)# exec-timeout 0 0 R1(config-line)# exit R1(config)# interface GigabitEthernet0/0 R1(config-if)# ip address 192.168.12.1 255.255.255.0 R1(config-if)# no shutdown R1(config-if)# exit R1(config)# end R1# write memory提示这里给接口配IP地址纯粹是为了方便后续用ping测试三层连通性IS-IS协议本身不依赖IP地址工作。即使你不配IP只要数据链路层upIS-IS Hello报文依然能正常收发。接下来是IS-IS的核心配置。注意顺序必须先创建IS-IS进程再在接口下启用最后才配置NET。顺序颠倒会导致配置不生效。R1# configure terminal R1(config)# router isis R1(config-router)# net 49.0001.0000.0000.0001.00 R1(config-router)# is-type level-2-only R1(config-router)# exit R1(config)# interface GigabitEthernet0/0 R1(config-if)# ip router isis R1(config-if)# isis circuit-type level-2-only R1(config-if)# exit R1(config)# end R1# write memory对R2执行完全对称的配置仅修改hostname、IP地址和NETR2# configure terminal R2(config)# hostname R2 R2(config)# router isis R2(config-router)# net 49.0001.0000.0000.0002.00 # 注意system-id末尾是0002 R2(config-router)# is-type level-2-only R2(config-router)# exit R2(config)# interface GigabitEthernet0/0 R2(config-if)# ip address 192.168.12.2 255.255.255.0 R2(config-if)# ip router isis R2(config-if)# isis circuit-type level-2-only R2(config-if)# exit R2(config)# end R2# write memory注意isis circuit-type level-2-only这条命令至关重要。它强制接口只发送Level-2 Hello报文避免在单区域实验中因默认双Level模式导致的邻居状态混乱。很多初学者跳过这步结果在show isis neighbor里看到状态在Init和Up之间反复横跳就是因为Level-1 Hello和Level-2 Hello在同一个链路上竞争DIS选举。4.2 验证邻居建立从show命令到Wireshark抓包的完整证据链配置完成后不要急着看路由表。第一步验证邻居是否真正建立。在R1上执行R1# show isis neighbor System Id Type Interface IP Address State Holdtime Circuit Id R2 L2 Gi0/0 192.168.12.2 UP 23 R2.01看到State为UPCircuit Id为R2.01说明邻居已成功建立。此时切换到R2执行同样命令应看到R1的状态也是UP。如果任一端显示INIT或DOWN请立即检查物理链路是否upshow interface Gi0/0两端的NET地址Area部分是否一致都是49两端的system-id是否不同0001 vs 0002接口下是否执行了ip router isis和isis circuit-type下一步用Wireshark抓包验证协议行为。在EVE-NG中右键Cloud节点选择“Capture”启动抓包。过滤条件设为isis你应该能看到源源不断的IS-IS报文。重点观察两类IIHIS-IS Hello报文在Packet Details面板展开IS-IS Header找到“PDU Type”字段应为“Level 2 LAN IIH”。展开“Circuit Type”确认为“Level 2 only”。在“Source ID”字段看到的就是你的system-id0000.0000.0001。这是最直接的证据你的路由器确实在按Level-2模式发送Hello。LSPLink State PDU报文稍等片刻默认LSP刷新周期为15分钟但初始泛洪很快你会看到LSP报文。展开后找到“LSP ID”字段应为“R1.00-00”其中“R1”是system-id前缀“.00”是LSP编号“-00”是分片标识。点击该报文右键“Follow - IS-IS Stream”你能看到完整的LSP内容包括自己的接口IP地址192.168.12.1、metric值默认10、以及一个关键字段“ATT bit”Attached bit目前为0表示这不是Level-1-2路由器。实操心得Wireshark的IS-IS解码插件有时会显示乱码这是因为Cisco IOSv的IS-IS PDU使用了私有TLVType-Length-Value扩展。不必惊慌只要能看到PDU Type、Source ID、LSP ID这些核心字段就足以验证协议运行。真正的深度分析留到后续LSP内容修改实验再进行。4.3 LSDB同步与路由注入从链路状态到IP路由的转化过程邻居UP之后LSP会自动泛洪。在R1上执行R1# show isis database IS-IS Level-2 Link State Database: LSPID LSP Seq Num LSP Checksum LSP Holdtime ATT/P/OL R1.00-00 * 0x00000008 0x1B2D 1199 0/0/0 R2.00-00 0x00000007 0x2A3C 1198 0/0/0星号*表示这是本机生成的LSP。现在关键问题来了这些LSP里包含了什么信息如何变成路由表里的条目执行show isis database detail R1.00-00你会看到LSPID: R1.00-00 Sequence Number: 0x00000008 Checksum: 0x1B2D Holdtime: 1199 ATT/P/OL: 0/0/0 IS Neighbor: R2.00 IPv4 Internal Reachability: 192.168.12.0/24 Metric: 10看到了吗LSP里明确宣告了“192.168.12.0/24”这个前缀Metric为10。这就是IS-IS将链路状态转化为可达性信息的方式每个路由器在自己的LSP中宣告自己直连的IP子网。当R2收到R1的LSP它会把“192.168.12.0/24”加入自己的LSDB然后运行SPF算法计算出到达该网络的下一跳是R1。最终这条路由被注入IP路由表R2# show ip route isis 192.168.12.0/24 [115/10] via 192.168.12.1, 00:05:23, GigabitEthernet0/0[115/10]中的115是IS-IS的管理距离Administrative Distance10是metric。这个过程完全自动化无需手动network命令——这正是链路状态协议与距离矢量协议如RIP的根本区别。你可以尝试在R1上关闭Gi0/0接口几秒后R2的show isis database里R1的LSP会消失Age字段归零show ip route isis里对应的路由也会立即撤出。这种毫秒级的收敛速度是IS-IS在运营商网络中不可替代的原因。4.4 进阶实验Level-1与Level-2的混合部署与路由泄露当Level-2邻居稳定后我们升级实验复杂度。将R1改为Level-1-2路由器R2保持Level-2模拟一个小型企业网Level-1连接到城域骨干网Level-2的场景。在R1上修改配置R1# configure terminal R1(config)# router isis R1(config-router)# is-type level-1-2 R1(config-router)# exit R1(config)# interface GigabitEthernet0/0 R1(config-if)# isis circuit-type level-1-2 R1(config-if)# exit R1(config)# end R1# write memory此时R1会同时建立Level-1和Level-2两种邻接。在R1上执行show isis neighbor你会看到两行R2 L2 Gi0/0 192.168.12.2 UP 25 R2.01 R2 L1 Gi0/0 192.168.12.2 UP 25 R2.01但R2上只有一行L2邻接因为它配置的是level-2-only。现在关键问题出现R1的Level-1 LSDB里会有R2的路由吗执行show isis database level-1你会发现只有R1自己的LSPR1.00-00没有R2的。因为Level-1路由器默认不学习其他Area的路由只有一条默认路由。而R1作为Level-1-2会自动将Level-2的路由“泄露”Leak到Level-1但默认是关闭的。要开启需在R1上配置R1(config)# router isis R1(config-router)# redistribute isis level-2 into level-1 R1(config-router)# exit执行后再查R1的Level-1 LSDB会看到R2的LSPR2.00-00出现了且其ATT bit被置为1Attached bit 1表示该路由器连接到Level-2骨干。此时R1的Level-1区域内所有路由器都会收到一条指向R1的默认路由从而能访问Level-2网络。这个ATT bit的设置是IS-IS自动路由泄露的触发器不需要手动配置default-information originate这是它比OSPF更智能的地方。5. 常见问题与排查技巧实录那些官方文档不会写的“踩坑现场”5.1 问题速查表邻居起不来90%的原因在这里现象可能原因排查命令解决方案show isis neighbor显示状态为INIT两端NET的Area Address不一致show runsection isis状态在UP和DOWN间反复跳动接口未启用isis circuit-type导致Level-1/Level-2 Hello冲突show isis interface明确配置isis circuit-type level-2-onlyshow isis neighbor无任何输出物理链路down或接口未执行ip router isisshow interface Gi0/0show run interface Gi0/0检查cable连接确认ip router isis已配置LSDB为空无LSPISIS进程未配置NET或NET格式错误如少一位0show isis configuration用net 49.0001.0000.0000.0001.00严格1222格式路由表无IS-IS路由但LSDB正常接口IP地址未配置或ip router isis未在正确接口下执行show ip route connectedshow run interface Gi0/0确保接口有IP地址且ip router isis在该接口下注意show isis configuration是一个被严重低估的命令。它会汇总显示当前ISIS进程的所有关键参数NET地址、is-type、metric style、hello interval等。当配置看似正确却无效时先执行这个命令比一行行翻show run快得多。5.2 一个真实的“幽灵故障”MAC地址冲突引发的DIS选举失败有一次我在同一台物理机上克隆了多个IOSv镜像所有克隆体的MAC地址都相同VMware默认行为。结果在四台路由器组成的以太网中DIS选举始终失败CSNP无法正常发送LSDB同步中断。debug日志里反复出现“DIS election failed, duplicate MAC detected”。这个问题在文档里根本找不到因为RFC没规定MAC地址必须唯一——但厂商实现时DIS的Circuit ID由MAC地址生成重复MAC导致Circuit ID冲突协议栈直接拒绝工作。解决方案很简单在VMware设置中为每台虚拟机的网卡勾选“为该网卡生成新的MAC地址”。这个教训告诉我IS-IS的底层依赖远不止于协议规范还深植于硬件抽象层。5.3 metric值的“陷阱”为什么直连路由的metric总是10新手常问为什么show isis database里我的直连网段metric总是10能不能改成1答案是可以但必须理解其影响。在Cisco IOS中接口的IS-IS metric默认为10可通过isis metric 1在接口下修改。但这里有个隐藏规则Level-1路由器的metric值只在Level-1区域内有意义Level-2路由器的metric只在Level-2骨干内有意义而Level-1-2路由器在向Level-1区域泄露Level-2路由时会将Level-2的metric加上一个固定值默认64作为泄露路由的metric。这意味着如果你把R1的Gi0/0接口metric设为1那么R1通告给Level-1区域的默认路由metric将是64165而不是1。这个“64”的偏移量是IS-IS防止路由环路的机制之一不能随意更改。所以调整metric前务必想清楚你是在优化区域内路径还是在影响区域间路由策略5.4 抓包分析的终极技巧如何从Wireshark里定位LSP内容变更当你要验证某项配置如修改接口metric是否真的反映在LSP中不要只看show isis database的summary。打开Wireshark过滤isis lsp找到最新的LSP报文LSP Seq Num最大。右键该报文 - “Decode As...” - 在“Current”列选择“IS-IS”确保正确解码。然后展开“IS-IS LSP” - “TLVs” - “IPv4 Internal Reachability TLV”这里会列出所有宣告的IP前缀及其metric。如果看到192.168.12.0/24的metric从10变成了1就证明配置已生效并泛洪。这个操作比任何show命令都更底层、更可信因为它直接观测到了线路上的比特流。6. 实验延伸与工程实践建议从实验室到机房的跨越做完基础实验你已经掌握了IS-IS的骨架。但真实网络远比实验室复杂。这里分享几个从实验室走向生产的必经之路认证配置生产环境必须启用认证。IS-IS支持明文isis password和HMAC-SHA-1isis authentication mode md5两种。强烈推荐后者且密钥长度至少16位。配置时注意认证必须在两端接口下同时启用且密钥完全一致否则邻居直接无法建立。debug isis adj-packets会明确提示“Authentication failure”。MTU适配IS-IS LSP最大尺寸受链路MTU限制。以太网默认MTU 1500字节但LSP头部和TLV开销会占用约27字节实际可用约1473字节。当网络中有大量IP前缀或BGP标签时LSP可能分片。可通过isis mesh-group或isis lsp-mtu命令调整但更稳妥的做法是在核心链路上统一MTU为9000Jumbo Frame避免分片带来的性能损耗。与BGP的协同在运营商网络中IS-IS只负责IGP内部网关协议的拓扑分发BGP负责跨域路由。此时IS-IS的唯一任务是确保BGP下一跳通常是loopback地址可达。因此必须在所有BGP speaker的loopback接口上启用IS-IS并宣告该loopback地址。show ip route loopback-ip必须显示为IS-IS路由否则BGP会话无法建立。监控告警不要等到用户投诉才去查IS-IS。在Zabbix或Prometheus中采集show isis neighbor | include UP \| DOWN的行数当UP数量突降立即触发告警。更精细的指标是show isis spf-log中的SPF计算次数如果每分钟超过5次说明网络震荡需排查物理链路或配置抖动。最后分享一个小技巧在大型IS-IS网络中show isis topology命令能以图形化方式显示所有路由器的连接关系但它依赖于LSP中的IS Neighbor TLV。如果某台路由器未正确宣告邻居拓扑图就会断裂。因此定期执行show isis database detail | include LSPID\|IS-Neigh核对每台路由器宣告的邻居列表是否与物理拓扑一致是保障网络可视化的基石。这个习惯我坚持了八年救过三次重大故障。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑