ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OSPF与RIP双向路由重发布实验:从配置到环路规避

OSPF与RIP双向路由重发布实验:从配置到环路规避 重发布实验从零搭建OSPF与RIP的双向路由注入把常见坑一次踩完做网络的人应该都遇到过这种场景公司合并了另一个部门或者新接了一套老系统人家那边跑的是RIP你这边是OSPF两边路由协议不一样业务要互通怎么办?总不能把所有设备全部重新割接一遍协议吧。这时候就需要重发布Route Redistribution把一种协议学到的路由转换成另一种协议的格式再注入到对方的协议域里。这个实验我前前后后做了小半个月从最简单的单点双向重发布开始一路做到双点双向中间踩了种子度量值丢失、路由回灌、次优路径、环路整整四个大坑。这篇文章把这套实验的完整思路、配置过程和排查方法全部整理出来不管你是准备HCIP/CCNP考试还是实际工作中要处理多协议共存的网络都能直接拿来参考。1. 重发布到底在解决什么问题1.1 为什么会出现多协议共存的网络很多刚入门的朋友会有一个疑问为什么不能全网统一用一种协议这个问题在真实网络里其实没有标准答案因为网络是慢慢长出来的不是一次性规划出来的。我见过最典型的情况是历史遗留。早期企业内部网络规模小用RIP或者静态路由就够了后来业务扩张新增的设备上跑了OSPF。最麻烦的是并购场景两家公司网络合并各自的技术栈不一样一边是思科设备跑EIGRP一边是华为设备跑OSPF物理线路一打通协议层面却互不相认。还有一种情况是协议本身有适用边界。OSPF适合中大型园区和数据中心内部BGP适合跨AS的路由交换RIP虽然老旧但在一些特定设备和简化场景里还在服役。协议本身没有绝对的好坏但当多种协议同时存在于一张网络里时就必须有一个机制让它们互相听懂对方的路由信息这个机制就是重发布。1.2 重发布的本质与核心应用场景重发布的本质可以这样理解每个路由协议都有自己的语言体系OSPF用Router ID和链路状态数据库描述网络拓扑RIP用跳数来描述距离它们各自维护一张独立的路由表。重发布做的事情就是在两个协议的边界设备上把一种协议的路由表条目翻译成另一种协议的格式然后注入进去。听起来很简单但一定要注意一个关键点重发布不是把整张路由表照搬过去而是要经过过滤转换注入三个步骤。过滤是决定哪些路由可以被发布转换是把度量值换成目标协议能识别的形式注入是以外部路由的身份进入目标协议域。最常见的重发布场景有这么几类多协议边界互通OSPF域和RIP域、OSPF域和IS-IS域之间的路由共享这是最基础也最常见的需求静态路由引入动态协议把指向出口或者特定业务网段的静态路由重发布进OSPF让全网设备都知道怎么到达这些网段直连路由引入把设备直连网段引入到动态协议中往往用于某些特殊网段不参与协议计算的场景双点双向重发布两个边界设备同时做双向发布实现链路冗余和负载分担这也是最容易出问题的场景后面会详细讲1.3 实验拓扑与整体规划设计做重发布实验拓扑不需要很复杂但每个设备的位置和协议划分要提前想清楚。我这次用的是三台路由器加一台交换机的精简拓扑OSPF Area 0 RIP R1 ----------------- R2 ----------------- R3 (Loopback 1.1.1.1) (边界设备) (Loopback 3.3.3.3)R1和R2之间跑OSPF区域为Area 0R2和R3之间跑RIPR2作为唯一的边界设备需要做双向重发布把OSPF路由发布进RIP再把RIP路由发布进OSPF用的设备是华为eNSP模拟器里的AR2220系统版本比较经典RIP用V2版本OSPF进程号为1。这个拓扑对应的就是一个典型的单点双向重发布场景也就是只有一个边界设备两边都是单归属连接。在动手敲配置之前我强烈建议大家先在草稿纸上把路由流向画清楚哪些路由要从OSPF进RIP哪些要从RIP进OSPF各自的度量值怎么算会不会出现路由回灌。这一步做好了后面配置就是填空的事。2. 动手前必须先搞懂的三个底层机制2.1 种子度量值重发布后的路由代价怎么算这是所有重发布实验里第一个坑也是最容易让新手懵的地方。每个路由协议都有自己度量值的计算方式。OSPF使用的是开销值Cost默认跟接口带宽相关计算公式是参考带宽/接口带宽。RIP使用的则是跳数每经过一台路由器跳数加1最大有效跳数是15。重发布发生时边界设备收到源协议的路由后要把这些路由注入到目标协议里但目标协议根本无法理解源协议的度量值含义所以必须给这些外部路由一个初始度量值这个值就叫种子度量值Seed Metric。默认情况下华为设备在将RIP路由重发布到OSPF时外部路由的Cost默认是1。而在将OSPF路由重发布到RIP时默认的跳数是0但由于RIP的度量值每经过一跳都会增加实际上从边界设备R2发出去的路由到了R3那边跳数就变成1了。问题就出在这个默认值上。OSPF外部路由Cost为1意味着所有通过重发布进来的路由都被当作最优路径来选如果网络里本身存在真实的OSPF内部路由流量很可能会被错误地引导到重发布路径上引发次优路径。RIP跳数为0在华为设备上虽然能正常传递但如果对方设备默认不接受跳数为0的路由部分厂商实现会有这个问题路由就无法生效。我的做法是在配置重发布命令时显式指定种子度量值。比如OSPF这边我习惯把外部路由Cost设为10RIP这边把跳数设为3避免默认值带来的隐患。命令后面会详细写这里是提醒大家脑子里要绷紧这根弦。2.2 路由优先级不同协议的路由同时存在听谁的第二个必须理解的机制是路由优先级华为设备上叫Preference思科设备上叫Administrative Distance管理距离。当路由器从多个协议学到去往同一目的网段的路由时路由器不可能同时使用所有路径必须选出一条最优的放进IP路由表。不同的协议之间的优先级是有明确排序的华为设备的默认值是直连路由0OSPF内部路由10静态路由60RIP路由100。也就是说当一个网段既出现在OSPF路由表里又出现在RIP路由表里路由器会优先选择OSPF那条根本没RIP什么事。这个机制本身是为了保证选路的一致性但在重发布场景下会带来一个非常隐蔽的问题。假设R1有一个Loopback网段1.1.1.1/32这个网段通过OSPF宣告后在R2上以OSPF内部路由的形式存在。现在你又在R2上把OSPF重发布到RIPR3就能通过RIP学到1.1.1.1/32。看起来没有任何问题但如果你同时在R3上也配置了OSPF让R3也能通过OSPF学到这个网段那么R3就会优先使用OSPF路由不论RIP那条路径是否更优。在一台设备上查看路由表时一定要关注路由条目的来源和优先级不要看到目的网段一样就以为配置生效了。实际排查中我见过太多人费了半天劲配置重发布结果在目标设备上死活看不到路由最后发现是被本地的直连路由或者更高优先级的协议路由给压住了。2.3 路由回灌与反馈环路重发布最危险的副作用如果说前两个机制只是影响选路那路由回灌就是可能导致全网路由震荡甚至业务中断的严重问题。路由回灌的原理很简单A协议的路由被重发布到了B协议如果这条路由又被从B协议重发布回A协议那就形成了路由环路。路由本身在两边来回倒腾每次经过边界设备时度量值都会发生变化虽然网络层的数据包不一定会在这个环里打转但路由协议的控制层面会产生持续的路由更新和计算浪费设备CPU资源严重时会导致路由表反复震荡。出现回灌的最典型场景就是双点双向重发布。想象一下R2和R4都是边界设备同时连接OSPF域和RIP域。OSPF里的某条路由在R2上被发布进RIPR4从RIP学到了这条路由然后R4又把它重发布回OSPF。这下OSPF域里就出现了两条去往同一目的网段的外部路由一条来自R2一条来自R4而且R4发布回来的这条由于度量值可能更优OSPF会把它当成主要路径数据流量从OSPF内部绕到R4再走RIP回到R2路径就偏离了。解决路由回灌的标准方法是路由标记Route Tag。在边界设备上做重发布时给从A协议注入B协议的路由打上一个tag比如200当B协议的路由准备注入回A协议时检查路由的tag值如果已经带上了自己打的标记就丢弃这条路由不参与重发布。这个方法在后面双点双向实验里会详细说。3. 实验环境搭建与单点双向重发布配置过程3.1 基础接口配置与协议启动先把三台设备的基础配置搞定。接口规划如下R1的G0/0/0接口连接R2IP为192.168.12.0/24网段R1侧192.168.12.1R2侧192.168.12.2R2的G0/0/1接口连接R3IP为192.168.23.0/24网段R2侧192.168.23.2R3侧192.168.23.3R1和R3各配置一个Loopback接口用于模拟业务网段R1是1.1.1.1/32R3是3.3.3.3/32基础IP配置比较枯燥但必须确保每台设备的直连网段都能ping通这是后面所有实验的前提。R1上的配置如下interface GigabitEthernet0/0/0 ip address 192.168.12.1 255.255.255.0 interface LoopBack0 ip address 1.1.1.1 255.255.255.255R2上配置两个接口的地址R3的配置和R1类似这里就不赘述了。配置完后在R2上用ping 192.168.12.1和ping 192.168.23.3做连通性验证两个都能通再往下走。然后启动路由协议。R1和R2之间跑OSPFR1宣告自己的直连网段和Loopback网段ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 192.168.12.0 0.0.0.255 network 1.1.1.1 0.0.0.0R2上同时启动OSPF和RIPOSPF部分宣告连接R1的接口网段RIP部分宣告连接R3的接口网段ospf 1 router-id 2.2.2.2 area 0.0.0.0 network 192.168.12.0 0.0.0.255 rip 1 version 2 network 192.168.23.0R3上启动RIP宣告连接R2的接口网段和自己的Loopback网段rip 1 version 2 network 192.168.23.0 network 3.3.3.3此时在没有做重发布的情况下R1的路由表里只有直连网段和OSPF邻居学到的192.168.12.0/24R3的路由表里只有直连网段和RIP学到的192.168.23.0/24两边互相不知道对方Loopback网段的存在。在R1上ping 3.3.3.3必然是失败的这就形成了两个隔离的协议域。3.2 单点双向重发布的配置命令与参数选择现在开始做重发布。我的习惯是分两步走先在R2上把OSPF路由发布到RIP验证R3能学到R1的Loopback网段再把RIP路由发布到OSPF验证R1能学到R3的Loopback网段。每一步都用路由表验证结果不要一次性全配上出了问题不好定位。第一步在R2的RIP进程下配置重发布OSPF路由rip 1 import-route ospf 1 cost 3这里的cost 3就是前面提到的种子度量值。华为RIP默认的种子度量值是0虽然RIP可以传递度量值为0的路由但实际使用中我建议显式指定一个大于0的值避免在某些厂商设备上出现兼容性问题。设为3的意思是R2注入到RIP的路由初始跳数为3R3学到后跳数变成4这个数值要和RIP域内的真实跳数拉开差距防止外部路由抢占内部路由的优先级。配置完成后在R3上查看路由表display ip routing-table路由表里应该能看到一条RIP路由目的网段是1.1.1.1/32下一跳是192.168.23.2。用这条命令确认路由存在后再用ping 1.1.1.1验证连通性正常情况下可以通。第二步在R2的OSPF进程下配置重发布RIP路由ospf 1 import-route rip cost 10这条命令的作用是把RIP学习到的路由以OSPF外部路由Type 2的形式注入OSPF域Cost为10。之所以没用默认值1是因为如果把外部路由的Cost设为1它可能会比OSPF内部的路由还要优导致流量走向异常。设为10是一个比较折中的选择。在R1上再次查看路由表这次能看到1.1.1.1之外的3.3.3.3/32路由来源是OSPF类型是O_ASE也就是外部路由。R1上ping 3.3.3.3验证连通性。3.3 配置完成后的路由表现与连通性验证到这里单点双向重发布就完成了。我习惯做一轮完整的连通性和路径验证不能只看路由表。从R1上tracert 3.3.3.3路径应该是R1 - R2 - R3每一跳都通。从R3上tracert 1.1.1.1路径应该是R3 - R2 - R1。如果路径正确说明数据层面的转发没有异常。还要在R2上分别看一下OSPF路由表和RIP路由表确认重发布的路由是否正确进入了对端的协议数据库。R2上执行display ospf routing能看到一条类型为External的路由目的网段是3.3.3.3/32Cost为10。执行display rip 1 route能看到一条目的网段为1.1.1.1/32的路由Cost为3。这里有一个我踩过的坑想提醒大家华为设备默认的OSPF外部路由类型是Type 2OE2Type 2外部路由在传播过程中只累加外部Cost不累加内部Cost也就是说不管ASBR到目的网段中间经过多少台路由器Cost始终是初始值。而Type 1外部路由OE1会在传播过程中累加路径开销。对于重发布进OSPF的路由如果你的内部拓扑链路带宽差异很大建议用Type 1。配置方法是在import-route后加type 1参数ospf 1 import-route rip cost 10 type 13.4 实验中的配置验证与关键命令汇总做这个实验时有一些命令我几乎每隔几分钟就要敲一遍整理出来方便大家参考。# 查看IP路由表确认路由条目的来源、优先级、下一跳 display ip routing-table # 查看指定网段的路由详情会显示路由类型、优先级、Cost等详细信息 display ip routing-table 3.3.3.3 32 # 查看OSPF路由表和邻居状态排查OSPF侧问题 display ospf routing display ospf peer brief # 查看RIP路由表和邻居状态排查RIP侧问题 display rip 1 route display rip 1 neighbor验证的顺序我建议是先看物理连通性ping直连接口再看协议邻居ospf peer、rip neighbor最后看路由表和路径tracert。按照这个顺序排查基本上能快速定位到问题出在二层、协议邻居还是路由策略上。4. 进阶实验双点双向重发布与环路风险实战4.1 扩展拓扑与双点双向配置单点双向重发布只涉及一个边界设备所有路由都从这一个点进出口虽然简单但存在单点故障的风险。如果R2宕机了整个OSPF域和RIP域就彻底断开了。真实网络里为了保证高可用至少会部署两台边界设备做冗余这时候就变成了双点双向重发布。我在单点实验跑通后把拓扑扩展成了这样OSPF Area 0 RIP R1 ----------------- R2 ------------------- R3 | | | | | | ----------------------------------------- R4 ------------------------------ (边界设备2)R2和R4同时连接OSPF域和RIP域两台设备都做双向重发布。这样的好处是链路冗余R2挂了R4还能扛住但代价就是路由回灌和次优路径的风险成倍增加。R4的基础配置不再赘述关键是它的重发布配置和R2保持对称。以R4为例ospf 1 router-id 4.4.4.4 area 0.0.0.0 network 192.168.14.0 0.0.0.255 import-route rip cost 10 type 1 rip 1 version 2 network 192.168.34.0 import-route ospf 1 cost 3R2和R4都配置了双向重发布之后整个网络就处于两边的路由互相导入导出的状态。在完成配置的瞬间大部分情况下网络不会立刻出问题但随着时间的推移和路由的传播问题会逐渐浮出水面。4.2 双点双向后必然出现的次优路径问题配置完双点双向我先在R1上查看路由表观察去往R3 Loopback网段3.3.3.3/32的路由。单点实验时R1只有一条经过R2的OSPF外部路由。现在R2和R4都在往OSPF里注入RIP路由R1会同时收到两条去往3.3.3.3/32的外部路由一条来自R2下一跳是192.168.12.2另一条来自R4下一跳是192.168.14.4。OSPF会根据Cost选出一条最优的放进IP路由表。问题来了。R2注入的Cost是10R4注入的Cost也是10两条路由Cost完全一样OSPF会同时使用它们做负载分担。但这两条路径的实际质量并不相同。R2到R3之间是直接相连的一跳就到R4到R3虽然也是直连RIP域但从R1的角度看走R2只需要经过R1-R2一跳走R4至少经过R1-R4一跳而R1到R4之间的链路带宽可能只有R1到R2的十分之一实际转发性能天差地别。如果链路带宽差异再大一点次优路径的影响就更严重了。比如R1-R2之间是千兆链路R1-R4之间是百兆链路OSPF选路默认只看Cost完全无视带宽差异除非你手工调整Cost结果大部分业务流量走到百兆链路上网络卡得不行。这时候就要用到路由策略了。在R2和R4上做重发布时不应该简单地把所有路由一股脑注入而要结合源网段和路径质量做精细化控制。我的做法是用route-policy配合prefix-list在一边发布的路由上设置较低的Cost另一边设置较高的Cost人为制造主备路径。比如让R2发布的路由Cost为10R4发布的路由Cost为20这样R1会优先走R2R2故障时自动切换到R4。4.3 路由回灌的复现与Tag标记的解决方案双点双向的第二个大坑就是路由回灌。我在实验里把这个问题完整复现了一次过程非常典型。场景是这样的R1上的Loopback网段1.1.1.1/32通过OSPF宣告后到了R2的OSPF路由表里。R2把OSPF路由重发布进RIPR4从RIP学到了1.1.1.1/32。由于R4也配置了RIP到OSPF的重发布R4会把这条从RIP学到的路由再次重发布回OSPF。结果OSPF域里的所有路由器就收到了两条去往1.1.1.1/32的外部路由一条源是R2一条源是R4。如果R4发布回去的路由Cost更小比如R4给这条路由打的Cost是1那么R2自己都会动摇它在OSPF路由表里会选择从R4学习到的这条外部路由作为去往1.1.1.1/32的路径。而R4这条路径的下一跳走的是RIP域RIP域的下一跳又指向R2。数据包到达R2后根据RIP路由表转发到R4所在的RIP域形成一条R1 - R2 - R4 - R2的环路。抓包看的时候TTL减到0了数据包还在打转典型的环路特征。解决这个问题的标准做法是路由标记Route Tag。思路非常简单在R2上把OSPF路由发布进RIP时给这条路由打上Tag 100在R4上把RIP路由发布进OSPF时检查路由的Tag如果发现Tag已经是100说明这条路由本来就是从OSPF出去的现在又绕回来了直接丢弃不再发布。反向同理R4发布进RIP的路由打Tag 200R2发布进OSPF时检查Tag 200并丢弃。具体配置需要先定义route-policy# R2上的配置 route-policy DENY_TAG_200 deny node 10 if-match tag 200 route-policy DENY_TAG_200 permit node 20 route-policy SET_TAG_100 permit node 10 apply tag 100 ospf 1 import-route rip route-policy DENY_TAG_200 rip 1 import-route ospf 1 route-policy SET_TAG_100R4上的配置正好反过来把Tag改成200和100的对应关系。这样两边都能识别这是我自己发布出去的路由从源头上切断回灌。4.4 双点双向后的精细路由控制思路双点双向的实验做完我对重发布的认知又深了一层。很多人觉得配置重发布就两条import-route命令的事那只是能通的层面。真实网络要求的是可控要精确知道每一条路由从哪进、从哪出、走哪条路径、故障时切到哪条路径。实际项目中我通常会在双点双向的基础上叠加三类策略第一类是发布控制。用filter-policy或者route-policy先过滤掉不必要的路由比如某些管理网段、私网保留地址段不应该出现在动态路由里在重发布时就拦掉。第二类是选路控制。通过调整种子度量值、修改OSPF外部路由类型Type 1/Type 2、配合接口Cost让边界设备发布的同一条路由在不同区域内有明确的优先顺序。第三类是环路防护。对所有重发布的路由打Tag在另一个方向的重发布点做Tag检查宁可多花一点配置时间也要把环路风险扼杀在摇篮里。这三类策略不是孤立的而是配合使用的。比如我一般会先写prefix-list定义路由范围再写route-policy关联tag和cost最后在import-route命令里引用route-policy。逻辑清晰了排错也容易。5. 常见问题与排查技巧实录5.1 配置了重发布目标设备却看不到路由这是我被问得最多的问题也是最容易解决的。配置了import-route但在对端设备上看不到预期路由按下面的顺序排查基本都能找到原因。第一步在边界设备上确认源协议路由表里确实存在要重发布的路由。如果在边界设备上都没有这条路由那不管怎么配都不会发布出去。比如你要把OSPF路由发布进RIP先在R2上执行display ospf routing确认这条路由在OSPF路由表里存在并且状态正常。第二步确认重发布命令有没有写错进程号。OSPF的进程号是本地概念R1的OSPF进程1和R2的OSPF进程1可以是完全独立的重发布时import-route ospf 1里的1必须和R2本地运行的OSPF进程号一致。同理RIP进程号也一样华为RIP默认进程号是1但如果你创建了多个RIP进程这里的进程号不能搞混。第三步看目标设备的路由表里有没有被更高优先级的路由覆盖。前面说过华为设备上OSPF优先级10高于RIP的100如果目标设备能通过OSPF学到同一条路由即使RIP重发布成功路由表里也不会显示RIP那条。第四步检查通告范围。RIP默认有水平分割和毒性反转机制OSPF每个区域有自己独立的链路状态数据库如果你的网络有多个区域或者存在特殊的RIP配置重发布的路由可能不会传播到所有设备。5.2 路由表里出现了两条等价路由流量分布不符合预期双点双向重发布后路由表里出现两条去往同一网段的外部路由是正常现象但如果两条路径的实际质量差异很大就需要干预了。我曾经在实验里遇到过这种情况R2和R4都向OSPF注入了去往3.3.3.3/32的外部路由默认Cost都是10OSPF做了负载分担。但从R1的角度看走R2只要经过一个千兆接口走R4要经过一个百兆接口加一个千兆接口两条路径的质量完全不对等。流量的负载分担比例和实际带宽严重不匹配。解决办法有两个思路。一是调整Cost值让其中一条路径更优形成主备关系二是用overhead命令调整接口Cost改变OSPF内部路径的计算结果从而影响外部路由的选路结果。我比较推荐先调Cost值因为影响范围可控只影响这条重发布的外部路由不会动整个OSPF域的内部选路。5.3 数据包TTL超时怀疑出现环路环路是重发布实验里最吓人的问题因为它不像路由表缺失那么明显路由表看起来什么都有但数据包就是到不了目的地。一个典型的环路现象是tracert的时候每一跳都显示TTL expired来来回回就那几台设备的IP在重复出现。比如R1上tracert 3.3.3.3结果显示第一个节点192.168.12.2R2第二个节点192.168.23.3R3第三个节点又跳回192.168.12.2第四个节点又是192.168.23.3无限循环。前面已经详细讲过了该怎么用Tag标记来预防。这里说一个排查的小技巧当怀疑环路时在边界设备上同时看路由表的路由来源和下一跳把协议来源和下一跳所在网段对应起来画一张图。接下来就会很清晰地发现数据包经过了哪些设备在哪一跳出现了自己学自己发出去的路由的情况。这个操作只需要用到display ip routing-table和display ip routing-table 目的网段 verbose不依赖任何第三方工具。5.4 重发布实验的运维心得与实用建议最后再说几个做实验和运维时的通用心得。第一重发布相关的配置要分步做每一步都验证不要一把梭。我见过太多人把配置一次性粘贴进去出了错根本不知道是哪条命令导致的。即使你对配置很有把握我也建议先做单方向确认无异常后再加上反方向。第二所有涉及度量值、Tag值的设计在动手前先写在草稿纸上。比如规定好OSPF外部路由Cost统一为10RIP种子跳数统一为3从OSPF流向RIP的路由打Tag 100从RIP流向OSPF的路由打Tag 200。有了这份规范不同人配置出来的结果才是一致的排错时才不用去猜某一个数值是故意设置的还是默认值。第三做实验时养成经常保存配置和截图的好习惯。eNSP模拟器里的设备重启后配置会丢失每次实验前记得save配置。关键的验证命令输出也建议截图保存方便复盘时对比不同阶段的路由表现。第四不要盲目迷信模拟器的结果。eNSP模拟器对协议的模拟虽然很接近真实设备但部分细节比如RIP的定时器、OSPF的LSA泛洪时序和真实设备存在差异。在模拟器上验证通过的方案到了真实网络上一定要先小范围试点观察一段时间再全面铺开。这套实验做下来我对重发布的理解比翻十遍书都深刻。有些东西确实是必须亲手踩过坑才能真正掌握的路由回灌这件事我就是在Tracert输出里看到自己的数据包来来回回转了好几圈才彻底明白它的危害。如果你也在做类似的实验希望这篇记录能帮你节省一些排查的时间。
返回列表