技术背景
如下图所示的网络拓扑中:
- 对于R2而言,要去往10.9.9.0/24,通过R1及R3都可达。
- R2配置了如下静态路由:
[R2]ip route-static 10.9.9.0 24 10.1.12.1
[R2]ip route-static 10.9.9.0 24 10.1.23.3
- 这两条静态路由的目的网络地址及网络掩码都相同,而且分别采用不同的下一跳地址,在这种前提下,R2会比较这两条路由的优先级,
- 由于这两条路由都是以手工的方式配置的静态路由,因此优先级缺省都是60,此外两条路由的度量值也都为0,因此这两条到达10.9.9.0/24的路由将被同时加载到R2的路由表:
路由的等价负载分担
- 上述现象被称为路由的等价负载分担。
- 实际上,R2转发到达10.9.9.0/24的流量时,有可能会同时采用R1及R3作为下一跳。
- 基于负载分担,路由器能够在多条路径上进行流量的分担,从而避免某条链路带宽消耗过大而其他链路空载的情况,提高了链路的利用率。
引入问题
在某些特殊情况下,我们可能会希望R2发往10.9.9.0/24的流量始终走单边(如R1),当R1宕机或R1-R2之间的互联链路发生故障时,R2能够自动将流量切换到R3,这该如何实现上述需求呢?
解决方法
- 通过部署浮动静态路由(Floating Static Route)可以实现上述需求。
- ip route-static命令(HW)可以为设备添加静态路由,在缺省情况下,这条命令所添加的静态路由的优先级为60,但是该值实际上是可以自定义的,通过配置两条优先级不同的静态路由,利用路由优选机制,可以实现上述需求。
- R2的配置修改为:
[R2]ip route-static 10.9.9.0 24 10.1.12.1 #去往R1的静态路由的优先级为缺省值60
[R2]ip route-static 10.9.9.0 24 10.1.23.3 preference 80 #去往R3的静态路由的优先级被设置为80
-
在上述配置中,R2添加了两条静态路由,它们的目的网络地址及掩码长度都是10.9.9.0/24,下一跳分别为10.1.12.1及10.1.23.3,
-
去往下一跳为R1的静态路由并没有指定优先级,因此该条路由的优先级为缺省的60,另一条去往下一跳为R2静态路由则使用preference关键字(HW)指定了优先级80。
-
这两条路由中只有优先级值较小的路由将最终被加载到路由表并作为数据转发的依据,另一条优先级为80的路由则“潜藏”起来,并不出现在路由表中:
-
基于上述配置,当R2转发到达10.9.9.0/24的报文时,由于路由表中只存在一条匹配的路由,因此报文将始终被转发给R1。
-
但是当R1宕机或者R1-R2之间的链路发生故障时,ip route-static 10.9.9.0 24 10.1.12.1(HW)这条静态路由失效,而ip route-static 10.9.9.0 24 10.1.23.3 preference 80(HW)也就浮现出来了,浮动静态路由因此得名。
-
此时R2的路由表如下:
-
那么当R2转发到达10.9.9.0/24的报文时,报文被转发给R3,如下图所示。
总结
- 浮动静态路由是一种十分不错的路由备份机制,在某种程度上提高了静态路由的灵活度,在实际的网络部署中有着广泛应用。
- 一个典型的例子就是在拥有多出口的网络中部署出口路由,比如一个园区网的出口路由器连接着A, B两个运营商提供的出口链路,我们希望内网外出的流量默认走A运营商提供的出口,当该出口发生故障时,则自动切换到B运营商提供的出口。
- 要实现这个需求,可以在出口路由器上配置两条默认路由,并将指向B运营商的那条默认路由的优先级值调得稍微大一些。