目录
静态路由
静态路由的基本概念
静态路由配置须知
默认路由
浮动静态路由
等价负载分担
浮动静态路由
静态路由(Static Route)是指网络管理员通过手工配置的方式为路由器创建的路由,通过这种方式,网络管理员可以非常简单的,便捷的让路由器获知到达目的网络的路由。
路由器能够自动发现直连路由并将其加载到路由表中,而对于到达非直连网络的路由,路由器就必须通过其他途径来获取,静态路由是一种最直接,最简单的方法。所谓静态路由,也就是网络管理员使用手工配置的方式为路由器添加的路由,通俗的说法是,网络管理员通过手工配置的方式告诉路由器:”你要到达目的地X,需要把数据包从接口Y扔出去给下一跳Z“,在网络中部署静态路由后,网络设备之间无需交互头部的协议报文(不像动态路由协议)。
如图网络中,我们首先为两台PC机设置网卡IP地址以及默认网关地址,然后完成R1及R2两台路由器的接口IP地址配置,,在初始情况下,每台路由器都自动学习直连接口所在网段的路由,并且将直连路由加载到路由表中。通过命令
display ip routing-table #查看路由器的路由表情况
R1,R2的路由表中此时仅有直连路由。现在R1能够与R2直接通信,因为两者直接相连,而当PC1要发送数据给PC2时,它通过将目的IP地址(PC2的IP地 址为192.168.2.1)与本地网卡的IP地址及网络掩码进行运算,发现该目的IP地址是本 地网段之外的一个地址,因此它意识到需要将发往PC2的报文先发送给自己的默认网关, 由于PC1的默认网关被设置为R1的GE0/0/1接口的IP地址,于是PC1将数据包发送给 R1,当R1收到这个数据包后,它在自己的路由表中查询报文的目的IP地址,结果发现 并没有能够匹配该地址的路由条目,因此数据包被丢弃。显然,到目前为止PC1是无法与 PC2互访的。那么如何才能够使得R1正常地转发这个数据包呢?当然需要R1的路由表 中拥有相关的条目来做指示才行。最简单的一种方式是使用手工配置的方式为R1添加到 达192.168.2.0/24的路由条目,也就是为R1创建一静态路由。静态路由的配置非常简单:
[R1] ip route-static 192.168.2.0 24 GigabitEthemet 0/0/0 192.168.12.2
在设备的系统视图下,使用ip route-static命令即可为其创建静态路由。上面的命令 将为R1的路由表添加一条静态路由,这条静态路由的目的网络地址及掩码长度为 192.168.2.0/24,出接口为GE0/0/0且下一跳IP地址是192.168.12.2。这条命令等同于ip route-static 192.168.2.0 255.255.255.0 GigabitEthemet 0/0/0 192.168.12.2。于是 R1 的路 由表变成了:
从以上输出可以看出,R1的路由表里出现了一个新增的条目——192.168.2.0/24,这 样一来,当R1收到PC1发往192.168.2.1的数据包时,它发现路由表中有一个静态路由 条目匹配该数据包的目的IP地址,于是它将该数据包从GE0/0/0接口送出并转发给下一 跳192.168.12.2o当这个数据包到达R2后,后者也在其路由表中查询目的IP地址 192.168.2.1,它发现该地址在本地路由表中有路由条目相匹配,而且该路由为直连路由, 因此R2将数据包根据路由条目的指示从GE0/0/1接口转发出去,最终数据包到达PC2。
R1增加了这条静态路由后,PC1就能够与PC2正常地交互数据了吗? PC1就能够 ping通PC2 了吗?答案是否定的,为什么呢?这是因为两个设备要实现正常的双向通信, 必须保证双向路径可达。到目前为止,从PC1发往PC2的数据包确实是能够到达PC2 的,但是从PC2回程的数据包却无法回到PC1。回程数据包的目的IP地址是192.168.1.1, 这个数据包首先被PC2发往自己的默认网关,也就是R2,后者查询路由表,却没有发 现匹配该目的地址的路由,于是只能将数据包丢弃。因此,为了使得PC1与PC2之间能 够相互通信,还需要再做一步操作,就是在R2上也增加一条路由,路由的目的网络地 址及掩码长度是192.168.1.0/24,下一跳IP地址当然就是R1的接口地址——192.168.12.1 了。R2的配置如下:
[R2] ip route-static 192.168.1.0 24 192.168.12.1
值得注意的是,在上述配置中,我们并没有指定路由的出接口,在本场景中是不会 有问题的,R2会根据下一跳IP地址192.168.12.1进行递归运算,也就是在路由表中查 询到达192.168.12.1的路由,从而找到这个IP地址对应的出接口,并最终得到 192.168.1.0/24 路由的出接口——GE0/0/0。
这样一来,PC1 及 PC2 互相通信就没有问题了。
如果网络的规模较小的话,全网部署静态路由似乎没有什么问题,但是在一个大型网络中,如果完全使用静态路由来实现数据互通,工作量太大了,毕竟大型网络中包含的网段数量非常多,这意味着如果要确保网络中每台设备都能够到达全网的各个网段,网络管理员就不得不配置大量的静态路由,另外一个重要的问题,静态路由无法根据网络拓扑的变更做出动态调整,因此,在大规模网络中往往采用动态路由协议或者静态路由与动态路由协议搭配的方式来打通路由。
大家都知道,使用ip route-static命令可以为设备添加静态路由,在该命令中需要指定静态路由的目的网络地址,网络掩码(或者掩码长度),下一跳IP地址及出接口等等信息。在为设备创建静态路由时,关于下一跳IP地址及出接口的配置有几个细节需要注意的。
针对不同的出接口类型,静态路由的配置要求时不同的。
(1)如果出接口为BMA(Broadcast Multiple Access,广播型多路访问)类型,则静态路由需要指定下一跳IP地址。
以太网接口时一种非常典型的BMA类型的接口,BMA接口接入一个广播网络,该网络中往往还同时接入了多台设备,因此如果仅仅为静态路由指定出接口,那么路由器将无法判断究竟该将数据包发往哪一个下一跳设备。在图中,R1及R2通过GE0/0/0接口连接到一台以太网交换机上,现在我们要为R1配置一条到达2.2.2.0/24的静态路由,由于R1 的出接口GE0/0/0 是一个BMA接口,因此根据要求必须在该静态路由中指定下一跳IP地址,所以可以如下配置:
[Rl]ip route-static 2.2.2.0 255.255.255.0 GigabitEthemet0/0/0 10.1.12.2
或者如下配置:
[Rl]ip route-static 2.2.2.0 255.255.255.0 10.1.12.2
以上两种方式都指定了具体的下一跳IP 地址,因此都是可行的。而如果将静态路由改写为:
[Rl]ip route-static 2.2.2.0 255.255.255.0 GigabitEthemet0/0/0
那么R1可能就无法到达2.2.2.0/24 了,正如上面所说,它并不知道要将到达该网段 的报文转发给哪一个下一跳设备。这里其实存在一个有趣的细节,在完成上面这条静态 路由的配置后,R1会认为2.2.2.0/24这个网段从自己的GE0/0/0接口出去即可到达,换 句话说,R1认为该目标网段是GE0/0/0接口的直连网段,加上该接口是一个BMA接口, 因此,当R1转发到达2.2.2.0/24的数据包时(例如到达2.2.2.2),会从该接口广播ARP Request报文,用于查询处于本地直连网段中的(至少R1是这么认为的)2.2.2.2的MAC 地址。R2会收到这个ARP Request,缺省情况下它是不会回应的,毕竟R2的GE0/0/0 接口的IP地址不是2.2.2.2。所以,此时R1无法将目的IP地址为2.2.2.2的数据包转发出去(因为它无法获得关于2.2.2.2的MAC地址)。这也是为什么要求当静态路由的出 接口为BMA接口时必须为该路由指定下一跳IP地址的原因。当然在这个场景中可以通过一个小伎俩来解决R1配置了上述静态路由后到2.2.2.0/24不可达的问题,那就是在 R2的GE0/0/0接口上激活ARP代理(ARP・Proxy)功能:
[R2]interface GigabitEthemet 0/0/0
[R2-GigabitEthemet0/0/0]arp-proxy enable
R2完成上述配置后,它的GE0/0/0接口即激活了 ARP代理功能,当该接口再收到 R1发送的、用于请求2.2.2.2的ARP Request时,由于R2自己直连着2.2.2.0/24网段, 因此它将回应这个ARP Request,并且以自己的GE0/0/0接口的MAC地址(替代2.2.2.2 对应的真实MAC地址)进行回应,如此一来,R1会在其ARP表中创建一个表项,将 IP地址2.2.2.2与R2的GE0/0/0接口的MAC地址进行绑定。此时,当R1转发到达2.2.2.2 的数据时,它将数据帧的目的MAC地址设置为R2的GE0/0/0接口 MAC,然后发送出去, R2收到这个数据帧后,将数据帧解除封装,然后解析数据包IP头部中的目的IP地址并进 行路由查询,发现目的IP地址就在本地直连网段中,于是重新封装数据帧,然后将其转 发到目的地。
从上述过程可以看出,实际上ARP代理行为颇有点“ARP欺骗”的味道。
虽然上述方法可以解决R1的静态路由存在的问题,但依然并非一个推荐的方法。 因此当出接口为BMA接口时,在配置静态路由时需指定下一跳IP地址。
(2)如果出接口为P2P(Point-to-Point,点对点)类型,则静态路由仅需指定出接口。
P2P类型的接口仅与一台设备对接,在图中1-8中,R1安装了一个广域网接口卡,并通过该接口卡上的广域网接口Serial 1/0/0与R4直连,链路两端的接口均采用PPP 封装,因此R1 的Serial 1/0/0是一个典型的P2P接口,此时要为R1 配置一条静态路由,使其能够到达4.4.4.0/24,那么R1 可以采用如下的配置:
[Rl]ip route-static 4.4.4.0 24 Serial 1/0/0
也就是说,R1仅需在该静态路由中指定出接口即可(当然,也可以指定出接口及下一跳IP地址)
(3) 如果出接口为NBMA(Non-Broadcast Multiple Access,非广播多路访问)类型,则静态路由需指定下一跳IP地址。
釆用帧中继(Frame Relay)封装的接口是一种典型的NBMA类型接口,这种接口 同样能够连接一台或多台设备,但是并不支持广播。拥有帧中继接口的路由器维护着一 张帧中继映射表,用于存储帧中继链路对端设备的IP地址及本地DLCI (Data Link Connection Identifier,数据链路连接标识)的对应关系。
当路由器要通过帧中继接口向 链路对端的某台路由器发送数据时,路由器在帧中继映射表中査询下一跳IP地址(帧中继链路对端的设备IP地址)及DLCI的映射,并为数据包进行帧中继的封装,在帧头中 写入DLCI号,数据包被送入帧中继网络后,DLCI号用于确保数据能够顺利到达对端。
综上,由于路由器使用的帧中继接口可以连接多台设备,而且在通过帧中继接口发送数据时,需要用到数据包下一跳IP地址对应的DLCL因此在为其配置静态路由时,如果出接口类型为NBMA,则必须指定下一跳IP地址。
在图中,R1的Serial 1/0/1通过帧中继链路与R3 建立连接,R3的IP地址是10.1.13.3,此时R1 已经通过广域网服务提供商得到这个IP地址对应的DLCI 并且完成了帧中继接口的相关配。现在 R1需要配置部署静态路由,使自己能够到达3.3.3.0/24,那么可以采用以下配置:
[Rl]ip route-static 3.3.3.0 255.255.255.0 10.1.13.3
如图所示展示了一个企业的网络,GW1、GW2及GW3是该企业各个站点的网关路由 器,这些路由器各下联一台以太网交换机,同时上联出口路由器OR。以太网交换机连 接着终端用户,出口路由器则连接着Internet。在该场景中,以OR为例,由于其连接着 Internet,是整个网络的出口,因此它将负责把内网到达Internet的数据包转发出去,当 然网络管理员不太可能在OR上配置到达Internet的明细路由,毕竟整个Internet包含的 网段实在太多了,要想让OR获知到达整个Internet的路由显然不现实。在这种场景中, 使用默认路由(Default Route)是一个非常不错的解决办法。默认路由也被称为缺省路 由,是目的网络地址及网络掩码均为0的路由,艮卩0.0.0.0/0或者0.0.0.0 0.0.0.0。这是一 条非常特殊的路由,所有的目的IP地址都能被这条路由匹配。
如果在OR上部署静态路由,那么他可以采用以下的配置:
[OR]ip route-static 0.0.0.0 0.0.0.0 200.1.1.1
[OR]ip route-static 10.11.0.0 16 10.1.LI
[OR]ip route-static 10.12.0.0 16 10.1.1.5
[OR]ip route-static 10.13.0.0 16 10.1.1.9
OR 创建了 4 条静态路由,其中 ip route-static 0.0.0.0 0.0.0.0 200.1.1.1 命令为 OR 创 建了一条静态的默认路由,该路由的下一跳为200.1.1.1 (OR到达Internet的下一跳IP 地址)。借助这条路由,路由器能够将访问Internet的数据转发出去。而去往三个站点内 网的数据包到达OR时,报文会优先匹配10.11.0.0/16、10.12.0.0/16及10.13.0.0/16这三 条静态路由,并被送达相应站点的网关路由器,而目的地址为其他网段的报文(包括访问Internet的报文)则被默认路由匹配,被送往200.1.1.1。
所有的目的IP地址都能够被默认路由匹配,那么在OR完成上述4 条静态路由的配置后,当其收到去往某个站点的数据包时,为什么OR不会将该数据包 转发到200.1.1.1,而是将其转发到相应站点的网关路由器呢?以发往站点1的10.11.1.1 这个IP地址的报文为例,当OR收到该报文时,它会在路由表中查询该报文的目的IP 地址,结果发现静态路由10.11.0.0/16及0.0.0.0/0都匹配该地址,最终OR会选择10.11.0.0/ 16路由来指导报文转发,这其实是“最长前缀匹配原则”作用的结果,因为10.11.0.0/16路 由与目的IP地址10.11.1.1的匹配程度更高。
从以上描述可以看出,默认路由的匹配优先级实际上是最低的,如果路由 表中存在默认路由,则只有当路由器没有发现匹配报文目的IP地址的任何具体路由之后, 才会使用这条默认路由来转发数据,因此默认路由的下一跳又被视为“最后的求助对象"。
对于GW1、GW2及GW3这三台网关路由器来说,也可以分别配置静态默认路由, 它们只需将默认路由的下一跳配置为OR即可实现数据的全网可达。当它们转发到达其 他站点的报文时,报文的目的地址能够被默认路由匹配,因此被送往OR,并由OR进 一步转发到目的站点,而当它们转发到达Internet的报文时,报文的目的地址也匹配默 认路由,并被送往OR,再由OR转发到Internet。
默认路由在实际的项目中有着广泛的应用。当然,默认路由不仅可以通过静态的 方式实现,动态路由协议同样支持默认路由的动态下发。
如图所示网络中,对于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—R之间的互联链路发生故障时,R2能够自动将流量切换到R3,这该如何实现呢?
通过部署浮动静态路由(Floating Static Route)可以轻松的实现上述需求,大家已经知道使用ip route-static 命令可以为设备添加静态路由,在缺省情况下,这条命令所添加的静态路由的优先级为60,而该值实际上时可以自定义的,例如,将R2的配置修改为:
[R2]ip route-static 10.9.9.0 24 10.1.12.1 # 该路由的优先级为缺省值 60
[R2]ip route-static 10.9.9.0 24 10.1.23.3 preference 80 #该路由的优先级被设置为 80
在上述配置中,R2添加了两条静态路由,它们的目的网络地址及掩码长度都是 10.9.9.0/24 ,下一跳分别为10.1.12.1及10.1.23.3;这里就是到下一跳为R1 的静态路由并没有指定优先级,因此该条路由的优先级为缺省值60,另一台静态路由则使用preference 关键字指定了优先级80。这样一来,这两条路由中优先级较小的路由将最终被加载到路由表中并作为数据转发的依据,另一条优先级为80的路由则”隐藏“起来,并不出现在路由表中:
此时当R2转发到达10.9.9.0/24的报文时,由于路由表中只存在一条匹配的路由, 因此报文将始终被转发给Rio当R1宕机,或者R1-R2之间的链路发生故障时,ip route-static 10.9.9.0 24 10.1.12.1 这条静态路由失效,而 ip route-static 10.9.9.0 24 10.1.23.3 preference 80也就浮现出来了,浮动静态路由因此得名。此时R2的路由表如下:
现在当R2 转发到达10.9.9.0/24的报文时,报文被转发到R3,如图所示:
所以浮动静态路由是一种不错的路由备份机制,在某种程度上提高了静态路由的灵活度,在实际的物理部署中有着广泛应用。一个典型的例子就是在拥有多出口的网络中部署出口路由,例如一个园区网的出口路由器连接着A,B两个运营商提供的出口链路,我们希望内网外出的流量默认走A运营商提供的出口,当该出口发生故障时,能够自动切换到B运营商提供的出口。要实现这个需求,可以子啊出口路由器上配置两条默认路由并且将指向B运营商的那条默认路由的优先级值调的稍微大一些。
关于静态路由的相关案例示例会在后面的章节介绍。