ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OSPF路由重分发实战:原理、配置与防环排错指南

OSPF路由重分发实战:原理、配置与防环排错指南

1. 路由重分发到底在解决什么问题

路由重分发这个词,刚接触网络的人听起来会觉得有点玄乎,其实用一句话就能说清楚:让运行不同路由协议的网段能够互相知道对方的存在,并且把路由信息从一种协议“翻译”成另一种协议。你可以把它想象成两个说不同语言的人需要交流,中间必须有个翻译。OSPF是一种“语言”,静态路由是另一种“语言”,RIP、BGP各自又是不同的“语言”,路由重分发就是那个翻译官。

在实际的网络环境里,一个中等规模以上的网络几乎不可能只用一种路由协议从头跑到尾。常见的情况是这样的:核心层跑OSPF,因为它是链路状态协议,收敛快、支持区域划分、适合大型网络;但网络边缘可能连着一个老设备,只支持RIP;或者有一条专线对端是静态路由配置;又或者有一个外部网络通过BGP交换路由。这些不同来源的路由信息如果不做重分发,各跑各的,网络就是割裂的。你在这头ping不通那头,不是链路断了,而是路由表里根本没有对方的路由条目。

我见过不少刚入行的朋友,遇到“两个网段不通”的问题,第一反应是查物理链路、查VLAN、查接口状态,折腾半天发现物理层完全没问题,最后才想到是路由协议之间没有做重分发。这个坑很典型,因为重分发属于“配置层面”的问题,不像物理故障那样有明显的指示灯或者日志报错,排查起来需要你对路由表有清晰的认识。

适合阅读这篇内容的人:正在准备网络方向认证考试的朋友、刚上手企业网络运维的工程师、需要做多协议互联方案设计的从业者,以及那些“配置敲进去了但不确定为什么这么配”的实操派。我会从原理讲到配置,从配置讲到排错,尽量把每个参数背后的逻辑都掰开说清楚。

2. OSPF重分发的核心原理拆解

2.1 重分发的本质:路由信息的“翻译”与注入

要理解重分发,先要理解路由协议的本质。每种路由协议都在做同一件事:发现路由、计算最优路径、把最优路径写入路由表。但不同协议发现路由的方式不同,度量值的定义也不同。OSPF用开销作为度量值,RIP用跳数,BGP用一堆路径属性。当你把一条路由从协议A重分发进协议B时,协议B并不理解协议A的度量值含义,所以需要你手动指定一个“种子度量值”。

这就是为什么配置重分发的时候总要跟一个metric参数。比如把静态路由重分发进OSPF,你得告诉OSPF:“这些外部路由进来之后,开销值算多少?”如果不指定,OSPF默认是20,但这个默认值在很多场景下并不合适。你想想,如果外部有一条高速专线,你给它设个20的开销,而OSPF内部某条路径开销是10,那流量就会优先走内部路径,外部专线反而闲置了。所以metric的设置不是随便填的,要结合你的网络拓扑和流量规划来定。

另一个核心概念是路由域。OSPF有明确的区域划分,重分发通常发生在ASBR上。ASBR就是自治系统边界路由器,它一头连着OSPF域,另一头连着外部路由域。ASBR把外部路由引入OSPF时,会生成Type-5 LSA(外部LSA),在整个OSPF域内泛洪。如果配置了NSSA区域,还会涉及Type-7 LSA的转换,这个后面细说。

2.2 单向重分发与双向重分发:什么时候用哪个

重分发分两种方向:单向和双向。单向重分发是指只把协议A的路由引入协议B,反过来不做。双向就是两个方向都做。听起来双向更“完整”,但实际操作中,双向重分发是很多网络故障的根源。

为什么这么说?因为双向重分发容易产生路由环路和次优路径。举个例子:OSPF域和RIP域之间做了双向重分发。OSPF学到了一条外部路由,重分发进RIP;RIP又通过另一个接口把这条路由学回来,再重分发回OSPF。这时候OSPF里就出现了两条来源不同的同一条路由,一条是原始的,一条是绕了一圈回来的。如果管理距离和度量值设置不当,路由器可能选择那条绕圈的路由,流量就在两个域之间来回弹,TTL耗尽,网络瘫痪。

所以我的经验是:能单向就单向,必须双向时一定要配合路由过滤和标签管理。比如用route-map在重分发的时候打tag,另一边重分发时拒绝带特定tag的路由,这样就能有效防止环路。这个技巧在后面实操部分会详细展开。

2.3 度量值、管理距离与种子度量的三角关系

这三个概念经常被混淆,我逐个拆开说。

