1. 从一次割接开始:为什么我推翻了OSPF方案
上个月帮某客户做骨干网改造,设备选型都定了,组网方案却卡了壳。客户现有网络跑的是OSPF,按说同协议替换最省事,但业务侧提了个需求:未来三年要并入几十个边缘节点,地址段规划很碎,希望IGP能扛住大规模路由、收敛快、扩展性强,还不能让区域边界成为瓶颈。我当时的直觉是——该上IS-IS了。
IS-IS这个名字,很多做企业网的朋友可能只在认证题库里见过。它和OSPF同属链路状态协议,但要真说起底层机制,两者差异大到足以影响整张网的架构走向。IS-IS最初是为ISO的CLNS网络设计的,后来被IETF扩展支持IP路由,所以它的报文封装、寻址方式和OSPF完全不同。在ISP骨干网和数据中心场景里,IS-IS几乎成了事实标准,原因就是它的纯L2扁平设计、极强的扩展性,以及用一台设备就能同时承载IPv4和IPv6路由的天然优势。
这篇文章我就以一套“基础网络配置实例”为线索,从NET地址规划、区域设计、接口激活、认证配置到故障排查,完整过一遍IS-IS的落地方法。没有花哨的东西,都是实打实能在工程里直接用的配置和思路。如果你是刚接触IS-IS的网络工程师,或者正在纠结IGP选型,这篇内容应该能帮你省不少踩坑的时间。
2. 动手之前:IS-IS的几个核心概念我帮你翻译成人话
2.1 路由器和链路,它用的是另一套叫法
第一次看IS-IS配置文档,最劝退的就是一堆新名词:L1、L2、NET、DIS、SNPA、PDU。其实换个角度就通了。OSPF里的Area 0、ABR、ASBR,对应到IS-IS就是L2、L1/L2路由器、L1路由器。OSPF里一个区域内有DR/BDR选举,IS-IS对应的是DIS(指定中间系统)。
关键差异在两点。第一,IS-IS没有“骨干区域被分割”的问题,所有L2路由器天然构成一个连续的骨干,区域边界在链路上而不是在路由器上。第二,IS-IS的报文全部封装在链路层之上,不需要IP协议号,所以它天然不依赖IP连通性,很多排障场景里反而更干净。
这里要重点理解L1和L2的转发逻辑:
- L1路由器只维护本区域内的路由,默认路由指向最近的L1/L2路由器。
- L2路由器维护整个L2级别的路由,负责跨区域流量转发。
- L1/L2路由器相当于OSPF里的ABR,但机制更灵活,没有OSPF那种区域间防环的条条框框。
我记得最开始做实验的时候,总拿OSPF的思维去套IS-IS,结果反复改area id,折腾一晚上没通。后来才明白,IS-IS的area设计是“一套NET地址里带区域号”,不是OSPF那种接口上定义area的玩法。思路一转,配置立刻清爽。
2.2 NET地址的算法,其实就是一个身份证号
IS-IS路由器需要一个全网唯一的标识,叫NET(Network Entity Title)。它的格式长这样:
49.0001.0010.0100.1001.00看起来像一串无规律数字,其实拆开看就几段:
49:AFI(Authority and Format Identifier),私有地址段,类似IPv4里的私网地址,直接用49开头不会有冲突问题。0001:Area ID,区域号。L1路由器判断是否同区域就看这段。0010.0100.1001:System ID,系统ID。必须全网唯一,长度固定6字节,通常用Loopback地址的IPv4来编(比如10.10.0.1转成0010.0100.0001,或者直接用路由器编号)。00:NSEL,固定为00,不用管。
最让我欣慰的是,NET地址里没有掩码的概念,所以不存在什么子网划分、汇总冲突的问题。排障时的核心口诀就一句:网内所有路由器的System ID不能重复,同区域的Area ID必须一致。
2.3 广播网络里的DIS选举,比OSPF的DR要简单
IS-IS在广播多路访问网络(比如以太网)里,也要选举一个DIS,负责周期发送SNP(序号数据包)同步链路状态数据库。但和OSPF的DR/BDR不同:
- IS-IS的DIS优先级是接口级配置,默认64,值越大越优先。
- DIS没有备份,也就是没有BDR这种角色。
- DIS是抢占式的,新加一台高优先级设备,原DIS立刻让位,这与OSPF的“稳定第一”思路完全不同。
我实测过,如果你的网络里对DIS稳定性有强迫症要求,最简单粗暴的办法是:所有接口优先级全设成默认,或者干脆把DIS优先级都设成一个值,通过MAC地址来定胜负,这样至少逻辑上可预测。
3. 配置实例全解:三台路由器撑起一个最小可用的IS-IS网
3.1 网络拓扑与地址规划
我们用一个最简单的场景来演示:三台路由器组成一个三角形网络,两台属于Area 0001,一台属于Area 0002。所有链路用10.1.x.x/24网段,Loopback地址用10.0.x.x/32。
| 设备 | 区域 | System ID | Loopback0 | 接口及IP |
|---|---|---|---|---|
| R1 | 0001 | 0000.0000.0001 | 10.0.0.1/32 | G0/0: 10.1.12.1/24, G0/1: 10.1.13.1/24 |
| R2 | 0001 | 0000.0000.0002 | 10.0.0.2/32 | G0/0: 10.1.12.2/24, G0/1: 10.1.23.2/24 |
| R3 | 0002 | 0000.0000.0003 | 10.0.0.3/32 | G0/0: 10.1.13.3/24, G0/1: 10.1.23.3/24 |
这是一个经典的双区域互联模型,其中R1和R2在区域内,R3跨区域。全网启用IS-IS后,R1和R2之间保持L1邻居,R1、R2分别与R3建立L2邻居。跨区域路由通过L1/L2边界设备完成。
3.2 关键配置逐行拆解
先看R1的完整配置。每一条我都加了注释,后面再单独解释几个容易踩坑的点。
router isis 100 is-net 49.0001.0000.0000.0001.00 is-type level-1-2 metric-style wide ! interface Loopback0 ip address 10.0.0.1 255.255.255.255 ip router isis 100 isis circuit-type level-2 ! interface GigabitEthernet0/0 ip address 10.1.12.1 255.255.255.255 ip router isis 100 isis circuit-type level-1 ! interface GigabitEthernet0/1 ip address 10.1.13.1 255.255.255.255 ip router isis 100 isis circuit-type level-2几个关键点拆开说:
第一,is-net是启动IS-IS进程的必需项,相当于OSPF里router-id的作用,但比router-id更严格,因为它在整网ID体系里是唯一的。有同学问我能不能不配NET直接跑IS-IS?答案是绝对不能,进程起不来。
第二,metric-style wide。IS-IS早期默认使用narrow风格,度量值只支持6位,最大63,这在现在的网络里完全不够用。改wide风格后,度量值支持24位,最大16777215,并且能携带TE扩展信息。强烈建议所有新部署都用wide,不用纠结兼容性问题。
第三,isis circuit-type level-1和level-2。这就涉及前面说的IS-IS和OSPF的最大区别:同一台路由器上,一个接口可以只跑L1、只跑L2、或者两者都跑。OSPF里你只能在一个接口上属于一个area,但IS-IS允许你用接口-level来精细化控制不同链路上的路由传播范围。这个特性在分层网络里简直好用到爆。
再看R2和R3,逻辑一样,只是NET地址和接口号不同。我直接给R2的关键配置:
router isis 100 is-net 49.0001.0000.0000.0002.00 is-type level-1-2 metric-style wide ! interface Loopback0 ip address 10.0.0.2 255.255.255.255 ip router isis 100 isis circuit-type level-2 ! interface GigabitEthernet0/0 ip address 10.1.12.2 255.255.255.255 ip router isis 100 isis circuit-type level-1 ! interface GigabitEthernet0/1 ip address 10.1.23.2 255.255.255.255 ip router isis 100 isis circuit-type level-2R3属于区域0002,注意它的NET地址里Area ID是0002,System ID保持唯一。
router isis 100 is-net 49.0002.0000.0000.0003.00 is-type level-2-only metric-style wide ! interface Loopback0 ip address 10.0.0.3 255.255.255.255 ip router isis 100 isis circuit-type level-2 ! interface GigabitEthernet0/0 ip address 10.1.13.3 255.255.255.255 ip router isis 100 isis circuit-type level-2 ! interface GigabitEthernet0/1 ip address 10.1.23.3 255.255.255.255 ip router isis 100 isis circuit-type level-2R3只做L2,这样省掉L1/L2路由器的开销,跨区域流量全部走L2。在纯骨干设备上,这种配置能减少LSDB规模和CPU消耗。
3.3 验证与调试命令
配置完别急着欢呼,先用命令确认状态。我列几个最常用的:
show isis adjacency show isis database show isis route show isis interface debug isis adjacency debug isis update-packets实测中的一个顺序:先看邻居,再看数据库,最后看路由表。
show isis adjacency输出里,每一行就是一个邻居。重点看State是否是UP,如果UP就说明L1/L2属性没问题。如果邻居Down,优先检查MTU、认证、电路类型是否一致。
如果邻居都UP了但路由表没有,那大概率是NET地址配错或者System ID冲突。用show isis database看LSDB里有没有三台设备的LSP,再对照System ID就能定位问题。
3.4 扩展:地址汇总和路由泄露
基础实例跑通只是第一步。实际工程里,你要是把IS-IS的路由全裸奔到全网,很快LSDB就肥到跑不动了。IS-IS做汇总有个天然优势:在L1/L2边界路由器上,你可以分别对L1和L2的路由做聚合,不用像OSPF那样区分域间路由和域内路由。
router isis 100 aggregate-address 10.0.0.0/16 level-2这条命令的意思是把区域内的所有细网段聚合为10.0.0.0/16后通告到L2级别。注意一点:聚合生效的前提是LSDB里已经有这些明细路由。
另一个重要机制是路由泄露(Route Leak)。L1路由器默认看不到其他区域的具体路由,只有默认路由指向L1/L2边界。这在某些场景下会浪费带宽。如果你希望L1区域内的路由器也能看到外部明细路由,可以在边界路由器上加:
router isis 100 redistribute level-2 into level-1泄露出去了路由表会变大,但能避免跨区域的次优路径。做这个操作前建议先做路由策略,只泄露特定网段,避免全网明细全塞进L1区域。
4. IS-IS和OSPF的区别,一张表说清楚
好多刚入门的同学搞不清这两个协议到底差在哪,我直接列个对比表。
| 对比维度 | IS-IS | OSPF |
|---|---|---|
| 报文封装 | 直接封装在链路层 | 封装在IP报文里 |
| 区域模型 | 路由器级别,L1/L2 | 接口级别,Area |
| 骨干区域 | 天然连续,L2路由器构成 | Area 0,必须物理或逻辑连续 |
| 路由计算 | SPF算法 | SPF算法 |
| 度量值 | 默认wide 支持24位 | 默认cost 参考带宽可调 |
| 支持网络类型 | 广播、点到点 | 广播、点到点、NBMA等 |
| IPv6支持 | 原生扩展,同一进程可跑双栈 | 需要单独实例 |
| 扩展性 | 纯L2可扩展,适合超大规模 | 区域划分较灵活,但ABR压力大 |
我自己的感受是,IS-IS在三层架构的骨子里更“平”。它的L1/L2不是OLSR那种分层路由,而是把“区域”这个概念从接口上抽象到了路由器级别,让网络设计多了一层自由度。尤其在做数据中心spine-leaf架构时,所有leaf设备做L1,spine设备做L2,两行配置就能把整张网收敛了。
而OSPF在分支办公网、混合组网环境里表现更友好,因为它在NBMA和多种二层技术上的适配性更强。IS-IS最初是为CLNS设计的,对纯IP以太网的某些边界场景,比如p2p链路上的MTU协商、二层广播域隔离,反而需要人为配置处理。
选型没有绝对的对错,关键看你网络的规模和演进方向。网络不超过几十台设备,OSPF够用;如果规划是几百台起步,未来要承载IPv6和TE,IS-IS会省心很多。
5. 排障实录:三台设备居然折腾了半夜
5.1 问题一:邻居起不来,MTU背锅
有次在某公司实验室调IS-IS,链路是千兆以太网,接口MTU设了9000。按照普通OSPF的习惯,我没多想。结果邻居状态一直卡在INIT,看show isis adjacency半天不动。
排查过程:
- 先看物理层,
show interface没有错误。 - 再看认证配置,没配。
- 最后抓包才发现,IS-IS的Hello报文太大,超出了接口实际支持的MTU,对端直接丢弃。
这个坑很经典。IS-IS的Hello报文要携带所有CLV,包括IP接口地址、认证信息、支持的协议等,默认的PDU大小会随配置增大。解决办法有两个:一是所有接口统一MTU,二是强制IS-IS PDU大小限制。
interface GigabitEthernet0/0 mtu 1500 ! router isis 100 lsp-mtu 1400lsp-mtu限定了LSP最大大小,这样就算某个接口MTU不一致,IS-IS报文也不会超长。实测下来,只要链路层MTU相同,IS-IS跑起来非常稳。
5.2 问题二:跨区域路由打不通,原来是路由泄露没做
按我们上面那个三台设备的拓扑,R1(Area 0001)默认只能看到自己区域内的路由。如果R1想ping通R3的Loopback,路由表里只会有一条默认路由指向R2(L1/L2边界)。但这条默认路由的下一跳是R2的接口,R1必须能学到R2的物理接口网段才行。
很多人在这犯迷糊:为什么我R1上能看到10.1.13.0/24,但看不到10.0.0.3/32?因为10.1.13.0/24是R1和R3之间的直连链路,属于L1区域内的路由。而10.0.0.3/32是R3的Loopback,R3作为L2-only设备,这条路由只通告到L2级别。
解决方法是按需做路由泄露。在R2上加redistribute level-2 into level-1并且在策略里允许10.0.0.3/32,问题立解。值得注意的是,强制泄露所有L2路由到L1会导致L1区域路由表膨胀,丢失“L1区域收敛快”的核心优势。正确姿势是只泄露必要网段。
5.3 问题三:认证不生效,排查细节控
IS-IS支持三种认证:接口认证、区域认证、路由域认证。有一次我配置了区域认证,结果发现L1邻居依然能建立,但LSP不接受。原因是IS-IS认证的检测点非常严格——hello认证是基于接口的,和区域认证不挂钩。
具体配置如下:
interface GigabitEthernet0/0 isis password huawei@123 level-1 ! router isis 100 area-password huawei@123 domain-password huawei@123注意三点:
- 接口密码是明文,在生产环境务必用
keychain或hmac-sha方式。 - 区域密码只对L1的LSP生效,L2的LSP要靠
domain-password。 - 如果一台设备既做L1又做L2,两个密码都要配,否则对端会拒绝对应Level的LSP。
我实测过只配了area-password但没配domain-password,结果L2邻居能建立但LSP不互通,查了大半天才定位到是level不匹配。
6. 进阶调优:Metric和负载均衡的实战经验
6.1 手动调整Metric控制路径
IS-IS的默认Metric是10,所有接口一样。这在简单拓扑里没问题,但一旦出现冗余链路,流量会均匀分担,不管后端链路带宽。要手动控制,需要理解IS-IS的Metric累加方式:
interface GigabitEthernet0/0 isis metric 20 level-2这条命令把该接口在L2级别的Metric改成20。注意IS-IS的接口Metric可以针对Level分别设置,灵活性比OSPF高。
6.2 负载均衡配置
IS-IS默认支持多条等价路径负载均衡,但默认的等价条件是基于Metric相等。如果两条路Metric不一样,就只能走小的那条。想让不等价链路也能分担流量,需要开启traffic-share类功能。
router isis 100 maximum-paths 8maximum-paths设置最大等价路径数,一般设备支持4条或8条。实际组网里,如果你想让两条不同带宽的链路同时转发,需要配合路由策略或者metric-style wide环境下的TE Metric做调整,否则只能等价负载。
6.3 快速收敛的几板斧
IS-IS在收敛速度上天生有优势,但默认配置还有优化空间:
- 开启
fast-flood特性,让LSP在本地SPF计算前就先加速泛洪。 - 缩短SPF计算间隔。默认是5秒,生产环境可以调到1秒甚至更短。
- 开启BFD联动。IS-IS支持BFD快速检测链路故障,亚秒级切换不是梦。
router isis 100 timer spf 1 200 200 ! interface GigabitEthernet0/0 isis bfd这个timer spf后面的参数依次是初始延迟、最小延迟、最大延迟,单位毫秒。一般建议初始1秒,之后都是200毫秒,别把SPF压太狠,防止频繁抖动造成CPU飙高。
7. 最后再分享一点个人观察
做了这么多年网络,我最大的体会是:协议选型这事儿,看着是纯技术问题,实际是架构理念问题。IS-IS能把一张网组织得像一套精密齿轮,不需要那么多特殊角色和防环机制,因为它从一开始就没打算让用户把事情搞复杂。OSPF的许多特性,比如DR/BDR、虚链路、NSSA,都是在给旧时代的网络打补丁。而IS-IS的简洁,是建立在“所有设备都足够聪明”的假设之上。
对于刚开始学IS-IS的朋友,我的建议是先别看厂商文档,找个GNS3或者EVE-NG,按这篇文章的拓扑先把三台设备的邻居跑起来,再用debug isis看一遍报文交互,你会对IS-IS的运作方式产生肌肉记忆。等哪天你深夜割接遇到一个诡异的路由黑洞,灵光一闪想起“这可能是L1/L2边界的问题”,这篇文章就没白写。