首页 / 资讯中心 / 文章详情

双点双向重发布防环实战:OSPF与RIP路由回灌及次优路径排查

双点双向重发布防环实战:OSPF与RIP路由回灌及次优路径排查 ★ FEATURED ARTICLE
最近在模拟器上折腾重发布实验结果踩了不少坑。这个实验表面上就是几条 redistribute 命令的事但真正跑起来路由回灌、次优路径、环路隐患全冒出来了。整理这篇笔记的时候我把整个排错过程又走了一遍从拓扑设计、基础配置、双向重发布配置到用路由标记和路由策略做防环一步都没落下。如果你正在学路由重发布或者准备网络认证这篇文章应该能让你少走几个弯路。1. 重发布到底在解决什么问题1.1 为什么不同路由协议之间不能直接互通现实中的网络很少只跑一种路由协议。公司并购之后两边原有网络可能一套跑 OSPF一套跑 RIP新老部门之间要互通就必须在边界设备上把一套协议的路由“翻译”成另一套协议能理解的形式。这个翻译动作就是路由重发布也叫路由引入、路由再分布。但“翻译”不是简单地抄一遍路由表就行。OSPF 关注的是开销CostRIP 关注的是跳数静态路由根本没有协议内的度量概念。两边路由器收到对方的路由后要知道这条路由的“可信程度”是多少、路径开销是多少、能不能参与防环计算。所以重发布必须要处理种子度量、路由优先级、路由回灌这些问题。很多初学者以为配两条命令就完事其实真正的坑都在后面。1.2 重发布的典型形态重发布按方向和点位可以分成几类。单点单向最简单就是一台边界路由器把一个协议的路由引入另一个协议适合没有冗余需求的边缘场景。单点双向是同一台边界路由器做两个方向的重发布配置也不复杂。但一旦出现两个边界路由器同时做双向重发布也就是常说的双点双向问题就开始变复杂了。双点双向在生产环境用得很多因为单点故障会直接导致两个域之间断连双点能提供冗余。但两个 ASBR 同时把路由倒来倒去很容易出现一个路由域把从另一个域学来的外部路由又原封不动地传回去这就是路由回灌。回灌之后紧接着就是路由环路、次优路径、路由震荡。所以学习双点双向重发布不只是学会几条命令更重要的是理解背后的防环原理。1.3 这个实验的目标我设计的实验拓扑包含两个隔离路由域左侧是 OSPF 域右侧是 RIP 域中间由两台边界路由器 R2、R3 同时连接形成双点双向重发布结构。实验目标有三个让两个域内的业务网段能够互相访问。观察双点双向重发布配置完成后路由表里出现的异常路径。通过路由标记配合路由策略做防环让路由表恢复到合理状态。整个实验可以在主流网络模拟器上复现不需要真实硬件但配置和排错思路和真实设备基本一致。2. 实验拓扑准备一台模拟器上的双点双向环境2.1 拓扑结构与地址规划实验一共需要四台路由器命名 R1、R2、R3、R4。R1 和 R4 分别代表两个业务网段的网关R2 和 R3 是双边界路由器。拓扑是一个菱形结构R1 同时连着 R2 和 R3R4 也同时连着 R2 和 R3R2 和 R3 之间还有一条互联链路。文字版拓扑大概长这样R2 R1 ---- ---- R4 R3R1 的两个接口分别接 R2、R3属于 OSPF 域R4 的两个接口分别接 R2、R3属于 RIP 域R2 和 R3 之间的互联链路也划到 OSPF 域作为 OSPF 区域内的一条内部链路这样 R2 和 R3 之间在 OSPF 下也有冗余路径。接口和地址规划如下表设备接口IP 地址所属协议域R1Loopback010.1.1.1/32OSPF 业务网段R1G0/0 到 R210.12.1.1/24OSPF 区域 0R1G0/1 到 R310.13.1.1/24OSPF 区域 0R2G0/0 到 R110.12.1.2/24OSPF 区域 0R2G0/2 到 R310.23.1.2/24OSPF 区域 0R2G0/1 到 R410.24.1.2/24RIPR3G0/0 到 R110.13.1.3/24OSPF 区域 0R3G0/2 到 R210.23.1.3/24OSPF 区域 0R3G0/1 到 R410.34.1.3/24RIPR4Loopback010.4.4.4/32RIP 业务网段R4G0/0 到 R210.24.1.4/24RIPR4G0/1 到 R310.34.1.4/24RIP我故意让 R1 的 Loopback0 网段只存在于 OSPF 域内R4 的 Loopback0 网段只存在于 RIP 域内。这样后续重发布时两个网段都只会依靠边界路由器进入对方域观察路由表的变化最清晰。2.2 为什么偏要用双点双向往回灌方向做有人会问直接搭一条串行拓扑比如 R1—R2—R3—R4R2 做重发布不就行了吗那样确实配置简单但只能展示“翻译路由”的基础动作看不到回灌和次优路径。双点双向重发布才是生产网络里最需要小心的场景因为两台边界路由器各自都会把对方域的路由再次引入如果没有任何保护机制路由表里会出现一堆“看起来通、实际在绕路”的路径。另外菱形拓扑里 R2 和 R3 之间还有一条 OSPF 链路这会让 OSPF 域内部的路由选择多一种可能配合外部路由的种子度量能复现出更真实的次优路径。所以选这个拓扑不是图复杂而是它能把双点重发布的坑一次全部暴露出来。3. 基础配置先让两个路由域各自跑通3.1 接口 IP 与连通性准备不管做什么实验接口地址是第一件事。按照上表给四台设备配置接口地址以 R1 为例interface GigabitEthernet0/0 ip address 10.12.1.1 255.255.255.0 no shutdown ! interface GigabitEthernet0/1 ip address 10.13.1.1 255.255.255.0 no shutdown ! interface Loopback0 ip address 10.1.1.1 255.255.255.255R2、R3、R4 的接口地址配置逻辑完全一致只是 IP 不同。这里要提醒一个很容易忽略的点Loopback 接口建议用 32 位掩码这样业务网段在重发布后仍然是一个主机路由不会因为掩码聚合造成预期之外的丢包。我用 10.1.1.1/32 和 10.4.4.4/32 做业务网段整个实验的路由表看起来非常干净。配置完后先做基础连通性测试。此时 R1 应该能 ping 通 R2、R3 的互联地址R4 也应该能 ping 通 R2、R3 对侧的接口 IP但 R1 和 R4 之间一定是不通的因为两个域还没有任何重发布关系。3.2 OSPF 区域 0 配置在 R1、R2、R3 上启用 OSPF进程号可以任意但三台设备必须一致这里都用进程 1。所有属于 OSPF 域的接口都通过 network 命令宣告进区域 0。以 R2 为例router ospf 1 network 10.12.1.0 0.0.0.255 area 0 network 10.23.1.0 0.0.0.255 area 0R1 需要宣告 10.12.1.0 和 10.13.1.0 两个网段再加上 Loopback0 的 10.1.1.1/32R3 和 R2 类似。为什么要写成 32 位主机路由而不是 24 位因为业务网段通常希望以精确路由对外发布宣告成 32 位可以避免设备上其他子网被意外携带。这里不用纠结 Loopback 是否要配成网络类型 point-to-point模拟器默认配置也能跑通。配置完成后在 R1 上查看 OSPF 邻居R2 和 R3 应该都是 Full 状态R1 的 OSPF 路由表里能看到去往 R2、R3 互联网段的路由。此时 R1 和 R3 之间不仅有直连还能通过 R2 中转OSPF 会计算出两条路径。3.3 RIP 配置在 R2、R3、R4 上启用 RIP协议版本用 RIPv2。R4 的 Loopback0 是业务网段必须宣告进 RIP。以 R3 为例router rip version 2 network 10.34.1.0 network 10.23.1.0等等这里有一个实验设计的细节R2 和 R3 之间的互联链路 10.23.1.0 到底要不要宣告进 RIP在之前的设计里我已经把它划入 OSPF 域那 RIP 里就不能再宣告这条链路否则 R3 会把 10.23.1.0 同时学进两个协议可能产生非预期的路由回灌。所以 R2、R3 上 RIP 只宣告与 R4 相连的接口网段R4 上宣告与 R2、R3 相连的两个接口网段以及 Loopback0。正确的 RIP 宣告router rip version 2 network 10.24.1.0R3 同理router rip version 2 network 10.34.1.0R4 上router rip version 2 network 10.24.1.0 network 10.34.1.0 network 10.0.0.0其中 10.0.0.0 是为了让 Loopback0 的 10.4.4.4/32 能够被宣告进 RIP。RIP 的 network 命令使用的是有类网络边界10.4.4.4 属于 10.0.0.0/8所以这样宣告。这个坑很常见如果不宣告主类网络Loopback 网段不会出现在 RIP 路由表中。配置完后在 R4 上查看 RIP 路由表应该能看到 10.24.1.0、10.34.1.0 这两个直连网段但看不到 10.1.1.1/32因为 R2、R3 还没有把 OSPF 路由重发布进来。3.4 重发布前的状态确认这一步很重要。在配置重发布之前先确认两个协议域各自独立R1 的 OSPF 路由表里有 10.1.1.1/32、10.12.1.0/24、10.13.1.0/24、10.23.1.0/24。R4 的 RIP 路由表里有 10.24.1.0/24、10.34.1.0/24、10.4.4.4/32。在 R1 上 ping 10.4.4.4 失败在 R4 上 ping 10.1.1.1 失败。如果此时意外能通说明前面的配置有问题比如把不该宣告的链路宣告进了 RIP或者 R2、R3 上提前写了重发布命令。我习惯每完成一个阶段就保存配置快照这样排错时能快速回滚。4. 配置双向重发布见证次优路径的产生4.1 重发布命令与种子度量设置现在开始配置重发布。R2 和 R3 都需要做两个方向RIP 到 OSPF以及 OSPF 到 RIP。配置的时候重点是要显式指定种子度量否则很多设备会把外部路由的默认度量当作无穷大导致路由不对外通告。以 R2 为例RIP 到 OSPF 的重发布我习惯在 OSPF 进程下先配置默认开销再执行重发布router ospf 1 default-metric 10 redistribute rip subnetssubnets参数非常关键尤其是 OSPF 重发布 RIP 路由时如果不带这个参数只会重发布有类主网路由像 /24、/32 这样的子网路由就会缺失。default-metric 10是把所有引入的 RIP 路由生成 OSPF Type 5 外部路由时使用 Cost 10。OSPF 到 RIP 的重发布在 RIP 进程下配置router rip version 2 default-metric 3 redistribute ospf 1 metric 3RIP 的度量单位是跳数。重发布进来的 OSPF 路由不可能真是 0 跳所以必须手动设置一个合理的跳数。这里设成 3表示从边界路由器到达 OSPF 域内目标大概需要 3 跳。如果设置成 1就会让 RIP 域内的路由器误以为目标离边界只有一跳路径选择会失真如果设置成 16则代表不可达路由直接不生效。R3 的配置与 R2 完全对称同样把 default-metric 和 redistribute 都写进去。配置完成后R1 和 R4 的路由表应该能互相看到对方业务网段。但仔细看的时候问题就来了。4.2 R1 和 R4 路由表里的异常现象配置完后我先看 R1 的路由表重点找 10.4.4.4/32O E2 10.4.4.4/32 [110/10] via 10.12.1.2 O E2 10.4.4.4/32 [110/10] via 10.13.1.3R1 同时收到了两条等值的 OSPF 外部路由一条下一跳是 R2一条下一跳是 R3。表面上这是双点冗余的好现象但结合 R2、R3 的内部路径去看并不是两条路径都真实可靠。比如 R3 其实也通过 OSPF 从 R2 学到了 10.4.4.4 的外部路由下一跳指向 R2然后又把自己从 RIP 学到的版本也引入了 OSPF。这样一来R1 看到的“经由 R3”的路径真实数据流可能是 R1 → R3 → R2 → R4此时 R3 只是一个中转并没有起到真正的边界作用。更明显的问题在 R4 的 RIP 路由表里。R4 一开始只有 RIP 自己学到的直连网段重发布后能看到 10.1.1.1/32R 10.1.1.1/32 [120/3] via 10.24.1.2 R 10.1.1.1/32 [120/4] via 10.34.1.3这两条路径跳数不一样R4 会优选跳数小的也就是经过 R2 的那条。这看起来还算正常。但如果 R3 在 OSPF 中学习到了 R4 网段的外部路由并且把这个外部路由再次重发布回 RIPR4 就会收到一条关于 10.4.4.4 自身的 RIP 路由这就是典型的回灌。回灌一旦发生RIP 域内的路由器可能把去往某个目标的流量发给边界路由器而边界路由器又通过 RIP 把流量发回内网慢慢形成环路。我在实验里没有做任何防环策略时确实在 R2 的路由表里看到了 10.4.4.4/32 的两条来源一条是从 RIP 直连学到的管理距离 120另一条是从 OSPF 外部学到下一跳是 R3管理距离 110。因为 OSPF 的管理距离更小R2 反而相信了“经过 R3”这条外部路由放弃了自己直连 RIP 学到的正经路径。这就是双点双向重发布带来的次优路径问题也是很多真实网络里诡异延迟的根源。5. 为什么会回灌路由标记与防环机制拆解5.1 回灌的完整过程我用一个时序来解释回灌。以 R4 的 10.4.4.4/32 网段为例R2 从 RIP 学到 10.4.4.4/32。R2 把这条 RIP 路由重发布进 OSPF成为一条 OSPF Type 5 外部路由。R3 在 OSPF 域里也收到了这条外部路由。R3 本身也运行 RIP而 R3 把 OSPF 路由重发布进 RIP 时没有排除外部路由于是这条 10.4.4.4/32 又被重新灌回 RIP 域。R2 在 RIP 域再次收到 R3 发来的 10.4.4.4/32因为这个版本的路径经过了 OSPF 域绕了一圈跳数变大但 R2 不太容易判断这条路由已经“绕过头了”。R2 又把这条 RIP 路由重发布进 OSPF形成新的外部路由。整个过程就像两个人互相转述同一句话每转述一次就多一层的失真网络里的路由震荡也会越来越明显。在 RIP 的 16 跳限制下回灌最终可能被跳数上限掐断但收敛时间会非常慢而且 OSPF 的外部 LSA 也会反复泛洪消耗设备 CPU。5.2 为什么管理距离解决不了回灌有人可能会问R2 同时从 RIP 和 OSPF 学到 10.4.4.4管理距离上 OSPF 是 110RIP 是 120R2 选择 OSPF 外部路由这没问题啊但问题是 R2 选择 OSPF 外部路由之后又会把这个 OSPF 路由重发布回 RIP等于把自己的选择结果又变成了 RIP 域里的新路由继续广播。管理距离只能解决同一台路由器上“优先信谁”的问题解决不了路由在不同协议之间反复跨界传播的问题。所以双点双向重发布的防环思路不是调整管理距离而是要在源头识别“这条路由是不是曾经被我所在的域发布过”如果是就拒绝它再次进入当前域。5.3 路由标记给路由盖一个戳OSPF 外部路由支持携带一个 Route Tag也就是路由标记。这个标记不参与路径开销计算只用于策略匹配。我们可以给“从 RIP 域重发布进 OSPF 的外部路由”统一打上一个标记比如 200然后在从 OSPF 重发布到 RIP 的时候把所有带这个标记的外部路由拒掉。这样RIP 域自己的网段即使被 OSPF 域绕了一圈带回来也会因为带标记被挡在门外不会再次进入 RIP 域。有人会问R1 的 10.1.1.1/32 是 OSPF 内部路由它没有标记 200所以可以正常重发布到 RIP不受影响。这正是这个方案的巧妙之处只拦来自 RIP 域的外部路由不拦 OSPF 域内部路由。路由标记在 RIP 侧不一定能完整传递所以我的策略是放在 OSPF 侧做标记在边界做匹配过滤不依赖 RIP 传递标记。这个细节在实际配置中很容易踩坑下面我会把完整配置写出来。6. 用路由策略做精准过滤防环配置与验证6.1 定义路由策略并应用到重发布在 R2 和 R3 上我分别创建两个路由策略一个用于 RIP 到 OSPF一个用于 OSPF 到 RIP。先看 RIP 到 OSPF 方向的策略。这个方向要给外部路由打标记标记值为 200route-policy RIP_TO_OSPF permit node 10 apply tag 200再看 OSPF 到 RIP 方向的策略。这个方向要拒绝带标记 200 的路由然后放行其他路由route-policy OSPF_TO_RIP deny node 10 if-match tag 200 ! route-policy OSPF_TO_RIP permit node 20策略配置完成后把策略应用进去。R2 上的配置变化如下router ospf 1 default-metric 10 redistribute rip subnets route-policy RIP_TO_OSPF ! router rip version 2 default-metric 3 redistribute ospf 1 metric 3 route-policy OSPF_TO_RIPR3 上做完全一样的操作。重点提醒路由策略的名字不要搞混一个方向一个策略否则很可能出现“私有网段全部丢失”的情况。我在第一次实验里就把两个策略共用了一个名字结果 OSPF 到 RIP 时把所有外部路由都放行了等于没配防环。6.2 策略匹配的原理为什么 tag 200 能拦下回灌路由R2 把 RIP 路由重发布进 OSPF 时给这些路由打了 tag 200。R3 从 OSPF 收到这些带 tag 的 Type 5 外部路由后在重发布到 RIP 之前会先检查策略如果匹配 tag 200就拒绝。所以从 RIP 域发源的 10.4.4.4/32 不会再次进入 RIP 域。R1 的 10.1.1.1/32 不是从 RIP 域引入的没有 tag 200因此可以正常从 OSPF 重发布到 RIP。需要注意一点R3 自己也会把 RIP 路由重发布进 OSPF并打上 tag 200所以 R3 在 OSPF 到 RIP 方向上遇到带 tag 200 的路由时也会拒绝自己刚刚从 RIP 引入的网段回到 RIP。这可能听起来有点奇怪但其实是正确行为。因为 R3 本身就是 RIP 域的边界路由器R4 网段已经在 RIP 域内不需要再通过 OSPF 绕一圈回来。R3 需要重发布给 RIP 域的是 OSPF 域内的 R1 网段而不是那些“出去又回来”的路由。6.3 防环配置后的路由表对比配置完成后我重新查看了 R2、R3、R1、R4 的路由表这里挑几个关键观察点。R2 的 OSPF 路由表里10.4.4.4/32 仍然只有一条下一跳指向自己的 RIP 域接口OSPF 外部路由条目明显变少不会再出现“从 R3 学回自己引出去的路由”这种怪异条目。R4 的 RIP 路由表里10.4.4.4/32 不会再出现R1 的 10.1.1.1/32 仍能从 R2 和 R3 两侧学到跳数都是 3形成正常的双冗余路径。我再测了一遍 R4 到 10.1.1.1 的路径R4 选择经过 R2 到达 R1。在 R4 上执行路由跟踪下一跳走 10.24.1.2而不是 10.34.1.3路径清晰没有再绕到 OSPF 域里打转。6.4 一个容易忽略的细节OSPF 内部路由的保护防环策略只拦了 tag 200 的外部路由但还有一种情况不能漏如果 OSPF 域本身还有其他的外部路由比如从另一个 ASBR 引入的第三方静态路由这些路由没有一个统一的 tag那 OSPF 到 RIP 重发布时就会被策略的 permit node 20 放行。在实际生产中这其实需要根据业务决定。如果希望 RIP 域只看到 OSPF 内部路由策略里可以直接if-match route-type external并拒绝而不是单纯按 tag 过滤。我在实验里用 tag 200 只是为了演示路由标记的作用。真实场景中建议给每一类外部路由设计不同的 tag同时在边界设备上统一维护一张 tag 对照表。比如tag含义过滤方向200从 RIP 域引入的外部路由OSPF - RIP 时拒绝300从静态路由引入的外部路由视业务需求决定0未标记通常为内部路由放行这张表可以帮助你在后续维护中快速判断一条外部路由来自哪里。7. 常见问题与排查心得7.1 重发布后对方域看不到路由最常见的两个原因一是没有设置种子度量尤其 RIP 到 OSPF 以及 OSPF 到 RIP 的默认度量在部分设备上会直接导致路由不可达二是 OSPF 重发布 RIP 时漏了subnets参数导致子网路由没有对外通告。建议配置重发布时先看本设备路由表里那条待发布路由是否在正确协议进程里再看重发布后的外部路由是否出现。7.2 路由表里出现重复的外部路由双点双向重发布下外部路由重复是正常的。但如果你发现某个网段在 OSPF 里出现了来自同一台 ASBR 的多条相同前缀路由或者一台路由器反复更新某条路由大概率是回灌。回灌的根源不在单台设备而在重发布策略没有过滤从本域出去的流量。可以先在两台边界路由器上同时打开协议调试观察一段时间内 LSA 或 RIP 更新是否周期性震荡。7.3 策略明明配置了为什么还是回灌排查时先确认策略应用到正确方向。很多设备上重发布命令和策略的组合是redistribute ospf 1 route-policy X但不同协议的进程下语法有差异容易把redistribute rip subnets route-policy X写错位置。另外策略节点的顺序很重要。route-policy是按节点从上到下匹配的如果前面有一个permit节点把带 tag 200 的路由也放了后面再写deny根本不会执行。我在实验里就犯过这个低级错误把 deny 节点放在 permit 节点后面等于白配。7.4 不要轻易修改路由协议的管理距离我们在排查次优路径时可能会想把 R2 的 OSPF 外部路由管理距离调高让 R2 更信任 RIP 学到的路由不就不用绕路了吗这种思路看似合理但管理距离是全局性的改完会影响所有同类路由的信任关系容易引发更隐蔽的路由环路。双点双向重发布问题的正统解法是做一个清晰的防环策略而不是靠调管理距离去碰运气。7.5 我个人的实操习惯这个双点双向重发布实验我前前后后做了三遍才完全跑顺。第一遍只是在模拟器里把命令敲上看到路由通了就以为完成了结果没过多久路由表开始震荡才发现回灌一直存在。第二遍加了路由策略但策略方向写反RIP 域直接看不到 OSPF 域的路由。第三遍才把拓扑、策略、验证全部做完。如果你自己搭环境我建议先把实验步骤按阶段拆开基础配置跑通后再做重发布做完重发布立刻抓路由表最后再做防环策略。每一步都留一个验证点出现问题时能快速定位在哪一步。这个经验不仅适用重发布实验任何涉及多协议路由的实验都值得这么做。最后再分享一个小技巧在模拟器里做排错时不要只盯着路由表多使用协议调试命令观察路由更新。当你能看到一条路由在 OSPF 和 RIP 之间反复横跳时对“路由回灌”的理解会比背十遍概念都深刻。这个实验最大的价值不是记住几条配置命令而是真正建立起“路由是有生命的、会流动会循环”的直觉这种直觉在以后处理真实网络故障时非常有用。
阅读完成 · 觉得有帮助?
咨询建站