多向路由重分布防环指南:OSPF与IS-IS互引避坑详解
多台路由器来回“搬路由”为什么越搬越乱年前帮某园区网做核心割接本来是双点双向重分布OSPF和IS-IS听起来就是个常规操作。结果配置完核心交换机上出了两条等价的跨协议路由业务访问时延忽高忽低排查到凌晨三点才发现是路由回灌导致的环路。那晚之后我就一直想写一篇关于“多向重分布”的文章把这类场景下的坑、排查思路、还有华为设备上的配置细节一次性讲清楚。如果你正在备考HCIP或者工作中已经遇到了多台路由器、多协议之间互相引入路由的场景这篇文章应该能帮你少走不少弯路。多向重分布的本质并不是“把路由互相拷贝一下”那么简单它背后是协议优先级冲突、度量值换算、防环机制缺失等一系列问题。下面我从原理到配置再到故障排查完整走一遍。1. 多向重分布到底在解决什么问题又带来了什么问题1.1 为什么需要重分布一个园区网里的“语言不通”先还原一个最常见的场景。假设你维护的园区网里核心层跑OSPF分支或合作伙伴那边跑IS-IS还有一部分遗留设备在用RIP。正常情况下OSPF区域内的设备彼此交换LSAIS-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-ISR2又从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/24R1从OSPF学到然后按照双向重分布的配置把它引入IS-IS。R2从IS-IS学到了这条路由同时也因为自己配置了双向重分布把它再引入OSPF。于是OSPF域内出现了两条10.1.1.0/24路由一条是原始的LSA另一条是R2以外部路由形式通告回来的。关键是R2通告的是外部路由cost通常被设成了默认值1反而比原始路径更优OSPF域内其他路由器就可能把去往10.1.1.0/24的流量转发给R2R2再按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的默认度量是10RIP是跳数最大15跳。把OSPF的Cost 1路由引入RIP后这条路由的度量值怎么算华为设备默认给一个规定的种子度量值通常RIP是1IS-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进程1Cost设为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/32R3IS-IS域内loopback 4.4.4.4/32R4。要求两个域之间能够互相访问。先说结论这个拓扑如果不加任何防环策略百分之百出回灌和次优路径问题。因为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的匹配顺序。设备从上往下匹配nodenode 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出问题查一下路由表就知道是谁引进来的不用对着拓扑图猜。这也是我在大型网络割接里总结出来的最值得推荐的实践经验。