路由重发布这个技术,单点怎么做都顺手,一旦把条件改成双向双点重发布,就完全不是一回事了。我最早做这个实验时,以为不过是两条redistribute命令的事,结果路由表直接乱成一锅粥——同一网段在 OSPF 和 RIP 之间来回倒腾,下一跳变来变去,甚至出现一台路由器把自己已经通告出去的路由再学回来、再发回去的怪现象。这次我把双向双点重发布实验从头到尾捋了一遍,从拓扑规划、问题复现到用路由策略解决,所有踩坑细节都写在下面,给正在啃路由重发布的兄弟们做个参考。
做这个实验之前,先把关键词拆开:双向说的是 OSPF 和 RIP 两个协议域互相注入路由,也就是 RIP 重发布进 OSPF、OSPF 也重发布进 RIP;双点说的是两个协议域之间不是只有一台边界路由器,而是同时用了两台边界路由器做重发布。双向加双点,意味着重发布动作一共有四个方向,任意一个方向处理不当,都可能把路由带回源域,形成环路。所以这个实验的价值不在“配置几条命令”,而在让你真实理解重发布背后的路由回馈、管理距离差异和路径选择逻辑。适合刚学完 OSPF 和 RIP 基础、准备进阶路由策略的人,也适合在工作中要维护多协议网络的工程师回炉。
1. 实验背景与核心问题拆解
1.1 什么是双向双点重发布
先明确场景。我有两个路由域,左边是 OSPF 区域,右边是 RIP 域。正常情况下两边靠一台路由器连接,做双向重发布就能互相通信,这叫单点重发布。但生产环境里一台边界路由器一旦故障,两边路由就断了,所以得放两台边界路由器,这就是“双点”。
双点带来一个问题:RIP 域里的路由可以通过两台边界路由器进入 OSPF,OSPF 域里的路由也可以从两个点进入 RIP。每个边界路由器上又有两个方向的注入,总的算下来是四个动作:
- R1 将 RIP 重发布进 OSPF;
- R1 将 OSPF 重发布进 RIP;
- R2 将 RIP 重发布进 OSPF;
- R2 将 OSPF 重发布进 RIP。
四个动作同时生效,等于给两个路由域之间开了四扇门。门开多了,路由就可能绕圈子。比如 RIP 域内部的一条子网,R1 从 RIP 学了一次,注入 OSPF 后,R2 又从 OSPF 学了一次,再注入 RIP,于是这条子网在 RIP 域里就出现了一个“由 OSPF 域转回来的版本”。如果边界路由器选路时更信任 OSPF,它可能放弃直连的 RIP 路径,改走对端路由器绕一圈,次优路径就这么出现了。
1.2 为什么双向双点会翻车:路由回馈与环路
路由回馈是双点重发布最常见的问题。用个生活化的例子:两个水池之间接了两根管子,一边是 OSPF,一边是 RIP。RIP 池里的水被 R1 抽到 OSPF 池,R2 看到 OSPF 池里有水,又把水抽回 RIP 池。结果 RIP 池里出现了一份“从 OSPF 池返回来的水”,来源已经分不清了。路由器不会像人一样觉得不合理,它只看路由条目的管理距离和度量。距离矢量协议 RIP 尤其容易被回馈搞乱,因为它本身没有全局视图,只能听邻居说。
环路风险在双点场景里比单点大得多。单点只有一个边界,重发布的方向固定,回馈只会发生在同一台设备上,而设备从 OSPF 学到的外部路由不会同时再注入回 OSPF(通常认为不会直接形成环路)。双点就不同了:R1 注入的路由可以被 R2 学走,R2 再注入回 RIP;RIP 域内路由器如果又把这条路由通告给 R1,R1 就会再次把它注入 OSPF。这样一圈一圈传下去,虽然协议内部机制会一定程度抑制无限循环,但路由震荡和次优路径已经足以让你焦头烂额。
1.3 这次实验的预期目标
做这个实验,我说的“成功”不是所有 IP 能 ping 通就算数,而是满足下面三点:
- RIP 域内网段引入 OSPF 后,OSPF 域内路由器能看到且路径最优;
- OSPF 域内网段引入 RIP 后,RIP 域内路由器能到达且不出现回灌;
- 任意一台路由器断开一个重发布方向,全网路由不会出现环路或长时间震荡。
这三点同时也是验收标准。后面的配置、过滤、标记,全部围绕它们展开。
2. 实验拓扑与前期准备
2.1 拓扑设计与地址规划
实验用五台路由器最合适:两台作为双点 ASBR,一台放在 RIP 域内部,两台放在 OSPF 域内部。我用的连接方式是:R1 和 R2 之间跑 OSPF 区域 0;R1 和 R2 分别与 R3 通过 RIP 互联;R1 再连接 R4,R2 再连接 R5,R4 和 R5 属于 OSPF 区域 0。这样划分干净,路由域之间没有交叉干扰,后续做过滤也很直观。
地址规划如下表:
| 设备 | 接口 | IP 地址 | 归属协议 |
|---|---|---|---|
| R1 | G0/0 连 R2 | 10.0.12.1/30 | OSPF 区域 0 |
| R1 | G0/1 连 R3 | 10.0.13.1/30 | RIP |
| R1 | G0/2 连 R4 | 10.0.14.1/30 | OSPF 区域 0 |
| R2 | G0/0 连 R1 | 10.0.12.2/30 | OSPF 区域 0 |
| R2 | G0/1 连 R3 | 10.0.23.2/30 | RIP |
| R2 | G0/2 连 R5 | 10.0.25.2/30 | OSPF 区域 0 |
| R3 | G0/0 连 R1 | 10.0.13.3/30 | RIP |
| R3 | G0/1 连 R2 | 10.0.23.3/30 | RIP |
| R3 | Loopback0 | 3.3.3.3/32 | RIP 域 |
| R4 | G0/0 连 R1 | 10.0.14.4/30 | OSPF 区域 0 |
| R4 | Loopback0 | 4.4.4.4/32 | OSPF 域 |
| R5 | G0/0 连 R2 | 10.0.25.5/30 | OSPF 区域 0 |
| R5 | Loopback0 | 5.5.5.5/32 | OSPF 域 |
这里的 RIP 域实际就是 R1、R2、R3 组成的三角形,R3 的 loopback 作为 RIP 域的代表网段;OSPF 域是 R1、R2、R4、R5 组成的区域 0,R4 和 R5 的 loopback 作为 OSPF 域的代表网段。为什么要用 loopback 而不直接拿互联地址做验证?因为 loopback 是稳定可达的模拟终端网段,ping 它不会因为链路抖动误判,排查时也更好分辨路由来源。
2.2 模拟器与镜像准备
实验在模拟器里跑就行,我用的是常见的图形化网络模拟环境,虚拟了五台标准企业路由器镜像,每台分配 512MB 内存,启动后确认所有接口状态都是 up。如果你用的是其他模拟器,只要支持 OSPF、RIP 和 route-map 就行,拓扑逻辑完全一致。
需要特别提醒一点:模拟器版本不同,RIP 默认行为可能不一样。有的镜像默认只启用 RIP 版本 1,不支持不连续子网和 VLSM,会导致路由学不全。我这次在每台路由器的 RIP 进程下都显式指定了版本 2,避免后面排查子网掩码相关问题时被干扰。
2.3 基础配置与连通性验证
先不碰重发布,把接口 IP 和两个协议的基础配好。R1 上的核心命令是:
interface GigabitEthernet0/0 ip address 10.0.12.1 255.255.255.252 ! interface GigabitEthernet0/1 ip address 10.0.13.1 255.255.255.252 ! interface GigabitEthernet0/2 ip address 10.0.14.1 255.255.255.252 ! router ospf 1 network 10.0.12.0 0.0.0.3 area 0 network 10.0.14.0 0.0.0.3 area 0 ! router rip version 2 network 10.0.0.0 no auto-summaryR2、R3、R4、R5 按同样的思路配置。特别说明一下 RIP 的network 10.0.0.0这种写法:RIP 是基于主类网络的通告方式,它会自动匹配该主类网段下所有激活 RIP 的接口;如果你的实验环境里没有跨主类地址,这样写能快速让 RIP 邻居建立。no auto-summary必须加上,否则 RIP 在边界会把子网汇总成主类地址,实验里很多精确路由会被吞掉。
配置完先验证:R3 能 ping 通 R1 和 R2 的互联地址,R4 能 ping 通 R1 和 R2,R5 也能 ping 通 R1 和 R2。但 R3 去 ping 4.4.4.4 一定是不通的,因为 OSPF 域和 RIP 域之间还没有做任何重发布。这一步验证的意义,是确保后面的问题都源于重发布,而不是基础邻居关系没起来。
3. 关键配置详解:双向双点重发布的核心算法与命令
3.1 第一次配置:直接双向重发布的后果
为了暴露问题,我故意用最“粗暴”的方式直接配置双向双点重发布。R1 和 R2 上都写了同样的两条命令:
router ospf 1 redistribute rip subnets ! router rip version 2 redistribute ospf 1 metric 5先说命令本身的两个细节。第一个是 OSPF 侧必须带subnets关键字,不带的话,OSPF 默认只把 RIP 路由里的主类网络重发布进来,3.3.3.0/24 这种子网路由根本不会出现在 OSPF 的 LSA 里,R4 和 R5 就学不到精确路由。第二个是 RIP 侧必须手动指定metric 5,因为默认种子度量在很多实现里是 0,重发布进 RIP 后,RIP 通告时会按 1 来算,虽然大部分情况能通,但路径度量会失真,也会让你后面排查时误判。
配置上去之后,全网表面上是通的,R3 能 ping 通 4.4.4.4,R4 也能 ping 通 3.3.3.3。但你再仔细看路由表,问题全出来了。
3.2 路由表的“惊魂时刻”:现象复现
我在 R1 上执行show ip route,看到了类似下面的关键路由:
O E2 3.3.3.3/32 [110/20] via 10.0.12.2, 00:00:30 R 3.3.3.3/32 [120/1] via 10.0.13.3, 00:00:41注意 O E2 的这条外部路由,管理距离是 110,而 RIP 的管理距离是 120。R1 同时从 RIP 直连学到了 3.3.3.3,也从 OSPF 通过 R2 学到了 3.3.3.3,因为 OSPF 外部路由的 AD 更小,R1 毫不犹豫选择了下一跳指向 R2 的路径。也就是说,R1 去访问 R3 的 loopback,本来应该走直连的 10.0.13.3,现在却绕道 R2,再绕回 R3。这就是典型的次优路径。
再在 R3 上看路由表,会发现 RIP 路由里出现了自己的 loopback 网段:
R 3.3.3.0/24 [120/1] via 10.0.13.1R3 明明直连 3.3.3.3,却收到了一条从 R1 方向通告过来的“3.3.3.0/24”RIP 路由。这条路由来自谁?就是 R1 从 OSPF 学到的 3.3.3.3,又重发布回了 RIP。虽然因为直连路由 AD 为 0,R3 不会用这条 RIP 路由替换自己的直连,但路由器已经开始在 RIP 域内传播一个“本不该存在”的 3.3.3.0/24,如果 R3 有其它接口连着下级路由器,这条伪路由会被继续传递,环路风险也随之扩散。
3.3 根因分析:四条重发布方向和 AD 差异
直接把问题按四个方向拆开看:
| 重发布方向 | 动作内容 | 带来的问题 |
|---|---|---|
| R1:RIP to OSPF | 把从 R3 学到的 RIP 路由注入 OSPF | 对端 R2 会学走并可能再注入 RIP |
| R1:OSPF to RIP | 把从 OSPF 学到的外部路由注入 RIP | 若包含 3.3.3.3 则产生回灌 |
| R2:RIP to OSPF | 把从 R3 学到的 RIP 路由注入 OSPF | 对端 R1 会学走并可能再注入 RIP |
| R2:OSPF to RIP | 把从 OSPF 学到的外部路由注入 RIP | 若包含 3.3.3.3 则产生回灌 |
核心矛盾在于:边界路由器无法区分“同一个目标网段,到底是 RIP 域原生路由,还是对端从 OSPF 注入回来的伪路由”。OSPF 外部路由 AD 又比 RIP 小,所以边界路由器在选择路径时还偏偏选错。两个因素叠加,就出现了路由反复横跳。
要解决这个问题,必须让边界路由器能识别路由来源,并且在不同方向上有策略地放行或拒绝。
4. 路由回馈与环路问题排查实录
4.1 从路由表到 LSA/拓扑表:问题怎么定位
排查这类问题,我的习惯是先看路由表,再看协议数据库,最后看重发布方向。在 R1 上执行:
show ip ospf database external能看到 3.3.3.3 这条外部 LSA 的详细信息。重点看Advertising Router和Tag字段。如果发现 R1 路由表里的 3.3.3.3 外部路由通告者同时有 R1 和 R2,就说明两个边界路由器都往 OSPF 注入了同一条 RIP 路由,而且 R1 也收到了 R2 注入的版本,这就是回馈的直接证据。
RIP 侧可以用:
show ip rip database查看 RIP 数据库里是否有来自 OSPF 域的前缀。如果 3.3.3.0/24 出现在 RIP 数据库里,而且下一跳指向本设备自己的接口或对端 ASBR,说明 OSPF 重发布回 RIP 的动作把 RIP 域路由又送了一遍。
4.2 抓包验证:重发布的路由是怎么反复横跳的
光看路由表还不够,我还会在 R1 和 R3 之间的链路上抓包。开启抓包后,重新触发一次 RIP 更新,比如清空 RIP 进程:
clear ip rip很快就能抓到 R1 向 R3 通告的 RIP 响应报文中,包含了 3.3.3.0/24 路由条目。这个条目明明是 R1 从 OSPF 学来的,现在却被作为 RIP 路由发给 R3,等于把“已经离开 RIP 域的路由”又送了回来。如果你同时抓 OSPF 报文,还能看到 R1 和 R2 之间互相通告 3.3.3.3 的 Type 5 LSA。两条抓包结果一对照,回馈路径就非常清晰了。
4.3 排查思路整理:先别急着加过滤
我见过很多同学一发现问题就开始加 distribute-list,但方向乱,反而把正常路由也过滤掉了。正确的排查顺序应该是:
- 画出四个重发布方向,明确每个方向声明了哪些前缀;
- 确定每个前缀的原生域,比如 3.3.3.0/24 原生于 RIP,4.4.4.4/32 原生于 OSPF;
- 看路由表里 AD 谁大谁小,找出次优路径的原因;
- 看协议数据库里的 tag 和通告者,判断回馈是从哪个方向进来的;
- 最后再决定在哪台设备、哪个方向上加过滤。
5. 完整解决方案:路由策略过滤与标记
5.1 设计思路:先分域,再打标签
彻底解决双向双点重发布问题,我用的方案是“分域 + 标签 + 双向过滤”。
分域,就是把所有前缀明确归类:RIP 域前缀只有 3.3.3.3/32 和两条 RIP 互联网段;OSPF 域前缀是 4.4.4.4/32、5.5.5.5/32 和三条 OSPF 互联网段。打标签,则是在 R1 和 R2 把 RIP 注入 OSPF 时,给外部路由打上不同的 tag,方便对端识别“你这条外部路由是谁注入的”。然后做双向过滤:RIP 入向只接受 RIP 域前缀,OSPF 重发布进 RIP 时只放行 OSPF 域前缀,并拒绝对端注入过来的 RIP 域伪路由。
5.2 前缀列表与路由策略配置
以 R1 为例,完整配置分四步。
第一步,定义前缀列表:
ip prefix-list RIP_PREFIX seq 5 permit 3.3.3.0/24 ip prefix-list RIP_PREFIX seq 10 permit 10.0.13.0/30 ip prefix-list RIP_PREFIX seq 15 permit 10.0.23.0/30 ! ip prefix-list OSPF_PREFIX seq 5 permit 4.4.4.4/32 ip prefix-list OSPF_PREFIX seq 10 permit 5.5.5.5/32 ip prefix-list OSPF_PREFIX seq 15 permit 10.0.12.0/30 ip prefix-list OSPF_PREFIX seq 20 permit 10.0.14.0/30 ip prefix-list OSPF_PREFIX seq 25 permit 10.0.25.0/30注意 R1 上也要允许 10.0.23.0/30 作为 RIP 域前缀,因为 R1 虽然直连 10.0.13.0/30,但 RIP 域内 R3 和 R2 之间的 10.0.23.0/30 也是 RIP 域的一部分,R1 需要从 R3 或 R2 学到它。同样,R1 上的 OSPF_PREFIX 也要包含 10.0.25.0/30,因为这条网段在 OSPF 区域 0 内。
第二步,定义 RIP 重发布进 OSPF 的 route-map,并打 tag。
R1 上打 tag 100,R2 上打 tag 200,目的是区分注入源。R1 配置:
route-map RIP_TO_OSPF permit 10 match ip address prefix-list RIP_PREFIX set tag 100 ! router ospf 1 redistribute rip route-map RIP_TO_OSPF subnets第三步,定义 OSPF 重发布进 RIP 的 route-map。这里最关键:R1 要拒绝 tag 200 的路由,因为那是 R2 注入的 RIP 域伪路由;同时只允许 OSPF 域前缀进入 RIP。R1 配置:
route-map OSPF_TO_RIP deny 10 match tag 200 ! route-map OSPF_TO_RIP permit 20 match ip address prefix-list OSPF_PREFIX ! router rip version 2 redistribute ospf 1 route-map OSPF_TO_RIP metric 5R2 配置完全对称,区别只在 deny 的时候匹配 tag 100。
第四步,在 RIP 入向加一个 distribute-list,确保 RIP 进程不会学到 OSPF 域前缀。这属于第二道保险。R1 和 R2 的 RIP 进程下都可以加:
router rip version 2 distribute-list prefix RIP_PREFIX in加上这条之后,即使对端 ASBR 因为某种原因把 OSPF 域前缀注入 RIP,本设备也不会接收,回馈通道被彻底堵死。
5.3 解决次优路径:调整外部路由管理距离
分域标签解决的是环路和回馈,但次优路径还没处理。现在 R1 的 OSPF 进程仍然可能从 R2 学到外部路由 3.3.3.3,AD 是 110,比 RIP 的 120 小,所以 R1 依然会优选 OSPF 路径。要在 OSPF 进程里把外部路由的 AD 调大,让本设备在有 RIP 路径时优先走 RIP:
router ospf 1 distance ospf external 130这条命令把 OSPF 外部路由的管理距离统一改为 130,比 RIP 的 120 大。这样 R1 同时拥有 RIP 直连 3.3.3.3 和 OSPF 外部 3.3.3.3 时,会优先选择 RIP 直连,路径就回到 R1->R3,不再绕道 R2。
你可能会担心:调高外部路由 AD 会不会影响 OSPF 域内的 R4 和 R5?不会。因为 R4、R5 没有 RIP 来源,它们只有 OSPF 外部路由这一条路径,AD 是 130 还是 110 不影响选路结果,反而更安全。
5.4 配置验证:最终路由表与连通性测试
全部配置完成后,再做一轮系统性验证。我在 R1 上再次查看路由表:
R 3.3.3.3/32 [120/1] via 10.0.13.3, 00:00:12R1 去 R3 的 loopback 已经走 RIP 直连,不再出现 O E2 为主的次优路径。
在 R4 上查看 3.3.3.3:
O E2 3.3.3.3/32 [110/20] via 10.0.14.1, 00:00:18R4 能通过 R1 学到 RIP 域路由,正常。
在 R3 上查看 4.4.4.4:
R 4.4.4.4/32 [120/5] via 10.0.13.1, 00:00:20R3 能通过 R1 学到 OSPF 域路由,且 RIP 数据库里不再有 3.3.3.0/24 这条伪路由。用 ping 逐一验证 3.3.3.3、4.4.4.4、5.5.5.5,全部通,且清理 RIP 进程后路由能在几秒内收敛,不会反复跳动。
6. 常见问题与避坑手册
6.1 关于种子度量与 subnets 的坑
重发布时最容易踩的坑就是我前面提到的两个参数。OSPF 重发布进 RIP,不指定 metric,很多实现会按 0 处理,RIP 通告时变成 1,虽然通路不一定会断,但路径选择会很怪。RIP 重发布进 OSPF,不写 subnets,只会发布主类网络,比如 3.3.3.0/24 会变成 3.0.0.0/8 发布,导致精确路由缺失。这两个参数不是锦上添花,是必须写。
另外,RIP 版本 2 的no auto-summary也要记得。默认开启自动汇总时,R1 在把 OSPF 域的 10.0.12.0/30 重发布进 RIP 时,可能会汇总成 10.0.0.0/8,把实验里所有 10.x 网段都搅在一起,这种问题排查起来非常迷惑。
6.2 模拟器环境中的常见坑
模拟器里跑这个实验,我还遇到过几个和真实设备不太一样的细节:
- 某些镜像默认 RIP 版本是 v1,如果不显式
version 2,RIP 学到的路由会丢失子网掩码,3.3.3.3/32 会变成 3.0.0.0/8; - OSPF 进程配置了相同的 router-id,邻居会卡在 exstart 状态,建议手动给每台路由器指定唯一的 router-id;
- 模拟器里链路接口默认是 up 的,但有些虚拟接口需要手动
no shutdown,否则邻居关系建立不起来; - 交换机和路由器接口类型不一致时,OSPF 网络类型可能不同,影响 DR/BDR 选举,实验里尽量跑在广播网络或点对点链路上。
6.3 问题现象速查表
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| R1 去 R3 的 loopback 绕行 R2 | OSPF 外部路由 AD 110 小于 RIP 120 | OSPF 外部 AD 调大到 130 |
| R3 的 RIP 表里出现 3.3.3.0/24 | R2 把 R1 注入的伪路由重发布回 RIP | 用 tag 匹配对端注入路由并 deny |
| OSPF 域学不到 3.3.3.3/32 | 重发布时没写subnets | 加上subnets |
| RIP 域学不到 4.4.4.4/32 | OSPF 重发布进 RIP 时没指定 metric 或 route-map 放行 | 显式metric 5,并放行 OSPF_PREFIX |
| 收敛后路由仍震荡 | 双向回灌未完全切断 | 检查四个方向,RIP 入向加 distribute-list |
这个实验做到这里,基本就把双向双点重发布的完整逻辑闭环了。我个人经验是:每次做类似实验,先在白纸上画一张路由流向图,把四条重发布方向、每个方向会携带哪些前缀、AD 是多少都标出来,再动手配置。磨刀不误砍柴工,尤其当你被路由表里纷乱的路由条目绕晕时,那张纸就是救命绳。如果你在实验里也遇到过路由表反复横跳、去程回程不一致的情况,不妨按这个思路重新捋一遍,大概率能找到问题根源。