多台路由器来回“搬路由”,为什么越搬越乱
年前帮某园区网做核心割接,本来是双点双向重分布OSPF和IS-IS,听起来就是个常规操作。结果配置完,核心交换机上出了两条等价的跨协议路由,业务访问时延忽高忽低,排查到凌晨三点才发现是路由回灌导致的环路。那晚之后我就一直想写一篇关于“多向重分布”的文章,把这类场景下的坑、排查思路、还有华为设备上的配置细节一次性讲清楚。
如果你正在备考HCIP,或者工作中已经遇到了多台路由器、多协议之间互相引入路由的场景,这篇文章应该能帮你少走不少弯路。多向重分布的本质并不是“把路由互相拷贝一下”那么简单,它背后是协议优先级冲突、度量值换算、防环机制缺失等一系列问题。下面我从原理到配置,再到故障排查,完整走一遍。
1. 多向重分布到底在解决什么问题,又带来了什么问题
1.1 为什么需要重分布:一个园区网里的“语言不通”
先还原一个最常见的场景。假设你维护的园区网里,核心层跑OSPF,分支或合作伙伴那边跑IS-IS,还有一部分遗留设备在用RIP。正常情况下,OSPF区域内的设备彼此交换LSA,IS-IS域内设备交换LSP,各自内部通信都没问题。
但业务不会老老实实只待在一个协议域里。财务系统在OSPF域,办公系统在IS-IS域,两边要互通,就必须有一台路由器同时“听得懂”两种协议,把OSPF学到的路由转成IS-IS能识别的形式,再广播给IS-IS域。这个转换动作,就是路由重分布(Route Redistribution)。
单靠一台路由器做单向重分布,往往不够。很多网络设计为了冗余和负载分担,会在两台设备上同时做双向重分布。比如某公司的核心区两台交换机分别跑OSPF和IS-IS,同时互相引入对方协议的路由。这种拓扑下,路由信息就会从A设备以OSPF形式进来,再从A设备以IS-IS形式出去,或者从B设备绕一圈再回来,形成所谓的“多向重分布”。
1.2 重分布的方向:单向、双向、多向
先量化一下“多向重分布”这个概念:
- 单向重分布:只有一侧设备把路由从协议A引入协议B。另一侧不做。
- 双向重分布:一台设备上,协议A和协议B互相引入。比如同时配置了“OSPF引入IS-IS”和“IS-IS引入OSPF”。
- 多向重分布:通常指两台或以上设备之间,分别配置了双向重分布。例如R1和R2都同时跑OSPF和IS-IS,并且都做了互相引入。
多向重分布之所以麻烦,核心在于“多”。一台设备上做双向重分布,路由只会在这台设备上做一次“翻译”。但当两台设备都做双向重分布时,路由就可以在R1、R2之间来回穿插,R1把OSPF的路由翻译成IS-IS,R2又从IS-IS里学回来,再把这条路由重新翻译成OSPF。也就是说,原本OSPF域内部的路由,绕了一圈又变成了“外部路由”回到了OSPF域。
这就好比你把一份中文文件翻译成英文,再让另一个不懂中文的人把它翻回中文,内容早就变味了。路由变味的具体表现,就是优先级变了、度量值变了、甚至下一跳都成了转发环,严重的时候直接导致数据包在路由器之间兜圈子,这就是路由环路。
1.3 学会区分:重分布不是“拷贝粘贴”
很多新手配置重分布,脑子里想的是“把R1的OSPF路由表拷贝一份给IS-IS,把IS-IS的拷贝一份给OSPF”。实际操作确实可以用一句import-route命令搞定,但路由表项拷贝过去之后,这条路由的来源、路径属性、优先级全部发生了变化。
OSPF内部路由的优先级是10,外部路由的优先级是150。IS-IS内部路由优先级是15。RIP是100。这些数值在华为设备上有明确的默认定义。当你把OSPF路由引入IS-IS时,这条路由到了IS-IS域内,它就不再是“OSPF内部路由”,而是“IS-IS外部路由”。再往OSPF引入时,它也不是普通的OSPF内部路由,而是OSPF外部路由Type 2。
优先级差异直接影响路由选择。如果同一台设备上同时从两条路径学到了去往同一目的地的路由,一条来自IS-IS(优先级15),一条来自RIP(优先级100),设备会毫不犹豫选择IS-IS那条,哪怕IS-IS那条路径是绕远路。用大白话说,路由器选路并不智能,它只看“优先级数字谁小”,数字小的就放入路由表。重分布恰恰改变了协议优先级,所以很容易造成“优选了错误路径”的后果。
2. 四个高频事故现场:多向重分布的典型故障模式
2.1 路由回灌:自己引入的路由又回到了自己手里
先画个最简单的场景。R1和R2之间跑OSPF和IS-IS。R1同时做双向重分布,R2也做双向重分布。现在OSPF域内有一条路由10.1.1.0/24,R1从OSPF学到,然后按照双向重分布的配置,把它引入IS-IS。R2从IS-IS学到了这条路由,同时也因为自己配置了双向重分布,把它再引入OSPF。
于是OSPF域内出现了两条10.1.1.0/24路由:一条是原始的LSA,另一条是R2以外部路由形式通告回来的。关键是,R2通告的是外部路由,cost通常被设成了默认值1,反而比原始路径更优,OSPF域内其他路由器就可能把去往10.1.1.0/24的流量转发给R2,R2再按IS-IS下一跳转发给R1。如果R1又通过OSPF学到了R2通告的外部路由,并优选了它,那流量就在R1和R2之间来回弹。这就是典型的回灌故障。
2.2 次优路径:明明有直达路,非要绕半个网
还有一种很常见的现象,路由确实能通,但路径不对。比如R3同时连接到OSPF域和IS-IS域。IS-IS域内有一条去往192.168.80.0/24的直连路由,R3把它引入OSPF。OSPF域内有另一条去往同一网段的路径,需要多经过两台设备。
按照OSPF的外部路由默认优先级150,和另一条OSPF域内普通路由优先级10来比,显然是普通路由更优。但问题出在,多向重分布环境下,某台设备可能会通过IS-IS外部路由学到更优的优先级数字(IS-IS优先级15),于是优先选择了IS-IS路径。结果所有去往192.168.80.0/24的数据,明明可以直接走OSPF内部路径,却都绕进了IS-IS域再出来,延迟和带宽占用都对应飙升。这个问题极难发现,因为网络是通的,Ping也通,路径长短不在日常监控里轻易体现。
2.3 度量值失真:不同协议之间没有“汇率”
每个动态路由协议对“距离”的定义都不一样。OSPF用的是开销(Cost),基于接口带宽计算,千兆接口默认Cost是1。IS-IS的默认度量是10,RIP是跳数(最大15跳)。
把OSPF的Cost 1路由引入RIP后,这条路由的度量值怎么算?华为设备默认给一个规定的种子度量值,通常RIP是1,IS-IS是0(表示该路由会被通告为默认值),OSPF是1。这个转换实际上是生硬的,不能反映真实的链路质量。在多向重分布环境下,一台路由器可能同时从多个方向收到同一目的地的重分布路由,由于度量值都被重置过,设备往往无法判断哪条路径真正短,只能根据默认优先级来选路,结果就选了绕路的那条。
2.4 优先级冲突:协议优先级决定路由表归属
华为VRP平台各协议默认优先级建立了一张内部排序表,大致关系是:直连接口0、OSPF内部10、IS-IS内部15、静态60、RIP 100、OSPF外部150。这张表是选路的最终裁决者。
理解了这张表就不难理解,当OSPF内部路由和重分布进来的IS-IS路由同时存在,为什么设备总是把IS-IS那条放进路由表——因为IS-IS内部15小于OSPF外部150,但也可能小于OSPF内部?不,OSPF内部是10,是比IS-IS小的。但如果OSPF那条是外部路由(优先级150),那IS-IS就会胜出。在多向重分布中,重分布后的路由大多是“外部路由”,优先级数字天然吃亏,而IS-IS外部路由的优先级其实是15,它并不区分外部内部。这就会造成大量本不该优选的路由被选进了路由表。
3. 动手配置前,先想清楚这三件事
3.1 明确谁是种子路由器:入口路由器和出口路由器分开看
种子路由器(Seed Router)是重分布行为的执行者。你在一台设备上配置“import-route ospf”,这台设备就是把OSPF路由引入其他协议的桥头堡。
在多向重分布中,一定要理清“入口”和“出口”。比如R1把OSPF路由引入IS-IS,那R1就是OSPF域到IS-IS域的入口。R2把IS-IS路由引入OSPF,那R2就是IS-IS域到OSPF域的入口。如果R1和R2同时配置了双向重分布,那每个方向都有两个入口,这时候防环策略必须是双向的,不能只在一边做。
我个人的习惯是:先把拓扑图和协议边界画出来,然后在每台设备上标注三个信息——本机参与哪些协议、哪些接口属于哪个协议、重分布命令配置在哪几个协议视图下。如果你发现自己要在两台设备上各写四条import-route,那你基本已经进入多向重分布的高危区,接下来的每一步都要更谨慎。
3.2 规划度量值和Tag标记
华为设备的重分布命令允许指定度量值。例如:
ospf 1 import-route isis 1 cost 20 tag 200这条命令的意思是把IS-IS路由引入OSPF进程1,Cost设为20,同时打上Tag 200。Tag是一个附加在路由上的标记值,它不参与选路,但可以用来做过滤。
规划阶段,我强烈建议给不同方向的重分布路由打上不同的Tag。比如:从IS-IS引入OSPF的路由打Tag 100,从OSPF引入IS-IS的路由打Tag 200,从RIP引入OSPF的路由打Tag 300。这样一旦出了问题,你可以通过display ip routing-table看到路由的Tag值,快速判断这条路由是被哪个方向引入的,排查效率提升一个量级。
3.3 过滤策略怎么设计:宁可多写两条rule,不可图省事
过滤策略是多向重分布最核心的防环手段。常用的过滤方式有三种:
- 基于前缀的过滤:用ip-prefix匹配特定网段,只允许需要的路由重分布。
- 基于Tag的过滤:用route-policy匹配Tag值,拒绝特定方向的路由。
- 基于ACL的过滤:适合按源IP、目的IP等复杂条件筛选。
具体操作上,通常是在import-route命令中调用route-policy,在route-policy里同时写匹配条件和动作。
route-policy DENY-TAG100 deny node 10 if-match tag 100 route-policy DENY-TAG100 permit node 20这里node 10拒绝Tag 100的路由,node 20放行其他所有路由。注意route-policy默认末尾隐含拒绝所有,所以必须写一个permit node 20来兜底,这是很多人会忽略的细节。
4. 实操模拟:双点双向OSPF与IS-IS重分布
4.1 模拟环境拓扑与需求
为了把整个配置流程讲透,我搭一个简化的三段拓扑:
- 核心路由器R1:同时运行OSPF进程1和IS-IS进程1,在两台设备间做重分布。
- 核心路由器R2:同时运行OSPF进程1和IS-IS进程1,同样做重分布。
- 区域路由器R3:运行OSPF进程1,连接到R1和R2,模拟OSPF内部区域。
- 区域路由器R4:运行IS-IS进程1,连接到R1和R2,模拟IS-IS区域。
R1连接R3的接口属于OSPF区域0,连接R4的接口属于IS-IS。R2的连接方式类似。网络地址规划:OSPF域内loopback 1.1.1.1/32(R3),IS-IS域内loopback 4.4.4.4/32(R4)。要求两个域之间能够互相访问。
先说结论:这个拓扑如果不加任何防环策略,百分之百出回灌和次优路径问题。因为R1和R2各自学习到的OSPF路由都会被对方从IS-IS里再学回来,然后重新注入OSPF,形成环路。接下来每一步都围绕防环展开。
4.2 第一步:配置基础协议
R3的OSPF配置:
ospf 1 router-id 3.3.3.3 area 0.0.0.0 network 10.1.0.0 0.0.255.255 network 1.1.1.1 0.0.0.0R4的IS-IS配置:
isis 1 network-entity 49.0001.0000.0000.0004.00 is-name R4 interface GigabitEthernet0/0/0 isis enable 1 interface LoopBack0 isis enable 1R1的OSPF和IS-IS配置:
ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.1.0.0 0.0.255.255 isis 1 network-entity 49.0001.0000.0000.0001.00 is-name R1 interface GigabitEthernet0/0/1 isis enable 1注意,这里有个核心点:R1连接R3的接口上启用了OSPF,连接R4的接口启用了IS-IS。如果你把R1和R2之间的互联接口同时加入两个协议,那么协议的邻居关系就会形成环路,故障隐患更大。在实际项目中,核心设备之间的互联链路通常只属于一个协议域,或者使用Loopback接口做协议邻居,千万避免将同一接口同时宣告进两个协议。
4.3 第二步:配置重分布并加上防环策略
这是最核心的环节。我们分步来。
在R1上,把IS-IS路由引入OSPF,同时给这些路由打Tag 100。另外,拒绝Tag 200的路由回灌:
route-policy IMPORT_ISIS_TO_OSPF permit node 10 if-match tag 200 deny route-policy IMPORT_ISIS_TO_OSPF permit node 20 apply tag 100这里要注意route-policy的匹配顺序。设备从上往下匹配node,node 10匹配到Tag 200的路由就直接deny,不会再进入node 20。如果node 10没匹配到,则进入node 20,给路由打上Tag 100。
然后配置OSPF进程下的重分布:
ospf 1 import-route isis 1 route-policy IMPORT_ISIS_TO_OSPF这里有一个关键细节:import-route命令如果不指定cost,默认外部路由的cost为1。对于某些场景这不是问题,但为了防止次优路由,建议显式指定一个合适的cost,并根据实际带宽去计算。例如:
import-route isis 1 cost 50 route-policy IMPORT_ISIS_TO_OSPF这样重分布到OSPF的路由在计算外部路由开销时就有基准。
在R1上,把OSPF路由引入IS-IS,打Tag 200,同时拒绝Tag 100的路由回灌:
route-policy IMPORT_OSPF_TO_ISIS permit node 10 if-match tag 100 deny route-policy IMPORT_OSPF_TO_ISIS permit node 20 apply tag 200 isis 1 import-route ospf 1 route-policy IMPORT_OSPF_TO_ISIS同样的逻辑在R2上必须再来一遍。请注意,这里的“拒绝Tag 100的路由”非常重要。为什么?因为R1已经把OSPF路由引入了IS-IS并打了Tag 200,如果R2把IS-IS路由再引入OSPF时不做过滤,那么这条Tag 200的路由会被重新注入OSPF,造成OSPF域内出现外部回灌路由。
反过来,R1把IS-IS路由引入OSPF时打了Tag 100,如果R2把OSPF路由引入IS-IS时不做过滤,Tag 100的路由也会被重新回到IS-IS域。所以必须在两个节点上双向都配置过滤,缺一个都白搭。
4.4 第三步:验证配置效果
配置完成后的第一件事,不是测试业务,而是查看路由表。在R1上执行:
display ip routing-table protocol ospf观察是否有来自R2重分布的OSPF外部路由。正常情况下,应该只能看到R3的OSPF内部路由,不应该看到R4网段被作为OSPF外部路由学习到(因为我们已经通过tag过滤阻止了IS-IS回灌)。
接着在R1上执行:
display ip routing-table protocol isis这里应该能看到R4的loopback路由,来源是IS-IS。到R3上ping 4.4.4.4,应该能通。同时查看路径,看R3去4.4.4.4的下一跳是R1还是R2。用tracert命令实测:
tracert 4.4.4.4如果下一跳是R1,说明路径符合预期。如果下一跳绕到了R2,说明OSPF域内出现了次优的外部路由。
此时还要检查R1和R2之间是否会持续同步路由,通过抓包或查看邻居状态确认OSPF和IS-IS邻居都稳定,没有反复震荡。如果邻居状态频繁在Full和Down之间切换,多半是路由回灌导致的下一跳不可达。
4.5 验证后的优化:修改优先级还是修改度量值
重分布环境里,如果发现重要路由选路不符预期,我们有两个调整方向。
第一个方向是调整协议优先级。华为设备支持用命令修改协议的优先级,例如:
ospf 1 preference 20这会把整个OSPF进程的优先级从10调整为20。注意,这是全局修改,会影响所有OSPF路由的选路,可能引发新的问题。我更推荐做法是只调整特定路由的优先级:
ip ip-prefix PREFER_4_4_4_4 permit 4.4.4.4 32 route-policy SET_PREF permit node 10 if-match ip-prefix PREFER_4_4_4_4 apply preference 5 ospf 1 preference route-policy SET_PREF通过route-policy实现只把R4的loopback路由优先级调高,其他路由保持默认,影响范围可控。
第二个方向是调整度量值,让设备在选路时优先选择Cost小的路径。修改重分布命令里的cost参数即可,比如把R1引入OSPF的cost从50改成10,让R1方向更优。具体数值需要结合跨域链路的带宽情况来测试,一般建议从成本较低的路径开始,向外逐步调整,每次改动后都要通过display ip routing-table观察下一跳变化,再配合持续ping观察丢包情况。
提示:多向重分布环境下,任何关于优先级或度量值的修改都是牵一发动全身。改动之前先保存当前配置,最好通过抓包或display命令记录改动前的路径状态,否则中途出现异常很难回退。
5. 实战排查:多向重分布故障定位的几条命令
5.1 判断是否存在环路:ping + tracert的双重确认
最简单直接的环路判断方法是ping目标地址,观察TTL值。如果TTL持续减小,甚至出现TTL等于1时返回Destination Host Unreachable的情况,说明数据包在设备之间反复循环,TTL逐跳递减直到为0。正常路径的TTL应该保持稳定区间,比如从32开始,每经过一跳减1,最终稳定在一个固定值。
tracert是用来定位具体绕行路径的利器。当ping目标地址时延时高、抖动大,优先执行:
tracert -a 1.1.1.1 4.4.4.4输出会列出每一跳设备的IP地址。如果看到R1和R2的IP地址出现了两次甚至三次,且路径明显不是最短路径,基本可以判定多向重分布导致的路由环路或次优路径。
5.2 查看路由表和Tag标记
在核心路由器R1上执行:
display ip routing-table 4.4.4.4 32 verbose重点看两个地方:第一,这条路由的Protocol字段是什么,是OSPF还是IS-IS;第二,Route-tag字段是什么,如果是100或200,说明这条路由是经过重分布引入的。结合Tag值可以反推出是从哪个方向引入的,再对照拓扑图定位故障节点。
5.3 查看协议邻居状态和收发路由数量
多向重分布配置不当,最常见的一个副作用是邻居关系反复震荡。检查方法:
display ospf peer display isis peer如果OSPF或IS-IS的邻居停留在Down、Init或ExStart等中间状态,说明这两台设备间有路由环路或协议报文处理异常。同时执行:
display ospf routing display isis route对比收发路由数量,如果某种协议的路由数量异常大,往往是因为重分布导致大量无效路由灌入。比如IS-IS路由表里出现了OSPF域内的内部主机路由,说明回灌已经发生了。
5.4 事件日志排查
华为设备支持通过日志信息查看路由变化记录:
display logbuffer重点查找包含“Route”和“Interface”关键字的日志,特别是接口状态频繁Up/Down的记录,这通常是环路导致下一跳不可达的间接表现。
6. 防环与优化:多向重分布的几种实用解法
6.1 方案一:Tag标记 + 双向过滤(最通用)
前面实操环节用到的就是这种方法:每个方向打不同Tag,对方向相反的Tag做拒绝。这种方案的优势是通用性强,对设备性能压力小,适合大多数双点双向场景。关键是Tag规划要统一,并且每台核心设备上都要成对创建过滤策略,不能省。
6.2 方案二:route-policy精确控制重分布路由范围
如果你的网络里存在大量不需要跨域的路由,比如OSPF域内的某些Loopback应该只留在本地,不进入IS-IS域,可以通过前缀列表做严格限制:
ip ip-prefix TO_ISIS deny 10.99.0.0 16 greater-equal 17 ip ip-prefix TO_ISIS permit 0.0.0.0 0 less-equal 32 route-policy IMPORT_OSPF_TO_ISIS permit node 10 if-match ip-prefix TO_ISIS这样比单纯用Tag过滤更精细,但维护复杂度也更高,适合网络规模大、路由前缀多且明确的场景。
6.3 方案三:修改AD值实现“单向偏好”
在OSPF与IS-IS并存的双点双向重分布中,有时我们希望某一边的路由永远优先生效,但又不希望影响全局的路由优先级。可以用前面提到的preference route-policy,只对特定前缀做优先级调整。这种解法在处理“业务主备切换”需求时非常好用,比如正常情况下所有流量走主链路,当主链路故障时,自动切换到备用协议域,通过调整备用域重分布路由的优先级来实现。
6.4 什么时候不要用重分布
不是所有场景都适合重分布来解决。如果协议域之间只是简单互访需求,推荐优先考虑隧道方式,比如在核心路由器间建立GRE隧道,把一端协议封装在另一端协议里,这样既不需要复杂防环策略,也更稳定。另一种做法是在边界设备上使用静态路由手动指定跨域路径,适用于跨域路由数量少且固定的场景。重分布适合路由数量多、拓扑变化频繁、需要自动收敛的网络环境,一旦域间路由数量稀少,手动静态路由的可靠性反而更高。
7. 个人项目心得:重分布的三个“反直觉”经验
第一个“反直觉”是:重分布配置越少越安全。很多刚接触HCIP的工程师会认为,多向重分布就是把所有协议互相引入,写得越多越稳。实际上每一条import-route都在引入新的外部路由,同时也为回灌打开了一扇门。如果不需要跨域访问的路由,坚决不引入,可用前缀列表过滤掉。
第二个“反直觉”是:故障排查时,tracert比ping好用得多。ping只能告诉你通不通,tracert能告诉你数据到底走了哪条路。多向重分布的环路和次优路径故障,tracert的输出基本能直接定位问题设备。我在模拟环境里抓过好几次环路,每次都是靠tracert确认是R1和R2之间在反复横跳。
第三个“反直觉”是:Tag标记并非可有可无。很多考试实验题不要求打Tag,但实际网络里打了Tag,故障定位效率直接翻倍。我自己维护的网络里,每一条重分布路由都有明确Tag,出问题查一下路由表就知道是谁引进来的,不用对着拓扑图猜。这也是我在大型网络割接里总结出来的最值得推荐的实践经验。