做HCIP实验做到路由重发布这一段,RIP与OSPF双向多点重发布是我花时间最多、也踩坑最多的一个实验。很多教材把重发布讲得云里雾里,画一堆方向箭头,可真到设备上一敲命令,环路、次优路径、路由回馈这些问题全冒出来了。这篇我把自己的实验配置和优化过程从头到尾写一遍,从拓扑设计到排错思路,一次性说清楚。
这个实验适合正在备考HCIP的读者,也适合工作中遇到多协议混合网络、需要打通RIP域和OSPF域的工程师。我尽量用工程视角讲,不堆理论,命令和验证输出都基于华为VRP平台。
1. 实验场景与拓扑设计
1.1 为什么非要双向多点重发布
很多人在单点重发布上觉得挺简单:一个ASBR,RIP引入OSPF,OSPF引入RIP,完事。但真实网络里很少有单点边界。为了可靠性,边界往往不止一台设备,可能有两台甚至更多,这就形成了多点重发布。双向,指的是两个方向都要做:RIP域的路由要进OSPF,OSPF域的路由要进RIP。
问题是,多点重发布一旦出现,路由回馈的闭环就出现了。ASBR-1把RIP路由引入OSPF,ASBR-2从OSPF学到这条路由,如果ASBR-2又把它引入RIP,这条路由就回到RIP域了,而且下一跳指向ASBR-1。然后ASBR-1再从RIP学到,再引入OSPF,周而复始。你以为自己在做路由引入,实际上在做路由震荡制造机。
所以这个实验的价值在于:不是学会两条import-route命令,而是学会如何在多个ASBR之间安全地控制路由流向。这也是很多公司面试和实际割接中真正会考的东西。
1.2 拓扑与地址规划
我把实验拓扑简化成四台路由器,两台ASBR,一侧RIP,一侧OSPF,形成一个典型的双向多点重发布场景:
- R1和R2:同时运行RIP和OSPF,是两台ASBR
- R3:纯OSPF路由器,Loopback0模拟OSPF域的业务网段
- R4:纯RIP路由器,Loopback0模拟RIP域的业务网段
| 设备 | 接口 | IP地址 | 所属协议域 |
|---|---|---|---|
| R1 | GE0/0/0 | 192.168.1.1/24 | RIP域,连接R4 |
| R1 | GE0/0/1 | 10.1.1.1/24 | OSPF域,连接R3 |
| R2 | GE0/0/0 | 192.168.2.1/24 | RIP域,连接R4 |
| R2 | GE0/0/1 | 10.1.2.1/24 | OSPF域,连接R3 |
| R3 | GE0/0/0 | 10.1.1.2/24 | OSPF域,连接R1 |
| R3 | GE0/0/1 | 10.1.2.2/24 | OSPF域,连接R2 |
| R3 | Loopback0 | 10.1.5.1/32 | OSPF内部路由 |
| R4 | GE0/0/0 | 192.168.1.2/24 | RIP域,连接R1 |
| R4 | GE0/0/1 | 192.168.2.2/24 | RIP域,连接R2 |
| R4 | Loopback0 | 10.1.4.1/32 | RIP内部路由 |
R4宣告Loopback0到RIP,R3宣告Loopback0到OSPF。这样,重发布的目标就很明确:R3要能访问10.1.4.1,R4要能访问10.1.5.1。R1和R2之间的链路故意不连,就是为了让两个ASBR之间只能通过OSPF域或RIP域间接互通,模拟真实场景中的非直连双边界。
2. 基础配置:先把两个协议域跑通
2.1 OSPF与RIP基础配置
先把协议基础配好,确保在重发布之前,OSPF域内和RIP域内各自是通的。
R1的配置:
sysname R1 interface GigabitEthernet0/0/0 ip address 192.168.1.1 255.255.255.0 interface GigabitEthernet0/0/1 ip address 10.1.1.1 255.255.255.0 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.1.1.0 0.0.0.255 rip 1 version 2 undo summary network 192.168.1.0R2的配置无非是地址换成192.168.2.1和10.1.2.1,router-id换成2.2.2.2,其余一样:
sysname R2 interface GigabitEthernet0/0/0 ip address 192.168.2.1 255.255.255.0 interface GigabitEthernet0/0/1 ip address 10.1.2.1 255.255.255.0 ospf 1 router-id 2.2.2.2 area 0.0.0.0 network 10.1.2.0 0.0.0.255 rip 1 version 2 undo summary network 192.168.2.0R3配置OSPF,R4配置RIP:
# R3 sysname R3 interface GigabitEthernet0/0/0 ip address 10.1.1.2 255.255.255.0 interface GigabitEthernet0/0/1 ip address 10.1.2.2 255.255.255.0 interface LoopBack0 ip address 10.1.5.1 255.255.255.255 ospf 1 router-id 3.3.3.3 area 0.0.0.0 network 10.1.1.0 0.0.0.255 network 10.1.2.0 0.0.0.255 network 10.1.5.0 0.0.0.0# R4 sysname R4 interface GigabitEthernet0/0/0 ip address 192.168.1.2 255.255.255.0 interface GigabitEthernet0/0/1 ip address 192.168.2.2 255.255.255.0 interface LoopBack0 ip address 10.1.4.1 255.255.255.255 rip 1 version 2 undo summary network 192.168.1.0 network 192.168.2.0 network 10.1.4.0这里有两个细节:
- OSPF宣告Loopback时,如果掩码是32位,network命令中反掩码写0.0.0.0,设备才会以点路由形式通告。如果写0.0.0.255,也能通,但会出现一条指向该地址的掩码是32位的路由,因为OSPF对Loopback接口默认按主机路由处理。实验里直接宣告32位,后面看路由表更干净。
- RIP关闭自动汇总(
undo summary)是必须的。华为设备上RIP默认开启自动汇总,会在主类网络边界自动汇总,实验中我们的网段都是C类,不关闭会导致某些明细路由无法正确传递,重发布后还会引入一堆垃圾路由。
配完后先验证两个协议域内部连通性。R3上ping R1的10.1.1.1应该通,R4上ping R1的192.168.1.1应该通。这一步没问题再往下走。
2.2 最粗糙的双向重发布:先看看会发生什么
接下来做最原始的双向重发布,不加任何策略,先在R1和R2上配置:
# R1 ospf 1 import-route rip 1 rip 1 import-route ospf 1 # R2 ospf 1 import-route rip 1 rip 1 import-route ospf 1就这么四行,拓扑立刻开始出问题。在R2上执行display ip routing-table,你会看到类似下面的表项:
Destination/Mask Proto Pre Cost Flags NextHop Interface 10.1.4.0/32 RIP 100 1 D 192.168.2.2 GE0/0/0 OSPF 150 1 D 10.1.1.1 GE0/0/1R2同时通过RIP和OSPF学到了10.1.4.0/32。RIP优先级是100,OSPF外部路由优先级是150,所以R2会优先走RIP直连路径,这个没问题。但麻烦的是,10.1.4.0/32这条路由是R1从RIP引入OSPF的,R2从OSPF学到后,因为没有过滤,会把它再重发布回RIP域。
于是R4上会出现一条去往10.1.4.1的路径,下一跳指向R2而非本地直连,甚至可能出现下一跳是R2的RIP路由优先级更高、把R4自己的直连路由挤掉的情况。这个现象很典型,也是后面优化的重点。先记着这个状态,继续看问题。
2.3 多点重发布的典型故障现象:回馈与环路
不加策略的双向多点重发布,最典型的故障有三个:
第一个是路由回馈。R2从OSPF学到R1引入的RIP路由,再注入RIP域,这条路由的下一跳变成了R2。R1从RIP域学到这条“新”路由,发现下一跳不是R4而是R2,于是再注入OSPF。两边的路由不断互相引入,每次引入cost还可能变化,路由表反复刷新,严重时直接导致RIP路由表中的路由跳数无限增大,最终不可达。
第二个是次优路径。RIP和OSPF的外部路由优先级不同,RIP是100,OSPF外部是150。当一台ASBR同时从两个协议学到同一目标网段时,它一定选RIP,哪怕RIP侧要绕很远、OSPF侧是高速链路。这就是重发布后最常见的“有路不走好路”问题。
第三个是路由表中的重复表项。R3上会看到来自R1和R2的两条10.1.4.0/32外部路由,如果两条cost一致就负载均衡,如果不一致,R3只选cost小的一条。看起来好像问题不大,但如果你在R1引入时用了默认cost,在R2引入时用了不同cost,R3的选路就会很随机,而且很难排查为什么“有时候走R1,有时候走R2”。
这时候就需要引入路由策略,把流向彻底梳理清楚。
3. 核心问题剖析:为什么多点重发布这么容易出问题
3.1 路由回馈的具体生成过程
我把RIP域里的10.1.4.0/32当作例子,逐步分析回馈过程:
- R4把10.1.4.0/32通过RIP通告给R1和R2。
- R1把这条RIP路由重发布进OSPF,成为一条OSPF外部路由,通告给R2和R3。
- R2同时从RIP直连学到10.1.4.0/32(优先级100),也从OSPF学到(优先级150)。R2选择RIP路径,这没问题。
- 问题出在第二步之后,R2作为ASBR,把OSPF路由重发布进RIP。R2会把10.1.4.0/32注入RIP域,下一跳指向R2自己。R4收到这条路由,因为它跳数是1,和直连的一样,甚至可能覆盖掉自己的直连路由。
- R1从RIP域又学到一条10.1.4.0/32,下一跳指向R2。R1一看,RIP路由优先级100,比OSPF外部路由优先级高,于是选择这条新学到的RIP路由。然后R1再把它重发布进OSPF,下一跳变成R1。
- 如此循环,每转一圈,RIP路由的metric就增加或者路由表不断刷新。
这就是多点重发布最致命的回馈环路。不是物理拓扑上的环路,而是路由管理层面的逻辑环路,比物理环路更难发现,因为你不看路由表变化根本不知道。
解决思路只有一条:让ASBR在重发布时,识别出“这条路本来就是我这边协议域的路由”,然后拒绝接收。识别的手段就是路由标记(tag)和路由过滤。
3.2 次优路径的生成机制
再来看看次优路径。假设R2和R4之间的RIP链路出现故障,R2只能通过OSPF学到10.1.4.0/32,下一跳是R1。R2把OSPF路由重发布进RIP后,R4会从R2收到一条去往自己Loopback的路由,下一跳是R2。
R4本身去10.1.4.1是直连,优先级0,不会受影响。但如果去的是其他RIP网段,比如RIP域里还有一台R5,情况就麻烦了。R4去R5本来有直连RIP路径,如果R2通过OSPF学到R5网段并注入RIP,可能产生一条等价或更优的路由,导致R4的流量绕经R2、R1再回到R5,而不是直接走RIP内部路径。
在实验拓扑里,次优路径更多体现在R3访问RIP域,或者R4访问OSPF域时选路不精确。尤其是使用OSPF外部路由Type 2时,R3选择ASBR的时候只看外部metric,不看内部链路的cost。这就可能导致R3明明离R2更近,却因为R1引入时设置的外部metric更小而全部走R1。
3.3 理解华为路由优先级与选路规则
要彻底搞懂优化方案,必须先记住华为设备上几个关键优先级:
| 路由来源 | 优先级 |
|---|---|
| 直连路由 | 0 |
| OSPF内部路由 | 10 |
| 静态路由 | 60 |
| RIP路由 | 100 |
| OSPF外部路由 | 150 |
这个优先级决定了当同一目的地有多条不同协议来源的路由时,设备选谁。注意,优先级数值越小越优先。
两个关键推论:
- 一台ASBR同时运行RIP和OSPF,从RIP学到某网段,又从OSPF外部学到同网段,它一定选RIP。因为100小于150。所以即使RIP路径绕远,ASBR也不会走OSPF路径。
- R3是纯OSPF路由器,它选择外部路由时,不比较RIP优先级,只看OSPF外部路由的cost(Type 1还要加上内部cost)。所以R3的选路相对简单,主要靠调整外部路由的metric和type来控制。
理解了这两点,优化手段就清晰了。
4. 优化方案:用tag标记和路由策略控制路由流向
4.1 route-policy的匹配逻辑与配置思路
华为的route-policy由多个节点(node)组成,每个节点有if-match匹配条件和apply动作。匹配时从编号最小的node开始,逐条匹配,一旦命中就执行该节点的动作,后面的节点不再检查。这点非常关键,很多人配了多条策略不生效,就是因为node顺序和匹配逻辑没搞明白。
对于双向多点重发布,我的配置思路分两个方向:
- RIP到OSPF方向:放行RIP域的真实网段,拒绝OSPF域内部已经存在的网段(防止回馈),同时给RIP路由打一个tag标记,标记值为100。
- OSPF到RIP方向:拒绝带tag 100的路由(这些是之前从RIP引入OSPF的,不需要再导回RIP),放行OSPF内部路由,并且设置引入到RIP的cost。
tag标记的原理很朴素:给从RIP进入OSPF的外部路由盖个章,其他ASBR从OSPF学到这条路由时看到这个章,就知道它是从RIP来的,在往RIP重发布时直接拒绝。这样环路就被切断了。
4.2 完整优化配置与逐条解读
在R1上配置:
# R1 route-policy RIP2OSPF permit node 10 if-match ip-prefix OSPF-INTERNAL deny route-policy RIP2OSPF permit node 20 if-match ip-prefix RIP-NETWORK apply tag 100 route-policy OSPF2RIP permit node 10 if-match tag 100 deny route-policy OSPF2RIP permit node 20 apply cost 2 ip ip-prefix OSPF-INTERNAL permit 10.1.5.0 32 ip ip-prefix RIP-NETWORK permit 10.1.4.0 32 ospf 1 import-route rip 1 route-policy RIP2OSPF rip 1 import-route ospf 1 route-policy OSPF2RIP逐条解释:
RIP2OSPF的node 10先匹配OSPF内部网段(这里就是10.1.5.0/32),匹配了就deny,防止把OSPF域内已有的路由再注入回OSPF。- node 20放行RIP网段(10.1.4.0/32),并打上tag 100。
OSPF2RIP的node 10匹配带tag 100的路由并拒绝,这样R1从OSPF学到的来自RIP的路由不会再次进入RIP域。- node 20放行其余OSPF路由(主要是OSPF内部路由10.1.5.0/32),引入到RIP时cost设置为2。
R2上的配置同理会通,但要注意一点:R2要把从RIP学到的10.1.4.0/32引入OSPF时,也打上tag 100;把OSPF的10.1.5.0/32引入RIP时,正常放行。如果R1和R2的RIP到OSPF方向都打同一个tag值100,那么任何一台ASBR在OSPF到RIP方向看到tag 100都会拒绝。这正好实现互相制约:
# R2 route-policy RIP2OSPF permit node 10 if-match ip-prefix OSPF-INTERNAL deny route-policy RIP2OSPF permit node 20 if-match ip-prefix RIP-NETWORK apply tag 100 route-policy OSPF2RIP permit node 10 if-match tag 100 deny route-policy OSPF2RIP permit node 20 apply cost 2 ip ip-prefix OSPF-INTERNAL permit 10.1.5.0 32 ip ip-prefix RIP-NETWORK permit 10.1.4.0 32 ospf 1 import-route rip 1 route-policy RIP2OSPF rip 1 import-route ospf 1 route-policy OSPF2RIP配置完成后,在R2上重新查看路由表,10.1.4.0/32应该只会从RIP学到,不会再出现OSPF外部那条。同样,R1上也不应该出现从OSPF学到的10.1.4.0/32再注入RIP的痕迹。
注意:路由策略配置后要检查设备是否生效,可以用
display route-policy查看策略内容,也可以在路由表变化后手工reset协议进程(RIP和OSPF都可以用reset命令重新建立邻居和路由计算),确认不残留旧路由。实验环境下这是最快见效的方式。
4.3 用Type 1外部路由解决R3的次优路径
环路问题解决后,R3仍然可能面临次优路径。R3去往10.1.4.1的时候,有两条路径:一条经过R1,一条经过R2。如果两条外部路由都是Type 2,R3只比较外部metric,不比较OSPF域内的内部cost。
假设R1引入OSPF时外部cost是1,R2引入时外部cost也是1,那R3看到两条等价路由,会负载均衡。但如果R1和R2引入cost不同,或者R3到R1的链路因为拥塞变得很慢,R3依然可能选择R1,因为Type 2不看内部cost。
解决办法是把OSPF外部路由类型改成Type 1。Type 1外部路由的选路metric = 外部metric + ASBR到本设备的内部cost。这样R3选路时会把R3到R1、R3到R2的链路开销也算进去,选路更精确。
在R1和R2的OSPF引入命令中增加type 1:
# R1 ospf 1 import-route rip 1 route-policy RIP2OSPF type 1 # R2 ospf 1 import-route rip 1 route-policy RIP2OSPF type 1为了让两台ASBR的路径可比,建议把外部metric也设置为一致的值,比如10:
import-route rip 1 route-policy RIP2OSPF type 1 cost 10这样R3看到的10.1.4.0/32有两条Type 1外部路由,一条从R1来,一条从R2来,最终选路取决于R3到R1和R3到R2的内部cost。因为拓扑中R3到两台ASBR的cost相同,R3会形成等价负载均衡。这个结果才是符合物理路径的。
RIP侧同样可以优化次优路径。R4访问10.1.5.1的时候,从R1和R2都能收到RIP外部路由,cost默认是1,R4会负载均衡。如果希望R4优选某台ASBR,可以在对应的OSPF到RIP引入命令中调整cost,例如让R1引入时cost设为2,R2引入时cost设为1,R4就会走R2。
4.4 优先级调整的适用场景
还有一个高阶手段是调整协议优先级。当ASBR自身同时从RIP和OSPF学到目标网段时,默认选RIP,因为RIP优先级100小于OSPF外部优先级150。但如果RIP侧链路质量很差,希望ASBR走OSPF域绕行,就需要修改优先级。
在R1或R2上,把RIP的优先级调到大于150:
# 在RIP视图下修改优先级 rip 1 preference 160这样OSPF外部路由150的优先级就高于RIP的160,ASBR会优先走OSPF。这个命令是全局影响RIP进程的,会影响所有通过RIP学习到的路由的优先级,不是精确到某条路由。所以实际项目中慎用,一般先用路由策略控制方向,优先级调整作为兜底手段。
5. 验证与故障排查实录
5.1 验证命令与预期结果
优化配置完成后,逐步验证:
在R3上查看OSPF外部路由:
display ospf routing预期10.1.4.0/32出现两条外部路由,类型是Type 1,下一跳分别是R1的10.1.1.1和R2的10.1.2.1,两条路由的cost一致(外部cost 10 + 内部cost)。在display ip routing-table里能看到等价负载的表项。
在R4上查看RIP路由:
display rip routing预期10.1.5.0/32出现两条RIP外部路由,下一跳分别是192.168.1.1和192.168.2.1,metric一致,R4可以做负载均衡。
从R3上ping R4的Loopback:
ping -a 10.1.5.1 10.1.4.1从R4上ping R3的Loopback:
ping -a 10.1.4.1 10.1.5.1两个方向的ping都应该通,而且往返延时能够看出走了预期的路径。
查看R2上是否还有10.1.4.0/32的OSPF外部路由回馈路径:
display ip routing-table 10.1.4.0 32正确的结果应该只有一条RIP路由,下一跳指向R4的192.168.2.2。如果还有OSPF外部路由,说明过滤没生效,需要回查route-policy。
5.2 常见问题速查表
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| ASBR路由表中同时出现RIP和OSPF外部路由,且OSPF那条下一跳指向另一台ASBR | 回馈环路,tag过滤未配置或配置错误 | 检查OSPF到RIP方向是否拒绝了tag 100的路由 |
| R3看不到两条外部路由,只有一条 | 两台ASBR中有一台没有成功执行RIP到OSPF重发布,或者RIP邻居故障 | 检查ASBR的RIP邻居状态,检查import-route配置和route-policy是否放行了RIP网段 |
| R3两条外部路由都存在,但选路不符合物理路径 | 外部路由是Type 2,选路没考虑内部cost | 将import-route改为type 1,同时设置一致的外部metric |
| R4访问OSPF域不走直连ASBR,绕到另一侧 | RIP到OSPF方向的cost设置不一致 | 调整ASBR上OSPF引入RIP的cost,让R4选择更近的路径 |
| 配了route-policy后路由反而全部丢失 | route-policy节点没有permit放行规则,匹配不到默认deny | 检查node列表,确认最后有一个放行的permit节点 |
| reset协议进程后路由依然有旧表项 | 路由表老化需要时间,或策略仅对新增路由生效 | 耐心等路由表刷新,必要时清空该协议的路由表重新学习 |
5.3 排查技巧与避坑心得
排查重发布问题,我个人的习惯是先看路由表,再看协议数据库,最后才动策略。
具体顺序是:先在两台ASBR上分别执行display ip routing-table protocol rip和display ip routing-table protocol ospf,搞清楚每条路由从哪个协议学的、下一跳是谁。这一步能筛掉80%的问题,因为回馈和次优路径都能在路由表里看出来。
然后看OSPF的LSDB,重点看Type 5外部LSA带的是什么tag。在ASBR上执行:
display ospf lsdb ase能看到每一条外部路由的Tag字段。如果Tag是100,说明这条路由确实是从RIP打标进来的。然后在往RIP重发布的route-policy里确认是否deny了tag 100。
最后再动手改配置。改完策略后,不同协议的收敛速度不一样,RIP的收敛本身就比OSPF慢,不要一改完就急着看结果。必要时用reset ospf process和reset rip让协议重新计算一次,在实验环境这是最高效的做法。
另外有一个特别容易踩的坑:route-policy默认规则是deny。如果import-route rip 1 route-policy RIP2OSPF调用的策略里没有一条规则能匹配到某个路由,这条路由就会被丢弃,而不是放行。所以配置策略时一定要在最后留一个放行的permit节点,或者用前缀列表精确匹配需要放行的网段,确保该放行的路由不会被静默丢弃。
个人实操体会
这个实验做完,我对重发布的理解完全变了。以前总觉得import-route几条命令很简单,真正排过回馈环路之后才意识到,多点重发布的本质不是把路由“引入”过去,而是给每一条跨协议的路由设计一条”单行道“——从哪里进来,从哪里出去,必须清清楚楚。tag标记就是给路由贴一个身份证,route-policy就是收费站,只有带特定标识的才能通过。
最后分享一个小技巧:如果你做实验的时候看到路由表里的路由一会儿走R1一会儿走R2,先别急着调策略,把两台ASBR上引入时的cost和type统一起来,很多“玄学选路”其实都是因为两边的metric不一致。把基础参数调齐了,选路结果往往就正常了。这个实验后续如果还想加深理解,可以往拓扑里再加一台RIP域的路由器,或者把OSPF改成多区域,路由回馈的形式会更复杂,但也更有意思。