IS-IS系列写到第十八篇,前十七篇把邻居建立、LSP同步、区域划分、路由计算这些底子都打完了,今天这篇补一个很重要但容易被忽视的环节——缺省路由。在真实的运营商骨干网和大型数据中心里,缺省路由不夸张地说是全网流量的“最后一根救命稻草”,查不到明细路由的报文最终全靠它引流。这篇把IS-IS缺省路由的原理、配置、防环和排查一次性讲透,适合正在做网络规划或在现网里调试IS-IS的工程师,也适合准备数通认证、想把协议细节搞明白的人。
1. 缺省路由在IS-IS里到底是什么定位
1.1 从路由表的“兜底”逻辑说起
缺省路由,也叫默认路由,用IP前缀表示就是0.0.0.0/0,掩码为零意味着它能匹配任何目的地址。路由表在设计上有一个基本规则:匹配目的地址时,最长前缀优先;如果所有明细路由都匹配不上,最后才会去看这条掩码最短的缺省路由。你可以理解成公司前台没有写具体楼层的访客登记表,凡是没有明确指向的人员,一概先带到总接待处——总接待处就是那个0.0.0.0/0。
在IGP协议里,缺省路由并不是天然存在的。OSPF可以用default-information originate来生成,RIP/BGP也各有各的办法。IS-IS作为链路状态协议,它的处理方式更加“结构化”:任何一条路由,包括缺省路由,都必须作为可达性信息放进LSP(链路状态报文,Link State PDU)里,然后通过泛洪让整个域的LSDB同步。换句话说,IS-IS缺省路由不是靠某台路由器“口头告诉邻居”,而是靠在LSP中主动携带0.0.0.0/0这个前缀,让所有路由器在SPF计算时把它纳入最短路径树。
1.2 为什么要单独用一整篇来讲
你可能觉得这不就是一条路由嘛,配一下就行。但在IS-IS里,缺省路由牵涉到Level-1和Level-2两层结构的交互、ATT位机制、路由渗透策略、防环设计要求,还包括和BGP/external路由的协同。一个细节没处理好,轻则某条链路流量绕远路,重则产生路由环路把整个区域的流量打蒙。
举一个最常见的场景:一台Level-1路由器位于某个未梢区域,它没有Level-2的链路,也看不到其他区域的路由明细。它凭什么能访问其他区域的地址?全靠边界路由器在发送的LSP里把ATT(Attach)位置1,Level-1路由器收到这种LSP后,就会自动在路由表中生成一条指向该边界路由器的缺省路由。这是协议内置的行为,不需要额外配置。但也正因为是“自动的”,很多人在排查时反而找不到头绪——明明配置了level-1,为什么路由表里多出来一条0.0.0.0/0?这就是ATT位在起作用。
而在Level-2区域内部,或者是L1/L2边界想让全网都收到一条特定的默认出口时,就需要显式配置default-route-advertise。这时候缺省路由的来源、cost设计、是否无条件通告、怎么做策略控制,每一项都值得严谨对待。
2. IS-IS缺省路由的底层工作原理
2.1 LSP中的TLV与可达性发布
IS-IS把信息封装在一系列TLV(Type-Length-Value)中,IP可达性信息主要靠这几类TLV承载:
| TLV编号 | 名称 | 用途 |
|---|---|---|
| 128 | IP Internal Reachability | 内部路由可达性,携带直连网段(旧式) |
| 130 | IP External Reachability | 外部路由可达性(旧式) |
| 135 | Extended IP Reachability | 扩展可达性,支持宽度量、标签等(当前主流) |
一台IS-IS路由器要发布一条缺省路由,本质上就是在自己被泛洪的LSP里插入一个前缀为0.0.0.0/0的可达性TLV。和发布普通网段不同,这个前缀的掩码长度是0,协议在解析时会将其识别为缺省路由,并放入路由计算过程中。
一个容易踩坑的细节:IS-IS的宽窄度量模式会直接影响TLV的承载方式。使用窄度量(narrow metric)时,可达性信息走TLV 128/130;但TLV 128对前缀的处理能力有限,如果你想让缺省路由携带更丰富的属性(比如tag、更精确的优先级标记),就要启用宽度量(wide metric),让TLV 135来承载0.0.0.0/0。我在现网中见过一个案例:设备之间度量模式不一致,导致某些路由计算出现异常,优先级表现得很奇怪,最后排查发现是metric-style narrow和metric-style wide混用造成的。所以在发布缺省路由前,务必先确认全网IS-IS的度量模式是统一的。
2.2 ATT位如何“自动”生成Level-1缺省路由
ATT位是IS-IS中极具特色的一种机制,它出现在LSP的IS邻居TLV里,但其作用远不止“邻居关系标识”。当一个Level-1-2路由器同时连接着多个区域,且它拥有到其他区域的Level-2路由时,它会在向Level-1区域通告的LSP中置上ATT位。Level-1路由器收到后,知道这位“顶梁柱”可以去往区域之外,于是自动生成一条度量值为该目的路由器距离的缺省路由。
这里有一个底层判别依据:Level-1路由器并不需要知道其他区域的任何具体路由,它只需要认定“从这台设置了ATT位的路由器走,肯定能到达区域外”。这大大减少了Level-1路由器的LSDB规模和路由表规模,是IS-IS区域化设计的精髓。如果Level-1区域里有多台Level-1-2路由器都置了ATT位,Level-1路由器会进行SPF计算,对每台候选边界路由器计算距离,然后选择最优的那条作为缺省路由的下一跳。
需要特别提醒的是:ATT位机制生成的缺省路由,在路由表中通常表现为一条直连到该Level-1-2设备的IS-IS路由,本身不会参与Level-2区域的泛洪。所以,如果你想让Level-2区域也收到缺省路由,不能指望ATT位,必须显式配置通告。反之,如果Level-1区域不希望自动接收缺省路由,则需要在Level-1路由器上做路由策略过滤,或者调整边界路由器的ATT位设置,这在某些厂商设备上是可以通过命令关闭ATT位置位的。
2.3 缺省路由在SPF计算中的命运
SPF(最短路径优先)算法在IS-IS中用来计算到每个目标的最短路径树。缺省路由进入LSDB后,也会参与SPF计算,但它匹配任何目的地址的特殊性,决定了它只在路由表匹配“兜底”阶段才登场。
在华为、Juniper等主流设备的IS-IS实现中,缺省路由与普通路由之间会有优先级上的先后关系。常规路由、区域间路由、外部路由等按照协议优先级排列,缺省路由往往处于最低优先的一档。这其实是符合直觉的设计:查询路由表时,系统总是先把精确匹配的机会让给更具体的前缀。一旦某个目的地址在路由表中完全找不到匹配项,缺省路由才会介入。
但要注意,IS-IS缺省路由并不会影响BGP路由的递归查找。如果一台路由器同时运行IS-IS和BGP,BGP的下一跳递归查询往往需要底层IGP提供路由支撑。缺省路由在某些设计中可以参与这种递归,但也可能因为缺省路由的引入导致原本不该走的流量走了默认路径,从而产生次优路径甚至环路。所以,在部署IS-IS缺省路由前,要把全网的路由优先级、外部路由注入点都梳理一遍。
3. 组网设计思路与配置前必做的三件事
3.1 明确缺省路由的注入点
配置永远排在设计后面。我接触过的很多故障,根本不是命令敲错,而是启动规划的时候就没想清楚缺省路由该从哪儿进来、覆盖多大范围。在做IS-IS缺省路由部署前,请先回答三个问题。
第一,谁是网络的“出口”?网络的出口通常是连接外部网络(比如另一个自治系统、运营商上行、云专线)的那台路由器,它天然适合作为缺省路由的发布源。在这台设备上启用default-route-advertise,全网就能感知到离开本域的方向。
第二,哪些区域需要感知这条缺省路由?如果重点是Level-2骨干区域,那么就沿骨干区域通告;如果重点是某个Level-1未梢区域,边界路由器上利用ATT位机制或者显式通告,都能达成目标。但两者覆盖范围和形态不同,不能混为一谈。
第三,缺省路由的cost怎么设置?由于缺省路由是“兜底”路径,它的cost直接影响所有无法匹配明细路由的流量走向。如果两条出口路由器同时通告缺省路由,cost将成为选路的关键依据。
3.2 检查度量模式与区域类型
配置之前,用display isis brief或等效命令查看当前设备的IS-IS进程状态,重点确认以下几点:
- IS-IS运行在Level-1、Level-2还是Level-1-2模式
- 度量模式是narrow还是wide
- 邻居关系是否都是up状态
- 是否存在多次区域地址重叠的情况
在现网中,我见过因为Level-1/Level-2模式理解不一致而导致缺省路由“时有时无”的情况。特别是Level-1-2路由器上,如果设备和邻居在同一个区域,但彼此支持的路由层次不同,可能产生区域路由渗透异常。满配前先花十分钟做一次基础状态确认,能省去后面大量的排查时间。
3.3 设计防环预案
缺省路由最怕环路。由于它匹配一切目的地址,一旦两台路由器互相把对方通告的缺省路由当作最优路径,整个流量就会在两者之间打转,直到TTL耗尽。IS-IS本身是链路状态协议,基于LSDB计算路由,和距离矢量协议相比环路的概率低很多,但仍然可能因为跨协议引入(比如从静态路由引入的缺省路由又回灌到IS-IS)而产生问题。
建议在配置前,先梳理全网是否存在“动态学习的缺省路由再次被IS-IS通告”的情况。如果路由表中已有的缺省路由来源于另一个IGP或静态路由,而IS-IS又被允许通告这些外部缺省路由,就要防止它们形成闭环。一个常用的手段是在发布缺省路由时配合路由策略,只允许从真正信任的方向引入,而不是无脑泛洪。
4. IS-IS缺省路由配置实操
4.1 基础拓扑与需求模拟
这里用一个简化的三层组网来演示配置过程。网络包含三台路由器,均为虚构设备名称,仅用于示意:
- R1:边界出口路由器,连接外部网络,运行IS-IS Level-2
- R2:核心路由器,Level-1-2,连接区域1和区域2
- R3:区域2内的Level-1路由器,只运行Level-1
区域1的System ID区域号为49.0001,区域2为49.0002。需求是让R3所在的Level-1区域能够自动获得去往外部网络的缺省路由,同时让整个Level-2区域内的路由器都能看到一条指向R1的缺省路由用于外网出口。
4.2 在出口路由器上通告缺省路由
在R1上配置IS-IS基础进程,并启用缺省路由的显式通告。
# isis 1 is-level level-2 network-entity 49.0001.0000.0000.0001.00 default-route-advertise always cost 10 # interface GigabitEthernet0/0/0 isis enable 1 isis circuit-type level-2 # interface GigabitEthernet0/0/1 ip address 10.1.1.1 255.255.255.0 isis enable 1 isis circuit-type level-2这里的命令分为几个层次:
is-level level-2:让R1只在Level-2层面参与IS-IS路由计算,不涉及Level-1。default-route-advertise:IS-IS进程向LSP中注入缺省路由。always参数的含义是不管当前路由表中是否已有缺省路由,都强制生成并通告。cost 10:为这条缺省路由指定cost值。注意,这里指定的cost会随LSP泛洪,并在SPF计算中累加各跳的开销。比如R2到R1的链路cost是10,R2计算出的默认路由总cost就是20。
有朋友会问,为什么不直接配静态缺省路由指向外部?可以配,default-route-advertise与静态路由并不冲突。R1上如果已经配置了静态缺省路由指向对端外部网关,IS-IS的default-route-advertise可以基于这条静态路由发布;如果你用always,即使没有静态缺省路由,IS-IS也会强行生成自己的缺省路由,把它广播给全网。always适合在需要无条件保证出口可用性的场景使用,但也意味着IS-IS域内所有路由器都会依赖这条默认出口,一旦出现双出口竞争,必须配合cost来控制主备。
4.3 Level-1区域内的ATT位自动生成
R2作为Level-1-2路由器,同时连接区域49.0001和49.0002,它会通过ATT位向Level-1区域通告自己具备离开区域的能力。由于R2在Level-2中收到了R1发布的缺省路由,它有能力转发区域外流量,于是R2发出的Level-1 LSP中会携带ATT位。R3作为纯Level-1路由器,不需要任何额外配置,就会自动在路由表中生成指向R2的缺省路由。
R2的关键配置:
# isis 1 is-level level-1-2 network-entity 49.0001.0000.0000.0002.00 # interface GigabitEthernet0/0/0 isis enable 1 isis circuit-type level-2 # interface GigabitEthernet0/0/1 isis enable 1 isis circuit-type level-1R3的关键配置:
# isis 1 is-level level-1 network-entity 49.0002.0000.0000.0003.00 # interface GigabitEthernet0/0/0 isis enable 1 isis circuit-type level-1如果区域2内有多台Level-1-2路由器,R3的SPF会选择最优的那台作为缺省网关,冗余性和负载均衡都由协议本身保证。如果希望R3显式收到一条区域出口的缺省路由,而不是靠ATT位自动生成,R2上也可以直接配置default-route-advertise route-policy,把特定前缀以缺省路由形式下发给Level-1区域。
4.4 带路由策略的缺省发布
实践中并不是所有缺省路由都要无条件发布。有些场景需要根据外部路由的存在性来决定是否下发缺省路由,例如:只有本路由器上存在BGP路由表中某个关键前缀时,才向IS-IS域通告缺省路由。此时可以配合route-policy来实现。
R1上的增强配置:
# route-policy DEFAULT_DETECT permit node 10 if-match ip-prefix CRITICAL_NETWORK # isis 1 default-route-advertise route-policy DEFAULT_DETECT # ip prefix-list CRITICAL_NETWORK index 10 permit 203.0.113.0 24这段配置的含义是:只有当路由表中存在203.0.113.0/24这条外部路由时,IS-IS才发布缺省路由。这比always更精准,能避免因误配置导致全网默认路由漂移。如果想在R2上向Level-1区域定向发布,也可以在R2的Level-1视图下配置对应的策略。
4.5 验证缺省路由是否生效
在R3上查看IS-IS路由表:
display isis route重点观察是否有前缀0.0.0.0/0的出现。正常情况下,R3会显示出一条从R2学到的缺省路由,其metric等于R2到R3的链路cost。
在R1上查看发布的LSP信息:
display isis lsdb关注R1的LSP中是否包含前缀0.0.0.0/0的可达性TLV。如果使用了宽度量模式,可以在扩展IP可达性TLV中明确看到该前缀,以及R1填充的cost值、tag等属性。
在R2上,可以使用display fib查看实际转发信息,确认缺省路由被正确加载到FIB,下一跳为R1的接口地址。FIB表的展示可以同时确认报文的转发路径是否符合预期。
5. 常见问题与现网排查技巧
5.1 Level-1路由器学不到缺省路由
现象:区域内的Level-1路由器查路由表,没有0.0.0.0/0。
排查思路按顺序进行:
- 检查边界路由器是否真的在Level-2看到了通往其他区域的路径。如果边界路由器自身的Level-2缺省路由就没有,它可能不会置上ATT位,Level-1区域自然学不到。
- 检查边界路由器是否通过Level-1链路向区域内发送LSP。如果链路cricuit-type设成了level-2-only,Level-1的LSP不会在这条链路上出现,更别提ATT位。
- 检查区域内是否有重叠区域地址。当Level-1路由器认为自己与边界路由器属于同一个区域时,它们的交互可能出现异常,甚至边界路由器不会把自己视为“可以去往其他区域的出口”。
5.2 缺省路由产生了环路
环路是缺省路由部署中最严重的事故。通常发生在多台路由器同时通告默认路由,且通告来源互为依赖时。
举例来说,R1通过IS-IS向R2发布缺省路由,R2又通过另一种方式(比如路由引入)将自己的缺省路由回传给R1。由于IS-IS是链路状态协议,R1会计算到R2的最短路径,并把R2作为这条默认路由的下一跳,而R2的默认路由下一跳又指向R1,两者陷入死循环。
解决办法:
- 使用
default-route-advertise的route-policy过滤发布源,只允许从特定方向引入缺省路由。 - 在边界路由上对入方向的路由做过滤,阻止学习来自内部区域的缺省路由。
- 如果确实存在双出口设计,通过cost高低设置主备,避免两台路由器互指。
5.3 双出口的次优路径问题
如果网络中有两台出口路由器,分别连接两个不同的外部网络,同时都通告缺省路由,内部路由器如何选择?SPF会根据cost值计算到每台出口的最短路径,选择综合代价小的一侧作为默认出口。但问题在于,单条缺省路由无法区分不同外部目的地址的最优出口。若两个外部网络需要精细化选路,通常需要依靠BGP路由来承载外部明细,或者使用IS-IS的多拓扑特性做策略路由导流,缺省路由只负责“兜底”。这一点在设计时就要想清楚,不要指望靠一条0.0.0.0/0解决所有出口调度。
5.4 缺省路由一直不更新
IS-IS的LSP有老化机制和序列号机制。如果缺省路由的cost值或tag属性发生了变化,但LSP没有及时泛洪更新,可能导致全网缺省路由保持不变。出现这种情况时,可以在发布设备上执行LSP刷新操作,或触发接口事件来加速泛洪。display isis lsdb中查看LSP的序列号和剩余生存时间,能判断该LSP是否处于持续更新的正常状态。
另外一个低概率但真实存在的情况:设备开启了LSP分片扩展,而缺省路由所在的分片没有被其他路由器正确接收。排查时关注分片是否完整,以及各设备的LSDB同步状态。
6. 我个人在实际操作中的几条经验
IS-IS缺省路由看似只是配置一条命令,但它在整个网络中起的是“重力场”的作用,影响范围远远超过那台发布路由器本身。这些年做现网维护,我总结了三条比较务实的体会。
第一,能显式定义的通告路径,不要依赖自动机制。ATT位虽然方便,但它的行为在跨厂商互通时表现得并不完全一致。如果网络里同时有多个厂商的设备,建议在边界路由器上明确配置缺省路由的通告策略,而不是让每台设备自行理解ATT位的含义。跨厂商环境下,任何一个协议字段的细微理解偏差在关键时刻都会被放大。
第二,缺省路由的cost一定要有全局视图。我见过不止一次,两台出口路由器一台用默认cost 10,另一台配成了cost 5,结果全网流量都压到后者身上,链路负载严重失衡。缺省路由的cost本质上是在告诉全网“首选谁”,多花两分钟做全局成本规划,比事后调整负载均衡策略划算得多。
第三,任何对缺省路由的变更都要走“观察—小范围验证—全量发布”的流程。LSP泛洪对全网的影响是即时的,新cost值几秒钟内就会传遍整个骨干区域。如果改错了cost方向,全网流量瞬间绕路,用户侧的感知就是丢包和时延飙升。规范的变更窗口和回退预案,比任何精妙的配置都重要。
IS-IS缺省路由的内容到这里就完整了。前面讲过的SPF计算、LSP处理、区域间路由渗透,在这一篇里形成了一个闭环:缺省路由需要依靠LSP来承载,依靠区域边界来传播,依靠cost来控制路径,还需要依靠路由策略来防环。能把这张网织好,IS-IS的骨干网络就稳了一大半。