做网络实验这么多年,要说哪个实验最容易“配完就通、通了又莫名其妙出问题”,路由重发布(Route Redistribution)绝对排前三。很多初学者把重发布理解成“在两个协议进程里各敲一句 redistribute”,结果拓扑里出现环路、次优路径,排查半天才发现是双向重发布惹的祸。这篇博文就围绕一个最经典的“重发布实验”展开,把为什么要做重发布、怎么做、做了之后会踩哪些坑、怎么排查,从头到尾捋一遍。适合正在学路由协议、准备网络认证考试,或者工作中要接触多种协议互通场景的网络工程师参考。
1. 重发布是什么:先搞清楚两个协议之间怎么“互相介绍路由”
1.1 为什么不同协议不能天然互通
路由协议的世界里,RIP、OSPF、IS-IS、BGP 各有各的“方言”。OSPF 用开销(Cost)算路径,RIP 用跳数(Hop Count)算路径,BGP 用路径属性来选路。协议之间既不明白对方的度量值含义,也看不懂对方的路由条目格式。更重要的是,默认情况下,一台路由器上即使同时运行了 OSPF 和 RIP,它也只会把各自学到的路由分别放进同一个路由表,绝不会主动把一个协议的路由“翻译”给另一个协议。
打个生活化的比方:你在一个单位里同时管着两个班组,一个班组用中文写日报,一个班组用日文写日报。你作为中间管理者如果不去翻译,两个班组互相之间就永远不知道对方每天干了什么。重发布(Redistribution)就是那个翻译动作——在边界路由器上,把一种路由协议学到的路由,转换成另一种协议能理解和传递的格式,然后注入到对方协议里去。
1.2 重发布的本质与适用场景
重发布的本质听起来简单,但牵扯的东西很多。它不只是“把路由A搬进协议B”这么机械,还涉及种子度量值(Seed Metric)怎么算、管理距离(AD)不一致导致的选路差异、以及防环机制如何建立。
常见的重发布场景主要有三类:
- 静态路由注入动态协议:比如一条指向出口网关的默认路由,通过 static 重发布进 OSPF,让全网都知道出口在哪。
- 直连网段注入动态协议:把路由器直连接口所在的网段,作为外部路由注入到 OSPF 或 RIP 中。
- 动态协议之间互相重发布:比如 OSPF 域和 RIP 域合并,或者公司并购后两个网络需要互通,这是最常见也最考验功底的场景。
第四个隐藏场景也值得注意:把 BGP 路由导入 IGP,或者把 IGP 路由导入 BGP,这在大型网络里同样普遍,但实验复杂度更高,一般作为进阶内容。
1.3 动手之前必须想清楚的四个问题
很多人在实验里翻车,不是命令敲错了,而是动手前没把思路理顺。做重发布之前,至少要回答这四个问题:
- 度量值如何换算?RIP 的跳数是16不可达,OSPF 的 Cost 可以到65535。将一个 OSPF Cost 为 10 的路由重发布进 RIP,跳数应该给几?这个需要实验者自己指定,协议不会自动换算。
- 管理距离会不会影响选路?OSPF 内部路由 AD 是 110,RIP 是 120。如果一条路由既可以通过 OSPF 学到,又可以通过 RIP 学到,路由器会优先信谁?这直接影响流量走哪里。
- 双向重发布会不会形成路由回馈?边界路由器把自己刚注入进去的路由又学回来,再重新注入到另一边,就可能形成环路。
- 需要控制哪些路由方向?是不是所有路由都要双向传递?有没有需要过滤掉的网段?现实网络中几乎一定需要过滤。
这四个问题想清楚了,配置命令反而只是手指工夫。
2. 实验拓扑与地址规划:别急着敲命令,先画图
2.1 最小可复现拓扑:三台路由器起手
重发布实验最忌讳“一口气把拓扑搭得很大”。我建议先用三台路由器搭一个最小的单边界拓扑,验证通信逻辑,再扩展到双边界拓扑来复现次优路径和路由回馈问题。
这里以常见网络设备为例,规划如下:
- R1 和 R2 之间跑 OSPF,区域 0。
- R2 和 R3 之间跑 RIP,版本2。
- R2 就是重发布边界路由器,同时运行两种协议。
- R1 的环回口 Lo0 模拟一个需要被全网访问的网段,R3 的环回口 Lo0 模拟另一个网段。
这个拓扑的好处是:R2 只有一个“翻译点”,路由传播路径清晰,适合先把基础配置跑通。后面要研究环路和次优路径时,可以再加一台 R4 作为第二个边界路由器,构成双点双向重发布。
2.2 地址与协议规划表
规划地址时建议把直连网段、环回口网段、协议归属都列清楚,避免后面配置时手忙脚乱。
| 设备 | 接口 | IP 地址 | 所属协议 | 用途 |
|---|---|---|---|---|
| R1 | Gi0/0 | 192.168.12.1/24 | OSPF | 连接 R2 |
| R1 | Lo0 | 10.0.1.1/32 | OSPF (network 10.0.1.1 0.0.0.0) | 模拟业务网段 A |
| R2 | Gi0/0 | 192.168.12.2/24 | OSPF | 连接 R1 |
| R2 | Gi0/1 | 192.168.23.2/24 | RIP | 连接 R3 |
| R3 | Gi0/0 | 192.168.23.3/24 | RIP | 连接 R2 |
| R3 | Lo0 | 10.0.3.3/32 | RIP (network 10.0.0.0) | 模拟业务网段 B |
采用 24 位掩码是因为实验环境里直连链路地址够用即可,环回口用 32 位掩码是模拟一个主机网段,这在实际网络里也很常见。
2.3 基础配置:先让两个协议各自跑起来
在配置重发布之前,先做基础配置,确保 OSPF 域内和 RIP 域内各自都能通信。下面是 R1、R2、R3 的基础配置示例:
! R1 interface GigabitEthernet0/0 ip address 192.168.12.1 255.255.255.0 no shutdown interface Loopback0 ip address 10.0.1.1 255.255.255.255 router ospf 1 router-id 1.1.1.1 network 192.168.12.0 0.0.0.255 area 0 network 10.0.1.1 0.0.0.0 area 0 ! R2 interface GigabitEthernet0/0 ip address 192.168.12.2 255.255.255.0 no shutdown interface GigabitEthernet0/1 ip address 192.168.23.2 255.255.255.0 no shutdown router ospf 1 router-id 2.2.2.2 network 192.168.12.0 0.0.0.255 area 0 ! R3 interface GigabitEthernet0/0 ip address 192.168.23.3 255.255.255.0 no shutdown interface Loopback0 ip address 10.0.3.3 255.255.255.255 router rip version 2 network 192.168.23.0 network 10.0.0.0 no auto-summary配置完这两段,先分别验证:R1 能 ping 通 192.168.12.2,R3 能 ping 通 192.168.23.2。然后看 R1 有没有 10.0.3.3 的路由?肯定没有。R3 有没有 10.0.1.1 的路由?也没有。因为重发布还没做,两个域是“孤岛”。这一步验证很重要,能让你确认问题是不是基础配置引起的。
3. 核心配置实操:先做单向,再做双向
3.1 第一步:把直连和静态路由重发布进协议(最安全的入坑方式)
先从最安全的方式入手:在 R2 上把直连网段重发布进 OSPF 和 RIP。这样不会产生环路,因为直连路由不可再被“学回来”。命令如下:
! R2 把直连接口网段注入 OSPF router ospf 1 redistribute connected subnets ! R2 把直连接口网段注入 RIP router rip version 2 redistribute connected metric 1注意一个关键差异:OSPF 的 redistribute connected 因为默认 seed metric 是 20,所以能直接生效。但 RIP 的默认 seed metric 是无穷大(16),如果不手动指定 metric 1,重发布的路由会被标记为不可达,R3 根本学不到。这就是“种子度量值”的第一个坑。
配置完,在 R1 上应该能看到 192.168.23.0 和 10.0.3.3 这两条路由,但它们的来源是 OSPF 外部路由(O E2),说明是重发布进来的。在 R3 上应该能看到 192.168.12.0 和 10.0.1.1,来源是 RIP。此时 R1 和 R3 的环回口已经互相能 ping 通了。
3.2 第二步:OSPF 与 RIP 之间的双向重发布
单点单向重发布只解决了“一边知道另一边”的问题。更常见的是双边都要通,所以要做双向重发布。在 R2 上增加两条命令:
router ospf 1 redistribute rip subnets router rip version 2 redistribute ospf 1 metric 1注意 OSPF 侧一定要带关键字 subnets,否则默认只重发布主类网络,10.0.1.1/32 这类子网路由传不进去。这也是一坑,后面排查部分细说。
配置完,R1 能看到去 10.0.3.3 的路由,R3 能看到去 10.0.1.1 的路由。至此,这个三路由器的小实验拓扑已经能“全网互通”。
3.3 种子度量值(Seed Metric)详解:为什么同一个命令效果不一样
种子度量值是一个很容易被忽略但极其重要的参数。它的含义是:当一条路由从一个协议被“翻译”到另一个协议时,在目标协议里初始拥有的度量值。不同协议对重发布路由的默认处理完全不同:
| 协议 | 默认种子度量 | 不手动指定时的效果 |
|---|---|---|
| OSPF | 20(BGP 重发布除外,为1) | 可以正常传递,但没法体现原协议的真实开销 |
| RIP | 16(不可达) | 路由学不到,必须手动指定 metric 1~15 |
| IS-IS | 0 | 可以传递,但默认开销为0,需要留意 |
| EIGRP | 无穷大 | 路由学不到,必须手动指定 metric 带宽/延迟/可靠性/负载/MTU |
这个设计不是随意的。RIP 把16视为无穷大,不给种子度量就默认不可达,逼迫网络工程师明确思考该路由在 RIP 域里应该占几个跳数。OSPF 则提供一个合理默认值20,让实验能跑通,但坏处是:所有外部路由看起来开销都一样,选路时无法区分近远。
因此,实操中我会习惯性在配置里加 default-metric 或者 redistribute 后的 metric 参数。比如:
router ospf 1 default-metric 10 router rip version 2 default-metric 3这样所有重发布进来的路由在各自协议里都统一了度量基准,不至于出现“RIP 域里所有外部路由都是同一个跳数”的尴尬情况。
4. 重发布之后的事:次优路径与路由回馈
4.1 路由回馈(Loop)是怎么发生的
双向重发布之后,最经典的问题就是路由回馈。以前面三台路由器拓扑为例,把时序拆开看:
- R1 把 10.0.1.1/32 通告给 R2(OSPF 内部路由)。
- R2 执行 redistribute ospf 1 metric 1,把这条路由注入 RIP,R3 通过 RIP 学到 10.0.1.1/32,下一跳是 192.168.23.2。
- 但 R3 的 RIP 域里还有自己的直连网段 192.168.23.0 和 10.0.3.3。R2 执行 redistribute rip subnets,把从 RIP 学到的 10.0.3.3/32 和 192.168.23.0/24 注入 OSPF。
- 问题在于:R2 的 RIP 进程里,除了 R3 通告的 10.0.3.3/32,会不会也包含它自己刚注入进去的 10.0.1.1/32?答案是会的。RIP 是距离矢量协议,R3 收到 10.0.1.1/32 的 RIP 通告后,会认为这是一条路径并继续向外通告(如果还有别的 RIP 邻居)。但实际上这条路由的始作俑者是 R2 自己,等于自己把自己说的话又听了一遍然后还要再复述一遍。
如果只有三台路由器,R3 没有第二个 RIP 邻居,环路不会持续扩散。但在双边界或多边界拓扑里,R2 注入到 RIP 的路由,可能通过 RIP 域里另一台边界路由器 R4 重新学回来,然后再通过 OSPF 传回去,形成一个完整的路由环路。这会导致什么后果?数据包在两个域之间反复跳转,直到 TTL 耗尽;路由表振荡,下一跳来回横跳;严重时 CPU 飙升,整台路由器卡死。这就是路由回馈的破坏力。
4.2 次优路径为什么危险
除了环路,次优路径也是一个“通而不优”的隐患。用一个扩展拓扑来说明:在 R2、R3 之间加一台 R4,R4 同时连接 OSPF 域和 RIP 域,构成双点双向重发布。此时,R3 要去 10.0.1.1/32,按理说最优路径是 R3 → R2 → R1,因为 R3 直连 R2。但如果 R4 也把这条路由重发布进了 RIP,R3 可能选择 R4 作为下一跳,因为 R4 那条路由的 RIP 跳数是 1(假设 R4 和 R3 直连),而直接从 R2 学到的也是 1,选路时可能陷入“看谁先通告”的随机局面。更糟的是,如果 R4 通过 OSPF 学到的外部路由 AD 是 110,而 R3 直接从 R2 学到的 RIP 路由 AD 是 120,那么 R3 反而会优先选 R4 作为下一跳,即使实际路径要绕路。
次优路径危险在于它往往“能通”,没有明显故障现象,只会表现为延迟升高、带宽浪费。排查这类问题,不能只盯着接口 up/down 和丢包率,要老老实实看路由表里的下一跳和来源。
4.3 规避手段一:distribute-list 做方向过滤
最直接的防回馈方法是在边界路由器上做路由过滤。例如在 R2 的 OSPF 进程中,拒绝把从 RIP 学到的路由中那些“本不该出现在 OSPF 域里”的路由重新注入回去。配置方式如下:
! 在 R2 上定义前缀列表:只允许把 R3 的环回口路由注入 OSPF ip prefix-list RIP_TO_OSPF permit 10.0.3.3/32 router ospf 1 redistribute rip subnets route-map FROM_RIP_TO_OSPF route-map FROM_RIP_TO_OSPF permit 10 match ip address prefix-list RIP_TO_OSPF这样 R2 只会把 10.0.3.3/32 从 RIP 重发布进 OSPF,而不会把 10.0.1.1/32 这种“自己人”的路由再次引入 OSPF,从根上截断了回馈。同理,在 RIP 侧也可以做反向过滤。
4.4 规避手段二:route-map + prefix-list 精细化控制
如果需要更精细控制——比如按照路由的 tag、下一跳或度量值来决定是否发布,route-map 就比单纯的 prefix-list 更合适。配置思路是:先定义 prefix-list 匹配目标网段,再用 route-map 绑定 match 和 set 动作。例如:
ip prefix-list BLOCK_LOOPED permit 10.0.0.0/8 ge 24 le 32 route-map OSPF_TO_RIP deny 10 match ip address prefix-list BLOCK_LOOPED route-map OSPF_TO_RIP permit 20 router rip version 2 redistribute ospf 1 metric 1 route-map OSPF_TO_RIP这段配置的含义是:在把 OSPF 路由重发布进 RIP 时,先拒绝所有 10.0.0.0/8 范围内掩码长度在 24 到 32 之间的网段,其他网段放行。route-map 的匹配顺序和 ACL 一样,从上往下逐条匹配,第一条 deny 命中就直接拒绝,不再往下看。所以 route-map 里必须有一条最后的 permit 语句,否则什么路由都发布不出去。这是实验里非常容易踩的坑。
4.5 规避手段三:调整管理距离
另一种思路是让路由器“不信”某些路由。例如,希望 RIP 域里的路由器优先走直连的边界路由器,可以修改边界路由器上重发布路由的管理距离,让 RIP 外部路由的 AD 变大,从而不被优先选择。
router rip version 2 distance 130这会让 RIP 路由的 AD 从默认的 120 变成 130。如果 OSPF 外部路由的 AD 是 110,路由器会优先选择 OSPF 学到的路由,也就是优先走 R4 那条链路。不过要注意:调整 AD 是全局性的,会影响该协议下所有路由的优先级。如果只想针对某几条路由调整,需要结合 ACL 做精细化 distance 配置。
这三种手段各有利弊:distribute-list 直接、暴力,理解成本低,适合快速截断;route-map 灵活,可以组合多种匹配条件,适合生产环境;调整 AD 是最后的手段,影响面大,需要谨慎使用。
5. 常见问题排查与实操技巧实录
5.1 重发布实验问题速查表
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
| RIP 域里学不到重发布路由 | seed metric 未设,默认16不可达 | show ip rip database、show run | section router rip |
| OSPF 域里子网路由传不过来 | redistribute 缺 subnets 关键字 | show ip ospf database external |
| 路由环路、下一跳来回跳 | 双向重发布无防环过滤 | show ip route、traceroute、show ip protocols |
| 次优路径 | 协议 AD 不一致导致选路异常 | show ip route,关注 AD 值 |
| 重发布路由时有时无 | route-map 顺序错误或缺 permit | show route-map、show ip prefix-list |
| 过滤后所有路由都没了 | route-map 没有最后的 permit,导致全拒 | show ip protocols(查看路由过滤器是否生效) |
5.2 排查命令组合:一条条看到问题本质
排查重发布问题,我有一套固定的命令组合,按顺序执行基本能定位 90% 的问题。
第一步,看路由表全貌。用 show ip route 确认路由是否出现、下一跳是谁、AD 值和 metric 是多少。重点看是否带 O E2 或 R 标记,以及括号里的 [110/20] 这类值。
第二步,看协议数据库。OSPF 侧用 show ip ospf database external,RIP 侧用 show ip rip database。这一步能确认路由是否已经进入了协议数据库。如果数据库里没有,说明重发布或通告有问题;如果数据库里有但路由表里没有,说明是选路或 AD 的问题。
第三步,看进程配置。用 show run | section router 确认 redistribute 命令是否带上正确的关键字和 metric。很多时候问题就出在少写了一个 subnets 或者忘加 metric。
第四步,路由振荡时,关掉快速收敛,用 debug ip rip 观察 RIP 更新报文里的路由条目,能直观看到哪条路由被反复通告。注意 debug 命令在生产环境要慎用,实验环境随便开。
5.3 实操中踩过的几个坑
第一个坑:prefix-list 掩码长度写错。我曾在 R2 上过滤 10.0.0.0/8 ge 24 le 32,以为能匹配所有子网,结果漏了 10.0.3.3/32 这种精确主机路由,导致 R3 的环回口在 OSPF 侧消失了。排查了很久才发现是 ge/le 范围写窄了。建议配置 prefix-list 前,先用 show ip prefix-list detail 查看实际匹配情况。
第二个坑:在 OSPF 重发布 RIP 时,忘了加 subnets。当时的情况是:R3 的 10.0.3.3/32 在 R1 上一直看不到,但 R3 的其他非主类子网却能通。原因是 redistribute rip 不带 subnets 时,只会重发布主类网络。这个关键字对 OSPF 来说几乎是必须的,却特别容易被忽略。
第三个坑:route-map 里只有 deny 没有放行。我最初在 R2 上做双向重发布防环时,定义了一个 route-map,只写了 deny 段,没写最后的 permit。结果所有路由都被拦住了,全网立即不通。后来形成肌肉记忆:route-map 用完之后,永远在最后补一条空 permit。
第四个坑:改完配置忘了清除 OSPF 进程。有时重发布配置修改后,OSPF 不会立即重新计算外部路由,需要敲 clear ip ospf process 或者被动等刷新。很多人改完配置发现路由没变化,以为是配置问题,其实只是进程没刷新。
5.4 一个值得反复练习的扩展实验
如果时间充裕,建议再做一次“多边界+路由策略”的实验:在之前拓扑中再加一台 R4,让 R2 和 R4 同时做 OSPF 和 RIP 的双向重发布,然后用 route-map 实现不对称控制——比如只允许 R2 发布某条路由,R4 只能发布另一条路由。这样能逼着自己把前文的防环、过滤、AD 调整手段组合起来,真正理解什么叫“策略控制”。
这个实验做完,再回头看 show ip protocols 输出的路由过滤信息和 AD 信息,你会对整个路由选择过程有非常清晰的认识。
我个人在实际操作中的体会是:重发布实验一定要按“先单向、后双向,先连通、再防环、后优化”的顺序去做。不要一上来就双边互指,否则出了问题你根本不知道是哪个方向引起的。另外一个小技巧是,每次配置完重发布,第一件事就是看 show ip protocols 里的 Redistributing 段落,它会把外部路由的 seed metric、路由过滤器是否生效都列出来,一眼就能看出配置有没有进对地方。这个习惯帮我省了不少排查时间,建议你也养成。