度量值是路由协议内部用来比较路径优劣的数值。OSPF的度量值是开销,跟带宽成反比,带宽越高开销越小。RIP的度量值是跳数,最多15跳,16跳不可达。不同协议的度量值没有可比性,就像你不能拿温度计的读数和体重秤的读数比大小一样。

管理距离是路由器用来比较不同协议学到的同一条路由的可信度。直连路由管理距离是0,静态路由默认是1(或0,取决于厂商实现),OSPF是110,RIP是120。数值越小越可信。所以当OSPF和RIP同时学到一条路由时,路由器会选OSPF的,因为110小于120。

种子度量是重分发时你手动指定的初始度量值。这条路由进入新协议后,就按照新协议的规则参与选路。种子度量设多少,直接决定了这条外部路由在新协议域内的“竞争力”。

这三者的关系可以用一个场景串起来:你把一条静态路由重分发进OSPF,种子度量设为100。OSPF域内的路由器学到这条外部路由,开销是100。如果同时有一条OSPF内部路由到达同一个目的地,开销是50,那路由器会选内部路由,因为50小于100。如果你希望外部路由优先,就得把种子度量调低,比如设成10。但调低之后要小心,可能影响其他路径的选路。

注意:种子度量的设置没有“标准答案”,必须结合你的实际拓扑和流量需求来定。建议在重分发之前先画一张路由流向图,标清楚每条路径的预期开销,再反推种子度量该设多少。

3. OSPF重分发实操配置详解

3.1 把静态路由重分发进OSPF

这是最常见的场景之一。假设你有一台边界路由器,上面配置了一条静态路由指向外部网络,现在需要让OSPF域内的其他路由器也能学到这条路由。

配置思路是这样的:先确认静态路由本身是生效的,然后在OSPF进程下使用redistribute static命令,并指定metric和metric-type。

# 假设OSPF进程号为1,静态路由已经配置 router ospf 1 redistribute static subnets metric 100 metric-type 2

这里有几个关键点要解释。subnets这个关键字非常重要,如果不加,默认只重分发主类网络路由,子网路由会被丢弃。比如你有一条192.168.1.0/24的静态路由,不加subnets的话,重分发进OSPF的只有192.168.0.0/16这样的主类网络,子网信息丢了,路由就不精确了。这个坑我踩过,当时排查了半天才发现是少敲了一个关键字。

metric-type有两种:Type-1和Type-2。Type-1表示外部路由的开销等于种子度量加上到达ASBR的内部开销;Type-2表示外部路由的开销就是种子度量,不再叠加内部开销。默认是Type-2。什么时候用Type-1?当你希望OSPF域内的路由器根据到ASBR的距离来选路时用Type-1;当你希望所有外部路由的开销统一由种子度量决定时用Type-2。大多数场景下Type-2够用,但如果你有多个ASBR同时引入外部路由,Type-1能让选路更精确。

3.2 把RIP重分发进OSPF并处理度量值

RIP和OSPF之间的重分发稍微复杂一点,因为RIP的度量值是跳数,OSPF是开销,两者需要转换。

router ospf 1 redistribute rip subnets metric 200 metric-type 2

这里metric设200,意味着所有从RIP学来的路由进入OSPF后开销都是200。这个值怎么定?我的经验是:先看看OSPF域内到达同一目的地的内部路由开销大概是多少,然后让外部路由的开销略高于内部路由,这样正常情况下流量走内部,只有内部路径失效时才走外部。当然,如果你的设计就是让外部路径做主路径,那就把metric调低。

反过来,把OSPF重分发进RIP:

router rip version 2 redistribute ospf 1 metric 3

RIP的metric是跳数,这里设3表示这些路由在RIP域内算3跳。为什么设3?因为RIP最大15跳,设太小可能导致路由被认为太近而引发次优路径,设太大又可能超过15跳不可达。一般设2到5之间比较常见,具体看RIP域的规模。

实操心得:RIP重分发进OSPF时,如果RIP域内有默认路由,要特别小心。默认路由重分发进OSPF后可能覆盖掉OSPF自己的默认路由,导致流量走向错误。建议用route-map过滤掉默认路由,或者明确指定不重分发0.0.0.0/0。

3.3 双向重分发的防环配置:route-map与tag

前面说了双向重分发容易出环路,这里给出具体的防环方案。核心思路是:给从一个协议重分发出去的路由打上tag,当这些路由从另一个协议回来时,根据tag拒绝重分发。

先看OSPF到RIP的方向:

router ospf 1 redistribute rip subnets metric 100 metric-type 2 route-map FROM_RIP route-map FROM_RIP deny 10 match tag 100 route-map FROM_RIP permit 20 set tag 200

这段配置的意思是:从RIP重分发进OSPF的路由,如果带有tag 100,就拒绝(deny);其他的允许,并打上tag 200。

