
1. 路由重分发到底在解决什么问题第一次接触OSPF路由重分发是在一个企业网改造项目里。当时网络里跑着三种路由协议核心层是OSPF两个老机房还留着RIP出口边界跑的是静态路由。业务部门要求全网互通但没人愿意动老机房的配置。摆在我面前的路只有一条在边界设备上做路由重分发让不同协议之间能够互相“听懂”对方的路由信息。路由重分发Route Redistribution说白了就是路由协议之间的翻译官。每种路由协议都有自己的度量标准——OSPF用开销CostRIP用跳数Hop Count静态路由没有度量值。它们各自维护一张路由表互不相通。重分发的核心工作就是从一种协议的路由表里取出路由条目按照目标协议的规则重新计算度量值然后注入到目标协议的路由表中。这个技术解决的核心问题是多协议共存环境下的全网可达性。你可能会问为什么不干脆全网统一跑一种协议现实情况往往没那么理想。老设备可能不支持新协议不同厂商的设备对同一协议的实现有差异收购合并后的网络架构需要逐步融合这些场景都逼着你必须掌握重分发。适合阅读这篇内容的人有一定路由基础、正在做网络整合或改造的运维工程师准备网络方向认证考试、需要理解重分发原理的学员以及在实际工作中遇到了次优路径、路由环路等问题想搞清楚重分发背后逻辑的技术人员。我会从设计思路讲到实操配置再到排错技巧尽量把踩过的坑都摊开来说。2. 重分发的整体设计与核心思路拆解2.1 为什么选择重分发而不是其他方案面对多协议共存的网络理论上你有三种选择第一种是全网统一协议把所有设备都改成跑OSPF第二种是用路由重分发在边界做协议翻译第三种是用隧道或GRE把不同协议封装起来。全网统一协议听起来最干净但实操中阻力最大。老设备可能性能不够跑OSPF业务窗口期不允许大面积变更不同团队维护的区域协调成本极高。隧道方案适合点对点场景但大规模网络里隧道数量会爆炸式增长维护复杂度直线上升。重分发的优势在于改动范围小、影响可控。你只需要在边界设备上配置重分发策略不需要动内部网络的任何配置。而且重分发点就是天然的流量控制点你可以通过路由策略精确控制哪些路由可以被注入、以什么度量值注入灵活性非常高。但重分发也有代价。它引入了单向或双向的路由注入如果设计不当很容易产生次优路径甚至路由环路。所以核心思路是明确重分发方向控制路由注入范围设置合理的度量值和路由标记。2.2 单向重分发与双向重分发的选择逻辑单向重分发是指只在一个方向上注入路由。比如OSPF域内的路由注入到RIP域但RIP域的路由不注入回OSPF。这种模式适合星型拓扑或层次化网络核心协议掌握所有路由信息边缘协议只需要知道如何回到核心即可。双向重分发是在两个方向上互相注入路由。这适合两个协议域需要对等通信的场景。但双向重分发是路由环路的温床必须配合路由过滤和度量值调整来使用。我个人的经验是能单向就绝不双向。如果业务需求只是让RIP域能访问OSPF域的资源那就只做OSPF到RIP的单向注入然后在RIP域里配置一条默认路由指向OSPF边界。这样既满足了需求又避免了双向注入带来的环路风险。2.3 度量值继承与种子度量的设计重分发时最核心的参数就是种子度量值Seed Metric。目标协议无法直接理解源协议的度量值所以你必须手动指定一个初始值。不同协议的种子度量值要求不同目标协议种子度量值格式常用默认值说明RIP跳数0-151超过15跳不可达OSPF开销1-1677721420默认从BGP重分发为20EIGRP带宽/延迟/可靠性/负载/MTU需完整指定格式最复杂种子度量值的设计直接影响路径选择。如果你把OSPF重分发到RIP的种子度量值设为1那么所有OSPF路由在RIP域看来都是1跳RIP域内的路由器就无法区分哪条路径更优。这时候需要配合**偏移列表Offset-list**来调整特定路由的跳数。OSPF的种子度量值设计更微妙。OSPF外部路由默认是E2类型度量值在重分发点指定后整个OSPF域内都不会改变。如果你希望外部路由的度量值能够随着内部路径开销累加需要把路由类型设为E1。E1和E2的区别是E1的度量值等于种子度量值加上内部路径开销E2的度量值始终等于种子度量值。2.4 路由标记与过滤策略的配合路由标记Route Tag是重分发中的隐形利器。你可以在重分发时给路由打上标记然后在另一个重分发点根据标记做过滤防止路由被重新注入回源协议。举个例子OSPF和RIP双向重分发。OSPF的路由注入RIP时打上标记100RIP的路由注入OSPF时打上标记200。然后在OSPF到RIP的重分发点过滤掉标记为200的路由在RIP到OSPF的重分发点过滤掉标记为100的路由。这样就避免了路由在两个协议之间无限循环。路由过滤的手段有很多种分发列表Distribute-list、前缀列表Prefix-list、路由映射Route-map。分发列表适合简单的ACL过滤前缀列表适合精确匹配网段路由映射最灵活可以同时匹配前缀、标记、下一跳等多个条件。3. 核心细节解析与实操要点3.1 OSPF重分发到其他协议的关键参数把OSPF路由重分发到RIP或EIGRP时有几个参数必须搞清楚。subnets关键字是OSPF重分发中最容易遗漏的选项。不加subnets只有主类网络路由会被重分发所有子网路由都会被丢弃。比如10.1.1.0/24这条路由如果不加subnets它不会被注入到目标协议。这个坑我踩过不止一次明明配置看起来没问题但目标协议就是学不到明细路由排查半天才发现是少了这个关键字。metric-type参数决定外部路由是E1还是E2。E2是默认值适合大多数场景。E1适合需要精确反映内部路径开销的场景比如多条路径到达重分发点时E1可以让路由器选择内部开销最小的路径。route-map参数用于精确控制哪些路由被重分发。你可以匹配特定的前缀列表、路由标记或下一跳地址。在生产环境中我强烈建议永远不要裸重分发必须配合route-map做过滤。裸重分发意味着OSPF域内所有路由都会被注入到目标协议包括那些不需要互通的路由这会增加目标协议的路由表规模也可能引发安全问题。3.2 其他协议重分发进OSPF的注意事项把RIP、EIGRP或静态路由重分发进OSPF时需要注意以下几点。种子度量值必须指定。OSPF的默认种子度量值是20但你可以根据实际网络情况调整。如果重分发点到达目的地的实际开销远大于20那么所有外部路由在OSPF域内看来都是“近”的可能导致次优路径。建议把种子度量值设置为接近实际路径开销的值。metric-type的选择同样重要。E2路由在OSPF域内传播时度量值不变这可能导致OSPF域内的路由器无法感知到重分发点之后的路径变化。E1路由会累加内部开销更适合需要精确路径选择的场景。tag标记用于防止环路。当OSPF和另一个协议双向重分发时给从另一个协议注入的路由打上标记然后在OSPF重分发到该协议时过滤掉这些标记的路由。forward-address是OSPF外部路由的一个特殊字段。当重分发点不是最优下一跳时forward-address可以指定一个更好的下一跳地址。这个字段在NBMA网络或帧中继环境中特别有用但在现代以太网环境中通常不需要手动设置。3.3 路由过滤与防环的实操配置防环是重分发设计的重中之重。我通常采用三层防护策略。第一层是路由标记。在重分发时给路由打上唯一标记在反向重分发时过滤掉这些标记的路由。配置示例如下! 在OSPF到RIP的重分发点 route-map OSPF-to-RIP deny 10 match tag 200 route-map OSPF-to-RIP permit 20 set tag 100 ! router rip redistribute ospf 1 route-map OSPF-to-RIP第二层是前缀列表过滤。明确指定哪些网段允许被重分发其余全部拒绝。这比ACL更直观也更容易维护。ip prefix-list ALLOWED-NETS seq 10 permit 10.1.0.0/16 le 24 ip prefix-list ALLOWED-NETS seq 20 permit 10.2.0.0/16 le 24 ! route-map OSPF-to-RIP permit 10 match ip address prefix-list ALLOWED-NETS set tag 100第三层是管理距离调整。当同一目的地从多个协议学习到时管理距离决定哪条路由被优选。OSPF的管理距离是110RIP是120EIGRP内部路由是90。如果重分发配置不当可能导致路由从错误的协议被优选。必要时可以手动调整管理距离来纠正路径选择。3.4 重分发点的选择与冗余设计重分发点选在哪里直接影响网络的可靠性和性能。单点重分发是最简单的设计所有协议翻译都在一台边界设备上完成。优点是配置集中、易于管理缺点是这台设备成为单点故障。如果它宕机两个协议域之间的通信就断了。多点重分发是在两台或多台边界设备上同时做重分发。这提供了冗余但引入了新的问题路由可能从多个点被注入导致次优路径或环路。多点重分发必须配合路由标记和管理距离调整来确保路径一致性。我的建议是如果业务对中断时间敏感必须做多点重分发。但多点重分发的配置复杂度是单点的三倍以上需要仔细规划每个点的重分发方向和过滤策略。一个实用的技巧是主重分发点做双向重分发备用重分发点只做单向重分发通过管理距离确保主路径优先备用路径只在主路径失效时生效。4. 实操过程与核心环节实现4.1 实验环境搭建与基础配置为了把重分发的配置讲清楚我用一个模拟环境来演示。这个环境包含三个路由域OSPF域、RIP域和静态路由域。拓扑结构如下R1和R2运行OSPF属于Area 0R2和R3之间运行RIPR3上有一条静态路由指向外部网络R2是重分发点负责OSPF和RIP之间的路由翻译R3负责RIP和静态路由之间的重分发基础配置先搞定接口IP和协议启用! R1 OSPF配置 router ospf 1 router-id 1.1.1.1 network 10.1.1.0 0.0.0.255 area 0 network 10.1.2.0 0.0.0.255 area 0 ! ! R2 OSPF和RIP配置 router ospf 1 router-id 2.2.2.2 network 10.1.2.0 0.0.0.255 area 0 ! router rip version 2 no auto-summary network 10.2.1.0 ! ! R3 RIP和静态路由配置 router rip version 2 no auto-summary network 10.2.1.0 network 10.2.2.0 ! ip route 172.16.1.0 255.255.255.0 10.2.2.2这个基础配置完成后R1只能学到OSPF域内的路由R3只能学到RIP域内的路由R2虽然同时运行两个协议但两个协议的路由表是独立的不会互相注入。4.2 OSPF到RIP的单向重分发配置先做最简单的场景让RIP域能够访问OSPF域的路由。在R2上配置OSPF到RIP的重分发router rip redistribute ospf 1 metric 3 route-map OSPF-to-RIP ! route-map OSPF-to-RIP permit 10 match ip address prefix-list OSPF-NETS set tag 100 ! ip prefix-list OSPF-NETS seq 10 permit 10.1.0.0/16 le 24这里有几个关键点metric 3表示注入到RIP的路由跳数为3。为什么是3而不是1因为R2到达OSPF域内最远网段的实际跳数大约是2-3跳设为3更接近真实情况。如果设为1RIP域内的路由器会认为所有OSPF路由都是直连的可能导致流量都涌向R2。route-map配合prefix-list确保只有10.1.0.0/16网段的路由被注入其他路由比如OSPF域内可能存在的其他网段不会被泄露到RIP域。set tag 100给注入的路由打上标记为后续可能的双向重分发做准备。配置完成后在R3上查看RIP路由表应该能看到10.1.1.0/24和10.1.2.0/24这两条路由跳数为3。4.3 RIP到OSPF的单向重分发配置接下来做反方向让OSPF域能够访问RIP域的路由。在R2上配置RIP到OSPF的重分发router ospf 1 redistribute rip subnets metric 50 metric-type 1 route-map RIP-to-OSPF ! route-map RIP-to-OSPF permit 10 match ip address prefix-list RIP-NETS set tag 200 ! ip prefix-list RIP-NETS seq 10 permit 10.2.0.0/16 le 24subnets关键字必须加否则只有主类网络路由会被重分发。10.2.1.0/24是子网不加subnets就不会被注入OSPF。metric 50是种子度量值。OSPF的度量值是基于带宽的50大约对应100Mbps链路的开销。你可以根据实际链路带宽调整这个值。metric-type 1表示注入的路由是E1类型度量值会累加内部路径开销。如果你希望度量值固定不变用metric-type 2。配置完成后在R1上查看OSPF路由表应该能看到10.2.1.0/24和10.2.2.0/24这两条外部路由标记为E1度量值为50加上R1到R2的内部开销。4.4 双向重分发的防环配置如果业务需要两个协议域对等通信就必须做双向重分发。但双向重分发必须配合防环措施。在R2上OSPF到RIP的重分发点需要过滤掉从RIP学到的路由标记为200RIP到OSPF的重分发点需要过滤掉从OSPF学到的路由标记为100。修改后的配置! OSPF到RIP的重分发 route-map OSPF-to-RIP deny 5 match tag 200 route-map OSPF-to-RIP permit 10 match ip address prefix-list OSPF-NETS set tag 100 ! ! RIP到OSPF的重分发 route-map RIP-to-OSPF deny 5 match tag 100 route-map RIP-to-OSPF permit 10 match ip address prefix-list RIP-NETS set tag 200deny 5的序列号比permit 10小所以先匹配deny规则。标记为200的路由是从RIP注入到OSPF的不应该再被注入回RIP。同理标记为100的路由是从OSPF注入到RIP的不应该再被注入回OSPF。这个配置看起来简单但实际排错时很容易搞混标记的方向。我的经验是标记的命名要带方向比如OSPF-TO-RIP用100RIP-TO-OSPF用200这样看到标记就能想起它是从哪来的。4.5 静态路由重分发进OSPF的配置R3上有一条静态路由172.16.1.0/24需要让OSPF域也能访问。这需要在R3上把静态路由重分发进RIP然后在R2上RIP的路由再重分发进OSPF。R3的配置router rip redistribute static metric 2 route-map STATIC-to-RIP ! route-map STATIC-to-RIP permit 10 match ip address prefix-list STATIC-NETS set tag 300 ! ip prefix-list STATIC-NETS seq 10 permit 172.16.1.0/24静态路由重分发进RIP时metric 2表示跳数为2。这个值应该设置为R3到达静态路由下一跳的实际跳数。然后在R2上RIP到OSPF的重分发会自动把这条路由标记为300也注入到OSPF。但要注意RIP-NETS前缀列表需要包含172.16.1.0/24否则这条路由会被过滤掉。ip prefix-list RIP-NETS seq 10 permit 10.2.0.0/16 le 24 ip prefix-list RIP-NETS seq 20 permit 172.16.1.0/244.6 验证与调试命令速查配置完成后必须逐项验证。我常用的验证命令如下命令作用关键看什么show ip route查看路由表是否有预期路由度量值是否正确show ip ospf database external查看OSPF外部LSA外部路由是否被正确注入show ip rip database查看RIP数据库RIP是否学到了重分发路由show route-map查看路由映射配置匹配规则和设置动作是否正确debug ip routing实时调试路由变化路由添加/删除的实时日志traceroute路径追踪实际转发路径是否符合预期验证时我习惯从源头开始查先在重分发点确认路由被正确注入然后在邻居设备确认路由被正确学习最后在远端设备确认路由可达。这样逐跳排查能快速定位问题出在哪一环。5. 常见问题与排查技巧实录5.1 重分发后路由丢失的排查思路路由丢失是重分发中最常见的问题。可能的原因有五六种我按排查优先级列出来。第一检查subnets关键字。OSPF重分发时如果不加subnets所有子网路由都会被丢弃。这个问题的典型现象是主类网络路由如10.0.0.0/8能学到但明细路由如10.1.1.0/24学不到。解决方法就是在redistribute命令后加上subnets。第二检查路由过滤策略。route-map、distribute-list、prefix-list任何一层过滤都可能导致路由被丢弃。排查方法是临时移除过滤策略看路由是否出现。如果出现了再逐层加回过滤策略定位是哪一层的问题。第三检查种子度量值。如果种子度量值超过了目标协议的最大值比如RIP的15跳路由会被视为不可达。检查redistribute命令中的metric参数是否在合理范围内。第四检查管理距离。如果同一目的地从多个协议学习到管理距离大的路由会被隐藏。用show ip route命令查看是否有路由被标记为“possibly down”或没有出现在路由表中。第五检查接口状态。重分发依赖接口up/up状态。如果源协议的接口down了对应的路由会从路由表中消失重分发自然也就无从谈起。5.2 次优路径的产生原因与修正次优路径是重分发设计不当的典型后果。现象是流量没有走最优路径而是绕了一圈。产生次优路径的根本原因是度量值不一致。比如OSPF域内到达某个目的地有两条路径一条是内部路径开销为10另一条是外部路径种子度量值为20。OSPF会优先选择内部路径因为10小于20。但如果内部路径实际上比外部路径更慢就产生了次优路径。修正次优路径的方法有几种调整种子度量值。把外部路由的种子度量值调低使其在OSPF域内更有竞争力。但要注意不要调得过低否则可能引发环路。调整metric-type。把E2改为E1让外部路由的度量值累加内部开销这样OSPF域内的路由器能更准确地比较路径开销。调整管理距离。如果次优路径来自不同的协议可以调整管理距离来改变优选顺序。比如OSPF的管理距离是110你可以把特定路由的管理距离调低到100使其优先于其他OSPF路由。使用路由映射修改度量值。在重分发点用route-map的set metric命令修改特定路由的度量值实现精细化的路径控制。5.3 路由环路的识别与紧急处理路由环路是重分发最危险的问题。现象是路由在多个协议之间循环注入度量值不断累加最终导致网络瘫痪。识别路由环路的信号路由表中出现度量值异常大的路由比如RIP跳数接近15traceroute显示路径在两个点之间来回跳设备CPU利用率飙升路由表频繁更新网络时延急剧增加丢包严重紧急处理方法立即断开其中一个重分发点。如果是双向重分发先关掉一个方向的重分发打破环路。清除路由表。用clear ip route *命令清除动态路由让路由重新收敛。检查路由标记。确认防环的标记过滤是否生效标记方向是否正确。检查管理距离。确认没有因为管理距离配置错误导致路由从错误的协议被优选。预防路由环路的根本方法是做好路由标记和过滤。我个人的习惯是任何双向重分发场景必须配置路由标记并且在两个重分发点都配置基于标记的过滤。没有标记过滤的双向重分发就是在埋雷。5.4 重分发配置检查清单每次配置完重分发我都会对照这个清单逐项检查检查项检查内容常见错误重分发方向单向还是双向误配双向导致环路subnets关键字OSPF重分发是否加了subnets子网路由丢失种子度量值是否在目标协议允许范围内RIP跳数超过15metric-typeE1还是E2次优路径路由标记是否设置了唯一标记环路过滤策略是否过滤了反向注入的路由环路管理距离是否需要调整次优路径接口状态源协议接口是否up路由丢失这个清单看起来简单但每一条都对应着我实际踩过的坑。特别是subnets关键字和路由标记这两个是最容易遗漏的。5.5 重分发性能优化与最佳实践重分发配置不当会影响设备性能。路由表规模过大、频繁的路由更新、复杂的route-map匹配都会消耗CPU和内存资源。控制路由注入范围。只重分发必要的路由不要把所有路由都注入。用prefix-list精确匹配需要互通的网段其余全部拒绝。减少路由更新频率。在重分发点配置路由汇总减少注入的路由条目数量。OSPF可以在ABR上做区域间路由汇总RIP可以在接口上做路由汇总。使用distribute-list控制更新。在不需要接收某些路由的接口上配置distribute-list in减少路由表规模。避免在低性能设备上做重分发。重分发需要维护额外的路由表和过滤策略对设备性能有一定要求。如果边界设备性能不足考虑用专用路由器或三层交换机来做重分发。定期审查重分发配置。网络变更后重分发配置可能变得冗余或冲突。建议每季度审查一次重分发配置清理不再需要的路由注入和过滤策略。5.6 从实际项目中学到的经验做过的重分发项目里有几个教训印象特别深。教训一永远不要在生产环境直接配置双向重分发。我见过一个项目工程师在核心设备上直接配了OSPF和EIGRP的双向重分发没有做任何过滤。结果两条默认路由在协议之间循环注入度量值不断累加半小时后网络瘫痪。后来在实验室环境复现了这个问题才明白默认路由的重分发必须特别小心。教训二路由标记的编号要有规律。早期做重分发时标记编号随手写时间一长就忘了哪个标记代表什么。后来养成习惯标记编号按协议对来分配比如OSPF-to-RIP用100RIP-to-OSPF用200OSPF-to-EIGRP用300EIGRP-to-OSPF用400。这样看到标记就能想起它的来源和方向。教训三重分发点的冗余设计要考虑路径一致性。两台边界设备做重分发时如果一台的种子度量值是20另一台是50那么流量会优先走第一台。如果第一台宕机流量切换到第二台但路径可能不是最优的。解决方法是统一两台设备的种子度量值或者用管理距离来确保路径一致性。教训四文档比配置更重要。重分发配置的复杂度在于逻辑关系而不是命令本身。如果没有文档记录重分发方向、标记编号、过滤策略三个月后你自己都看不懂当时的配置。我现在做重分发项目一定会画一张重分发逻辑图标注每个重分发点的方向、标记、过滤策略和种子度量值。这张图比任何配置命令都有价值。