做重发布实验最怕的就是“路由通了,但哪里不对劲”。明明两边协议都起了,邻居也正常,可路由要么不进来,要么Metric大得离谱,要么一高兴直接环路。这坑我踩了不止一次,今天把整个重发布实验从设计思路到配置细节再到排错心得,一次性说清楚。
这篇内容核心围绕“重发布”(Route Redistribution),也就是在多协议网络中,把一种路由协议学到的路由转给另一种协议。比如OSPF区域里跑得好好的,突然要并网一段RIP网络,两边协议说不上话,就得靠重发布在边界路由器上做“翻译官”。这篇文章适合正在学网络认证的工程师、刚入行的运维,以及想搞明白多协议边界到底怎么设计的人。
1. 重发布到底在解决什么问题
1.1 从一个真实场景说起
我以前维护过一张园区网,核心区跑OSPF,老办公楼的一台服务器区跑RIP,因为那台老设备不支持OSPF。两边网段互相要访问,最简单粗暴的办法就是在边界路由器上写静态路由一条条指过去。但静态路由有个致命问题:网络一变化,你得到处改表,改多了迟早出错。后来梳理需求,干脆在边界路由器上做重发布,把OSPF学到的路由通告进RIP,把RIP学到的通告进OSPF,两边就自动学会了,再也不用一条条维护。
这就是重发布的典型使用场景。它本质上解决的,是**“异构协议之间的路由信息方言翻译”**问题。OSPF用LSA描述拓扑,RIP用跳数描述距离,EIGRP用复合度量描述路径好坏,这些完全不是一套语言。没有重发布的时候,路由器只认自己运行协议的路由,来自其他协议的路由一概不看。就像两个部门各说各话,中间的接口人就是“重发布命令”。
1.2 重发布的本质:把“我信的路由”转成“你信的路由”
重发布的动作发生在边界路由器上。假设一台路由器同时运行OSPF和RIP,它从RIP邻居学来一条路由,此时这条路由在路由表里的来源是RIP,协议距离(AD值)是120。重发布做一件事:把这条RIP路由拿出来,以OSPF外部路由的身份,重新注入到OSPF进程里。这样OSPF域内其他路由器就能通过LSA学到这条路由,但类型变成了外部路由(Type-5 LSA)。
关键点来了:路由器不会自动把一种协议的路由转发给另一种协议,必须明确配置“重发布”命令。这背后是Cisco和华为等厂商的一个共同设计原则:协议之间默认隔离,避免因为度量值不可比而引发环路或次优路径。所以重发布必须显式指定,而且工程师要自己扛下“度量值怎么换算”的责任。比如RIP重发布进OSPF,OSPF默认Seed Metric是20,不需要手动指定也能通,但如果想让OSPF域内选路更优,就得手动调metric-type和metric值。
2. 实验拓扑设计与前期规划
2.1 拓扑选型:为什么用三台路由器
做重发布实验,我建议最简拓朴至少要有三台路由器,而不是两台。两台的场景只能演示最基本的单向重发布,一旦你配置双向重发布,很容易因为“路由回灌”产生环路,但两台设备之间环路现象不明显,很难触发你的排错思考。三台设备可以组成一条链:R1和R2跑OSPF,R2和R3跑RIP,在R2上做双向重发布。
为什么选R2作为边界节点?因为R1在OSPF区域内部,R3在RIP网络,R2同时连接两边,处在翻译官的位置。这个拓扑也最接近实际网络里的出口边界。更复杂一点可以加一台路由器做成环形,但说实话,先把链状拓扑吃透,再扩展环形拓扑就顺理成章了。环形拓扑是重发布环路实验的最佳载体,我放在后面的环路章节展开。
2.2 IP地址与协议规划表
实验前先把地址规划写在纸上,不然配到一半脑子就乱了。我习惯用10.0.0.0/24网段按链路线路分配:
| 设备 | 接口 | IP地址 | 所属协议 |
|---|---|---|---|
| R1 | Gi0/1 | 10.0.12.1/24 | OSPF Area 0 |
| R2 | Gi0/1 | 10.0.12.2/24 | OSPF Area 0 |
| R2 | Gi0/2 | 10.0.23.2/24 | RIP(R2侧) |
| R3 | Gi0/1 | 10.0.23.3/24 | RIP(R3侧) |
| R1 | Lo0 | 1.1.1.1/32 | OSPF 模拟业务网段 |
| R3 | Lo0 | 3.3.3.3/32 | RIP 模拟业务网段 |
设备厂商我以Cisco IOS为例,因为重发布的命令体系最标准。如果你用华为,对应的是import-route,思路上完全一致,命令差异我会在关键处做对照。
OSPF配置只需要在R1和R2上启用进程1,network宣告10.0.12.0网段和R1的Loopback;RIP在R2和R3上启用进程,version 2,no auto-summary,宣告10.0.23.0网段和R3的Loopback。这里有个基础坑:RIP是有类别的协议,如果不开no auto-summary,子网边界会自动汇总,可能导致10.0.x.x的子网被汇总成10.0.0.0/8。所以实验里一定要关自动汇总。
2.3 避坑:接口地址放通与协议邻居检查
配置完成后,先别急着重发布,用Show命令确认底层邻居状态。OSPF看show ip ospf neighbor,RIP看show ip rip database。RIP没有邻居表的概念,只有路由数据库,如果R3的Loopback出现在R2的RIP数据库里,说明RIP已经正常学习。
还有个特别容易忽略的点:接口的MTU和封装。如果接口MTU不一致,OSPF邻居会卡在Exstart/Exchange状态,RIP倒是没这问题,但也会出现路由丢失。另外,RIP的更新报文走UDP 520,如果设备上做了ACL,一定要放行。我在模拟器里实验时,经常把接口shutdown再no shutdown,触发一次快速收敛,看看路由是否重新学习。
这一节的核心结论是:重发布能不能成功,底层协议必须已经全部透传。如果OSPF域内的R1学不到R2的直连网段,RIP域内的R3学不到R2的直连网段,重发布配置得再漂亮也白搭。
3. 核心配置与参数解析
3.1 先让两侧协议各自独立工作
为了叙述清晰,我先把配置命令按协议拆解。R1和R2的OSPF:
router ospf 1 router-id 1.1.1.1 network 10.0.12.0 0.0.0.255 area 0 network 1.1.1.1 0.0.0.0 area 0R2和R3的RIP:
router rip version 2 no auto-summary network 10.0.0.0R2上同时宣告了10.0.12.0和10.0.23.0,都在10.0.0.0这个主类里,所以RIP的network只需要写10.0.0.0。如果你分不清RIP的network是要宣告到哪台设备,记住:RIP的network命令是“在这个接口上启用RIP发送和接收更新”,而不是OSPF那种精确匹配网络。这个区别很容易让新手把RIP的network写错,导致R2上的OSPF接口也被RIP广播,白白多出一堆无用的RIP更新。
3.2 重发布命令的完整写法
现在到了核心环节。在R2上做双向重发布:
router ospf 1 redistribute rip subnets ! router rip redistribute ospf 1 metric 5第一条命令,把RIP路由重发布进OSPF。必须带subnets关键字,如果不带,OSPF只会重发布主类网络,所有子网路由全部被忽略。这是高频率翻车点。subnets的意思就是允许将子网作为外部路由发布,而不是只发布有类别网络。
第二条命令,把OSPF路由重发布进RIP。RIP的度量是跳数,OSPF路由进来时不知道跳数多少,默认情况下RIP会把度量设为无穷大,导致路由虽然存在但不可达。所以要么在命令里用metric 5直接指定,要么用default-metric全局设置种子度量。我这写的是metric 5,表示OSPF路由进入RIP后,默认标记为5跳。
如果你用的是华为,对照配置是:
ospf 1 import-route rip rip 1 import-route ospf 1 cost 5思路一样,都是告诉协议“从对方学到的路由,以什么身份进入我的数据库”。
3.3 Seed Metric:度量值换算的第一道关卡
种子度量(Seed Metric)是重发布里最基础也最容易被忽略的概念。外部路由进入新协议时,不携带原来协议的度量,必须由重发布规则赋予一个初始值。它就像新员工入职时的初始级别,后面能升不能降。
各协议默认种子度量各不相同:
| 协议方向 | 默认种子度量 | 后果 |
|---|---|---|
| OSPF ← RIP/静态 | 20(BGP为1) | OSPF外部路由默认cost=20 |
| RIP ← OSPF | 无穷大(16) | 路由不可达,必须手动指定metric或default-metric |
| EIGRP ← OSPF/RIP | 无穷大 | 路由被抑制,必须指定度量 |
| IS-IS ← 其他 | 0 | 可能导致所有路由按0代价计算,必须注意 |
所以在实验里,RIP重发布进OSPF不指定metric也能通,因为默认20;但OSPF重发布进RIP就不行,不指定metric=RIP数据库里的“hop count 16”,直接不可达。很多初学者一上来就报“我重发布了但路由表里没有”,十有八九就是种子度量问题。更深一步,如果你想把OSPF路由重发布进EIGRP,必须指定带宽、延迟、可靠性、负载、MTU五个参数,否则路由不会出现在拓扑表。
3.4 双向重发布与次优路径问题
在双向重发布的配置中,R1、R2、R3之间会出现一种非常典型的问题:次优路径。举个例子,假设实验拓扑再加一条R1直连R3的“捷径”线路,R1和R3之间跑RIP。此时R1学习到了到达R3的Loopback的两条路径:
- 路径A:R1→R3,RIP跳数1,管理距离120;
- 路径B:R1→R2→R3,虽然R1是OSPF路由器,但这条Loopback路由来自R2的重发布,以OSPF外部路由的形式进入R1,管理距离110(OSPF外部路由AD=110),度量20。
因为OSPF的管理距离(110)小于RIP(120),即使路径B绕了一大圈,R1也会优先选择OSPF外部路由。可实际上直连路径跳数更短,传输效率明显更高。这就是典型的“重发布导致次优路径”:协议距离压倒了实际度量。如果你在图里观察到R1去3.3.3.3的下一跳指向R2而不是R3,基本可以断言次优路径。
这个问题没有绝对的“对错”,但对性能敏感的网络不可接受。解决办法有很多:调整AD值(不建议全局调)、用距离命令在特定路由器上修改、或者干脆用路由过滤把次优来源的路由挡住。我在实验里更推荐用distance命令针对外部路由调整,但生产环境要谨慎,因为修改AD值影响全局。
4. 出现环路与次优路径怎么办
4.1 环路产生的条件:双向重发布的天然隐患
如果你做的是双向重发布,那么环路风险从一开始就存在。原因很简单:R2把RIP的路由发布进OSPF,OSPF域内的人学到了;同时R2又把OSPF的路由发布进RIP,RIP域内的人也学到了。这样一来,R2从RIP学回来一个网段,这个网段其实来自OSPF域内某处,但R2不知道它绕了一圈,以为是一条新的RIP路由,再发布回OSPF,形成无限循环。更麻烦的是,OSPF内部路由优先于外部路由,双向重发布会导致某些情况下OSPF内部路由被外部路由覆盖。
环路在真实网络中通常不是“永远转发”,而是表现为路由震荡、路由表不断被更新、CPU飙升。因为每台路由器都会周期性重算,虽然最终可能因为管理距离和度量收敛到一条路径,但收敛过程中会出现瞬时环路和持续的资源消耗。
4.2 用路由过滤挡住回灌
破环路的经典方法是**“自西向东,只进不出”**。意思是在重发布边界路由器上,对要重发布的路由做过滤,拒绝那些来自另一协议转发的路由再次回灌。
配置思路两侧分开处理。在R2的OSPF进程里,重发布RIP时排除掉从OSPF学到的路由;在R2的RIP进程里,重发布OSPF时排除掉从RIP学到的路由。用Cisco实现最干净的方式是route-map配合tag标记。
具体来说:为外部路由打tag。OSPF外部路由可以使用tag属性,RIP虽然没有显式tag字段,但可以在route-map里匹配下一跳或访问控制列表。最简单的实验做法是用前缀列表定义需要放行的网段,然后在redistribute命令里用route-map过滤掉回灌的来源。例如:
ip prefix-list OSPF_INTERNAL seq 5 permit 1.1.1.1/32 ip prefix-list RIP_INTERNAL seq 5 permit 3.3.3.3/32 route-map REDIST_RIP_TO_OSPF permit 10 match ip address prefix-list RIP_INTERNAL router ospf 1 redistribute rip route-map REDIST_RIP_TO_OSPF subnets这个配置只允许把3.3.3.3/32从RIP重发布进OSPF,把从OSPF重发布进RIP转回来的路由挡住。
但实际网络往往不止一两个网段,所以我更推荐用tag机制。给RIP重发布进OSPF的路由打上tag 100,给OSPF重发布进RIP的路由打上tag 200,然后在重发布方向匹配tag并deny。Cisco的OSPF外部路由支持tag标签,路由会一路携带,在R3上也能看到这个tag。不过RIP不支持tag,所以在RIP方向需要用别的方法,比如match ip route-source或直接匹配存在路由表的下一跳。这也是重发布实验里最容易让人绕晕的地方,一定要动手做一遍。
4.3 tag在重发布中的妙用
Tag字段是个被很多人忽略的好东西。它像是给路由贴的“户口标签”,能跨协议传递。在OSPF外部路由的LSA里有一个32位的tag字段,默认是0。你可以用它标记路由的来源:从RIP来的外部路由tag=100,从静态来的tag=200,从BGP来的tag=300,之后要过滤或做策略时直接匹配tag,比匹配IP网段灵活得多。
配置也很简单:
route-map SET_TAG permit 10 set tag 100 router ospf 1 redistribute rip route-map SET_TAG subnets然后在另一台路由器上,你可以用match tag将特定tag的路由控制住。这套机制在真实网络中非常有用。比如你从运营商学到大量BGP路由,给你一条汇总路由打tag=65000,内部再做路由映射,禁止某些特定的出口路由被传播到内部其他区域。重发布实验不只是为了考试,tag机制和route-map的配合是网络工程师吃饭的本事。
5. 常见问题与排查实录
5.1 重发布后路由不生效,优先查三件事
实验做完,最常见的现象是“我在边界路由器上敲了重发布,但其他路由器看不到路由”。这时候按顺序查:
- 查种子度量。RIP重发布进OSPF不带subnets,路由只在主类边界显示;OSPF重发布进RIP没有metric,RIP显示hop 16。
- 查源协议路由是否存在。如果源路由是一台设备上的静态路由或者直连,你必须确认这台设备路由表里有这条路。重发布不能凭空创造路由。
- 查分发列表或route-map。
distribute-list in/out如果对进出方向做了过滤,也会拦掉路由。
我遇到过一个特别隐蔽的问题:边界路由器上同时运行了OSPF和RIP,RIP进程里默认会重发布直连接口,如果RIP宣告了10.0.0.0,那么R2的OSPF接口也会在RIP里侦听,导致OSPF学到的内部网段被RIP数据库覆盖。排查时用show ip rip database看有没有大量并非来自RIP邻居的路由,如果里面有10.0.12.0/24,说明RIP宣告范围太宽。解决办法是改用passive-interface把边界路由器的OSPF接口设为被动接口,不让RIP更新从那个接口发出。
5.2 Metric值奇怪,可能是静态路由重发布的“默认值陷阱”
静态路由重发布进OSPF时,默认metric是20,这本身没问题。但如果你的静态路由是“到Internet的默认路由”,在OSPF里重发布时如果不加metric-type 1,外部路由默认是Type 2,cost只计算外部cost,不考虑内部cost。于是OSPF域内所有路由器看这条默认路由的cost都是20,不管距离边界路由器多远。这在实验里看不出危害,但真实网络里会导致域内远端路由器选择了一个不合适的出口。
我个人的经验是:除非有特殊需求,否则外部路由建议配置为metric-type 1,这样OSPF内部累积cost会被计入总cost,选路更准确。命令是:
router ospf 1 redistribute static subnets metric-type 1另外,如果是华为设备,import-route static的默认cost是1,会导致静态路由在OSPF里看起来比OSPF内部路由Cost还低,同样需要警惕。
5.3 路由回灌的几种现象与排除手段
路由回灌是双向重发布的经典后遗症。现象主要有三种:
- 路由表震荡:同一网段一会儿是OSPF外部路由,一会儿是RIP路由,下一跳跳变。
- 链路拥塞但路径错误:明明到达某个网段只需一跳,却走了一条绕远的路,流量绕行,延迟变大。
- 接口丢包率奇高:环路形成后TTL不断递减,数据包在环路里打转。
对付回灌,检查手段主要有两板斧。第一步,在路由器上用show ip route IP地址追一下下一跳,看是否循环指向边界路由器;第二步,用debug ip routing看路由更新源的IP,确认是哪台路由器在反复通告同一条路由。确定来源后,用route-map或distribute-list做单向过滤,排除回灌。
我在做环形拓扑实验时,用过一个更简单的破环方式:在重发布方向上使用redistribute ospf 1 metric 3 route-map DENY_RIP_LOOP,route-map里用match ip address prefix-list DENY捕获从OSPF域内发来的RIP路由来源地址,然后用deny拒绝。效果很直接,但前提是你能准确识别“回灌路由”的特征,否则会误伤正常路由。
5.4 实验排错速查表
| 现象 | 可能原因 | 排查命令 | 解决思路 |
|---|---|---|---|
| 重发布后OSPF看不到RIP路由 | 缺少subnets参数 | show ip ospf database external | 加subnets |
| RIP路由表显示hop count 16 | 未指定metric | show ip rip database | 配置metric或default-metric |
| OSPF路由优先级低于RIP | 所有路由都被发布进OSPF,内部选路变形 | show ip route | 检查route-map,调整AD值 |
| 路由来回震荡 | 双向重发布回灌 | debug ip routing / show log | 配置tag、distribute-list |
| 路由表有但ping不通 | 种子度量或出接口错误 | show ip route + ping扩展 | 检查metric和下一跳 |
5.5 一点实操心得:先单向后双向
我的经验是,重发布实验千万不要一上来就做双向。先把OSPF到RIP的单向做通,用R3的Loopback验证路由可达,再看RIP到OSPF的单向,确认R1学到外部路由。所有指标正常后,再叠加双向。这个过程能帮你定位配置错误是在方向一还是方向二,而不是混在一起瞎猜。
还有一个建议,每次修改重发布策略后,用clear ip route *强制刷新路由表,或者在模拟器里重置接口,让协议快速重新收敛。很多问题不是策略不对,而是缓存的旧路由还没刷掉,导致你看到的是过期信息。做实验和排生产故障一样,先确认现象,再怀疑配置,每次敲完命令后务必重新看路由表,而不是凭记忆判断。
6. 把实验延伸到真实网络设计
重发布实验做完,你可能会觉得“原来就是两条命令的事”。但把实验能力转化为现实设计能力,还差一个思维转变:什么时候该做重发布,什么时候宁可用静态路由也别做重发布。
我的个人建议是,只要网络中存在双点或多点重发布,就要非常克制。能做单点双向就不要做双点双向。因为多点重发布的环路控制难度呈指数上升。曾经我维护过一个双出口的网络,两个边界路由器同时做了OSPF和BGP的双向重发布,结果一次BGP路由波动导致OSPF域内反复重算,差点把核心交换机CPU跑满。后来我们改成单点重发布+静态备路,网络反而稳定得多。
所以重发布不是越“高级”越好,而是越“简单可控”越好。掌握了这次实验里的种子度量、Tag标记、route-map过滤、AD调整这些工具,你遇到真实网络问题时会非常自然地想到这套组合拳。希望大家把实验环境里的每一个坑都踩一遍,踩过之后才明白那些配置参数为什么会存在。