再看RIP到OSPF的方向:

router rip redistribute ospf 1 metric 3 route-map FROM_OSPF route-map FROM_OSPF deny 10 match tag 200 route-map FROM_OSPF permit 20 set tag 100

这样形成一个闭环:OSPF重分发出去的路由带tag 100,从RIP回来时被deny;RIP重分发出去的路由带tag 200,从OSPF回来时被deny。环路就被切断了。

这个方案看起来有点绕,但逻辑是清晰的。你可以把它理解成给每个方向的路由发一张“通行证”,通行证编号不对的就不让进。实际配置的时候,tag的数值可以自己定,只要两个方向不冲突就行。

3.4 NSSA区域中的重分发处理

NSSA是Not-So-Stubby Area的缩写,是一种特殊区域。普通Stub区域不允许外部路由进入,但NSSA允许,只是外部路由以Type-7 LSA的形式存在,到了ABR再转换成Type-5 LSA。

在NSSA里做重分发,配置跟普通区域差不多,但要注意一点:NSSA的ASBR不能是ABR。也就是说,如果你有一台路由器既是区域边界路由器又是自治系统边界路由器,在NSSA里会有问题。解决方案是把重分发放在NSSA内部的一台非ABR路由器上,或者把区域类型改成普通区域。

# NSSA区域内的ASBR配置 router ospf 1 area 1 nssa redistribute static subnets metric 50 metric-type 2

NSSA还有一个有用的特性叫默认路由自动下发。在NSSA的ABR上配置area 1 nssa default-information-originate,ABR会向NSSA区域内注入一条默认路由,区域内的路由器就不用关心外部具体路由了,全部走默认路由出去。这个在分支办公场景很实用。

4. 重分发后的选路与排错实战

4.1 为什么重分发后路由不生效:五个常见原因

配置敲完了,show ip route一看,路由没进来。这种情况太常见了,我总结下来大概有五个原因。

第一个原因:子网没加subnets。前面提过,不加subnets只重分发主类网络。如果你的路由是/24、/25这种子网,不加subnets就丢了。这个是最容易犯的错误,尤其是从其他厂商设备转过来的工程师,习惯不同。

第二个原因:路由本身不在路由表里。重分发的前提是路由必须已经存在于路由表中。如果静态路由配置了但下一跳不可达,路由不会出现在路由表里,自然也不会被重分发。先用show ip route确认路由存在。

第三个原因:route-map或distribute-list过滤掉了。检查route-map的匹配条件,看看是不是match语句写错了,或者deny语句把该放行的路由拦住了。distribute-list也要检查,有时候在OSPF进程下配了distribute-list in,把重分发进来的路由又过滤掉了。

第四个原因:管理距离导致路由被覆盖。如果OSPF重分发进来的路由和已有的静态路由指向同一目的地,静态路由管理距离更小,OSPF路由不会出现在路由表里。这时候需要调整管理距离或者删除冲突的静态路由。

第五个原因:区域类型不匹配。如果重分发发生在Stub区域或NSSA区域,但配置方式不对,外部路由无法进入。检查区域类型配置是否正确。

4.2 次优路径的排查与修正

次优路径比重分发失败更隐蔽,因为路由是通的,只是走了一条不该走的路。排查次优路径,核心工具是traceroute和show ip route的对比分析。

举个例子:你从总部ping分支的某个网段,发现延迟比预期高很多。traceroute一看,流量绕了一个大圈,先到了另一个分支再折回来。这就是典型的次优路径。原因可能是重分发的种子度量设得太低,导致外部路由比内部路由更“诱人”,所有流量都往外部路径挤。

修正方法有几种:调高种子度量、用route-map给特定路由设置更高的metric、或者用distribute-list直接过滤掉不该重分发的路由。我一般优先考虑调高种子度量,因为改动最小,影响面可控。如果调高之后影响了其他正常路径,再考虑用route-map做精细控制。

注意:调整种子度量之前,先用show ip ospf database external查看外部LSA的详细信息,确认当前的开销值和转发地址。转发地址如果是0.0.0.0,表示流量要经过ASBR;如果是非零地址,表示可以直接到达下一跳,不经过ASBR。这个区别对选路影响很大。

4.3 重分发环路:症状、诊断与紧急处置

路由环路的症状很明显:网络时通时断、延迟飙升、路由器CPU占用率高、TTL过期报文增多。如果你在重分发后遇到这些症状,基本可以判定是环路。

诊断步骤:先在疑似环路的路由器上show ip route,看有没有同一目的地的多条路由来回切换;然后show ip ospf database看LSA的序列号是不是在快速增长;再用traceroute看路径是不是在两个点之间反复跳。

紧急处置:最快的方法是在其中一个方向上加route-map deny,切断环路。比如在OSPF到RIP的重分发上加一条deny any,先止血,再慢慢排查具体是哪条路由引起的。止血之后,用show ip route和show ip ospf database逐条分析,找到那条“绕圈”的路由,给它打tag或者加过滤。

预防措施就是前面说的tag方案。我的习惯是:只要做双向重分发,第一件事就是配tag,不配tag不上线。这个习惯帮我避免了好几次深夜救火。

4.4 常用排查命令速查表

命令用途关键看什么
show ip route查看路由表路由是否存在、下一跳、度量值、管理距离
show ip route ospf只看OSPF路由外部路由是否标记为O E1或O E2
show ip ospf database external查看外部LSA开销值、转发地址、tag
show ip ospf database nssa-external查看NSSA外部LSAType-7 LSA的详细信息
show ip protocols查看路由协议状态重分发配置是否生效、过滤列表
traceroute路径追踪是否绕路、是否环路
debug ip routing实时路由变化路由的添加、删除、切换过程

这张表建议存下来,排错的时候按顺序过一遍,大部分问题都能定位到。

5. 重分发方案设计与经验总结

5.1 什么场景该做重分发,什么场景不该做

重分发不是万能的,有些场景用重分发反而把事情搞复杂。我的判断标准是这样的:

该做重分发的场景:两个路由域之间需要互相访问,且没有其他更简单的方案;网络规模中等,路由条目在可控范围内;有明确的边界路由器作为重分发点。

不该做重分发的场景:如果两个域之间只需要单向访问,用静态路由或默认路由更简单;如果路由条目太多,重分发会导致LSA泛洪量过大,影响性能;如果两个域的管理策略完全不同,重分发可能引入安全风险。

替代方案包括:静态路由、策略路由、BGP。BGP虽然配置复杂,但在大型网络中比OSPF重分发更可控,因为BGP有丰富的路径属性和过滤机制。如果你的网络规模已经大到OSPF重分发扛不住了,考虑上BGP。

5.2 重分发方案设计的四个关键决策

设计重分发方案时,有四个决策点必须明确:

决策一:单向还是双向。优先单向,必须双向时加tag防环。

决策二:种子度量设多少。根据拓扑和流量规划反推,不要用默认值。

决策三:用Type-1还是Type-2。单ASBR场景Type-2够用,多ASBR场景考虑Type-1。

决策四:要不要做路由过滤。如果外部路由条目太多,或者有些路由不该被重分发,用route-map或distribute-list过滤。

这四个决策没有标准答案,但每个决策都要有明确的理由。我在实际项目中见过太多“别人这么配我也这么配”的情况,结果网络一出问题就抓瞎,因为不知道当初为什么这么设计。

5.3 我踩过的三个坑和对应的解决方案

第一个坑:忘了加subnets,子网路由丢失。当时是两个办公区互联,配置完重分发后发现只有主类网络能通,子网全部不通。排查了一个多小时才发现是subnets关键字没加。从那以后,我配重分发的第一件事就是敲subnets。

第二个坑:双向重分发没打tag,环路导致网络瘫痪。那是一次紧急割接,时间紧任务重,想着“先通了再说”,结果通了五分钟就开始环路。紧急加deny any止血,然后补tag配置。教训就是:再急也不能省防环配置。

第三个坑:种子度量设得太低,流量全走外部路径。本来设计的是内部路径为主、外部路径为备,结果种子度量设了10,比内部路径开销还低,所有流量都挤到外部专线上,专线带宽跑满,内部链路闲置。后来把种子度量调到200,流量就回到内部路径了。

这三个坑的共同点是:都是配置细节问题,但影响面很大。重分发这个技术点,原理不复杂,难的是细节把控和场景判断。

5.4 给不同阶段从业者的建议

如果你是刚接触重分发的新手,建议先在模拟器上把单向重分发练熟,理解metric、metric-type、subnets这三个参数的作用,然后再尝试双向重分发和tag防环。

如果你是有一定经验的运维工程师,建议重点掌握route-map的灵活运用,因为实际项目中重分发往往需要配合过滤和策略,单纯的redistribute命令不够用。

如果你是网络架构设计者,建议在方案设计阶段就把重分发的边界、度量值规划、防环策略想清楚,不要等到实施阶段再临时决定。重分发方案的设计质量,直接决定了网络后期的稳定性和可维护性。

最后分享一个我个人的习惯:每次做完重分发配置,我都会用show ip route和traceroute做一轮完整的路径验证,确认每个网段的去程和回程都符合预期。这个习惯看起来费时间,但比出了问题再排查要高效得多。网络这行,预防永远比救火划算。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进