1.2 静态路由
静态路由(Static Route)是指网络管理员通过手工配置的方式为路由器创建的路由,通过这种方式,网络管理员可以非常简单、便捷地让路由器获知到达目的网络的路由。学习完本节之后,我们应该能够:
● 理解静态路由的概念并掌握其配置;
● 理解默认路由的概念及其应用场景;
● 理解浮动静态路由的概念并掌握其配置;
● 掌握静态路由与BFD及NQA联动的方法及配置;
● 了解静态路由在书写时的一些注意事项。
1.2.1 静态路由的基本概念
路由器能够自动发现直连路由并将其加载到路由表中,而对于到达非直连网络的路由,路由器就必须通过其他途径来获取,静态路由是一种最直接、最简单的方法。所谓静态路由,也就是网络管理员使用手工配置的方式为路由器添加的路由,通俗的说法是,网络管理员通过手工配置的方式告诉路由器:“你要到达目的地X,需把数据包从接口Y扔出去给下一跳Z”。在网络中部署静态路由后,网络设备之间无需交互特别的协议报文(不像动态路由协议那样)。下面的例子可以帮助大家进一步理解静态路由。
在图1-7所示的网络中,我们首先为两台PC设置网卡IP地址及默认网关地址,然后完成R1及R2两台路由器的接口IP地址配置。在初始情况下,每台路由器都自动学习直连接口所在网段的路由,并将直连路由加载到路由表中。R1的路由表如下:
图1-7 部署静态路由使得PC1与PC2能够相互通信
从R1的路由表可以看出,它此时仅仅发现了直连接口的路由。
R2的路由表如下:
与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创建一静态路由。静态路由的配置非常简单:
在设备的系统视图下,使用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 GigabitEthernet 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.2。当这个数据包到达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地址192.168.12.1进行递归运算,也就是在路由表中查询到达192.168.12.1的路由,从而找到这个IP地址对应的出接口,并最终得到192.168.1.0/24路由的出接口——GE0/0/0。
此时R2的路由表如下:
如此一来,PC1及PC2互相通信就没有问题了。
如果网络的规模比较小,全网部署静态路由似乎没有什么问题,但是在一个大型网络中,如果完全使用静态路由来实现数据互通,工作量就太大了,毕竟大型网络中包含的网段数量非常多,这意味着如果要确保网络中的每台设备都能够到达全网各个网段,网络管理员就不得不配置大量的静态路由。另外一个更重要的问题是,静态路由无法根据网络拓扑的变更作出动态调整,因此,在大规模网络中往往采用动态路由协议或者静态路由与动态路由协议搭配的方式来打通路由。
1.2.2 静态路由配置须知
大家都知道,使用ip route-static命令可以为设备添加静态路由,在该命令中需要指定静态路由的目的网络地址、网络掩码(或掩码长度)、下一跳IP地址及出接口等信息。在为设备创建静态路由时,关于下一跳IP地址及出接口的配置有几个细节是需要注意的。
针对不同的出接口类型,静态路由的配置要求是不同的。
(1)如果出接口为BMA(Broadcast Multiple Access,广播型多路访问)类型,则静态路由需指定下一跳IP地址。
以太网接口就是一种非常典型的BMA类型的接口,BMA接口接入一个广播网络,该网络中往往还同时接入了多台设备,因此如果仅仅为静态路由指定出接口,那么路由器将无法判断究竟该将数据包发往哪一个下一跳设备。在图1-8中,R1及R2通过GE0/0/0接口连接到一台以太网交换机上,现在我们要为R1配置一条到达2.2.2.0/24的静态路由,由于R1的出接口GE0/0/0是一个BMA接口,因此根据要求必须在该静态路由中指定下一跳IP地址,所以可以使用如下配置:
图1-8 针对不同的出接口类型,静态路由的配置存在不同的注意事项
或者如下配置:
以上两种方式都指定了具体的下一跳IP地址,因此都是可行的。
而如果将静态路由改写为:
那么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完成上述配置后,它的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安装了一个广域网接口卡,并通过该接口卡上的广域网接口Serial1/0/0与R4直连,链路两端的接口均采用PPP封装,因此R1的Serial1/0/0是一个典型的P2P接口。此时要为R1配置一条静态路由,使其能够到达4.4.4.0/24,那么R1可以采用如下配置:
也就是说,R1仅需在该静态路由中指定出接口即可(当然,也可以指定出接口及下一跳IP地址)。
(3)如果出接口为NBMA(Non-Broadcast Multiple Access,非广播多路访问)类型,则静态路由需指定下一跳IP地址。
采用帧中继(Frame Relay)封装的接口是一种典型的NBMA类型接口,这种接口同样能够连接一台或多台设备,但是并不支持广播。拥有帧中继接口的路由器维护着一张帧中继映射表,用于存储帧中继链路对端设备的IP地址及本地DLCI(Data Link Connection Identifier,数据链路连接标识)的对应关系。当路由器要通过帧中继接口向链路对端的某台路由器发送数据时,路由器在帧中继映射表中查询下一跳IP地址(帧中继链路对端的设备IP地址)及DLCI的映射,并为数据包进行帧中继的封装,在帧头中写入DLCI号,数据包被送入帧中继网络后,DLCI号用于确保数据能够顺利到达对端。综上,由于路由器使用的帧中继接口可以连接多台设备,而且在通过帧中继接口发送数据时,需要用到数据包下一跳IP地址对应的DLCI,因此在为其配置静态路由时,如果出接口类型为NBMA,则必须指定下一跳IP地址。
在图1-8中,R1的Serial1/0/1通过帧中继链路与R3建立连接,R3的IP地址是10.1.13.3,此时R1已经通过广域网服务提供商得到这个IP地址对应的DLCI并且完成了帧中继接口的相关配置。现在R1需要部署静态路由,使自己能够到达3.3.3.0/24,那么可以采用如下配置:
1.2.3 默认路由
图1-9展示了一个企业的网络,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地址都能被这条路由匹配。
图1-9 默认路由的应用
如果在OR上部署静态路由,那么它可以采用如下配置:
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。
默认路由在实际的项目中有着广泛的应用。当然,默认路由不仅可以通过静态的方式实现,动态路由协议同样支持默认路由的动态下发,关于这部分内容本书将在专门讲解动态路由协议的章节中进行介绍。
1.2.4 浮动静态路由
在图1-10所示的网络中,对于R2而言,要去往10.9.9.0/24,通过R1及R3都可达。R2配置了如下静态路由:
图1-10 静态路由的负载分担
这两条静态路由的目的网络地址及网络掩码都相同,而且分别采用不同的下一跳地址,在这种情况下,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命令可以为设备添加静态路由,在缺省情况下,这条命令所添加的静态路由的优先级为60,而该值实际上是可以自定义的,例如,将R2的配置修改为:
在上述配置中,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的报文时,由于路由表中只存在一条匹配的路由,因此报文将始终被转发给R1。当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,如图1-11所示。
图1-11 备份路由浮现出来
所以浮动静态路由是一种不错的路由备份机制,在某种程度上提高了静态路由的灵活度,在实际的网络部署中有着广泛应用。一个典型的例子就是在拥有多出口的网络中部署出口路由,例如一个园区网的出口路由器连接着A、B两个运营商提供的出口链路,我们希望内网外出的流量默认走A运营商提供的出口,当该出口发生故障时,则自动切换到B运营商提供的出口。要实现这个需求,可以在出口路由器上配置两条默认路由,并将指向B运营商的那条默认路由的优先级值调得稍微大一些。
1.2.5 案例1:静态路由与BFD联动
静态路由配置起来非常方便、简单,然而其短板也是非常明显的——它无法根据拓扑的变化作出动态响应。在图1-12中,R2通过以太网链路分别连接到出口路由器R1及R3。在R1与R2之间隔着一台以太网交换机,这台以太网交换机不做任何配置,在该网络中仅发挥数据帧透传的作用。
图1-12 静态路由无法根据拓扑的变化作出动态响应
现在,网络的需求是R2能够访问10.9.9.0/24,而且在网络正常时,R2将到达10.9.9.0/24的数据包转发给R1,而且当R1发生故障时,或者R1与R2之间的某段链路发生故障时,R2自动将数据包的转发路径进行切换,将到达该网段的数据包转发给R3。这个案例在1.2.4节中已经介绍过了,配置很简单:
然而仅仅依靠上述配置是不够的,经过测试您会发现,当R2的GE0/0/0接口发生故障或者SW与R2互联的链路发生故障时,R2都能够感知到,此时GE0/0/0接口的物理状态会切换为Down,使用该接口作为出接口的静态路由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 preference 80将会浮现出来。在这个过程中,从R2发往10.9.9.0/24的数据流量可以实现平滑切换。但是如果R1发生故障或者R1与SW互联的链路发生故障时,R2是无法感知的。在这种情况下,R2的路由表中10.9.9.0/24路由的下一跳依然是10.1.12.1,而其实10.1.12.1已经不可达。这么一来,备份路由ip route-static 10.9.9.0 24 10.1.23.3也就无法浮现,从R2到达10.9.9.0/24的数据流量当然就会中断。
造成上述问题的根本原因是,静态路由无法感知到网络拓扑的变化并作出动态响应。有一些技术或机制可以改良静态路由以便解决上述问题,BFD(Bidirectional Forwarding Detection,双向转发检测)就是这类技术之一。实际上,BFD是一种实现网络可靠性的机制,它可被用于快速检测网络中的链路状况、IP可达性等。BFD可以与多种协议或机制进行联动,以确保它们更加可靠地工作,例如静态路由、OSPF、IS-IS、BGP、VRRP、PIM及MPLS LSP等。
在图1-12中,可以在R1及R2上部署BFD来检测双方直连接口的IP连通性。BFD在R1及R2之间开始工作后,两者便会周期性地交互BFD报文,当R1及R2之间的连通性产生问题时,双方的BFD报文交互也将发生问题,此时R1及R2都能通过BFD感知到网络的变化。而当我们在R2上配置静态路由时,可将下一跳为R1的静态路由与BFD进行联动,当BFD的检测状态为Up时,这条静态路由能够正常工作,而当BFD检测状态为Down时,与之关联的静态路由会立即失效,从而使得备份路由能够浮现。
R1的配置如下:
需注意的是,在R1的BFD会话中,discriminator local需与R2的discriminator remote相同,而它的discriminator remote需与R2的discriminator local相同。另外,BFD会话的名称只具有本地意义,双方无需相同。
R2的配置如下:
完成上述配置后,R1及R2便会进行BFD报文的交互。首先看一下R2的BFD状态:
BFD的状态是Up的,因此与该BFD联动的静态路由此时将出现在路由表中。R2的路由表如下:
现在将R1连接SW的接口关闭,以便模拟R1发生故障的情况,R2将弹出如下日志:
由于R1与R2之间的连通性已经出现了问题,BFD很快便能感知到,从上述日志的输出可以看出,BFD的状态已经切换为Down,查看一下会话状态:
由于静态路由ip route-static 10.9.9.0 24 10.1.12.1 track bfd-session ba与该BFD会话进行了联动,因此一旦会话状态为Down,该条静态路由立即失效,如此一来,浮动路由便会出现在路由表中:
此时,从R2发往10.9.9.0/24的数据被转发给了R3,流量实现了平滑切换。
当R1连接SW的接口从故障中恢复后,R1与R2之间的BFD继续工作,并且状态切换为Up,此时下一跳为R1的静态路由将重新出现在路由表中,从R2发往10.9.9.0/24的数据流量会切换回R1。
1.2.6 案例2:静态路由与NQA联动
在1.2.5节中,大家掌握了使用BFD来弥补静态路由无法动态响应网络拓扑变更这一短板的方法,除此之外,还有一个颇有用处的工具——NQA(Network Quality Analysis,网络质量分析),也可以实现类似的功能。NQA是一个非常强大的工具,主要用于网络性能检测及运行状况分析。通过在设备上部署NQA,网络管理员可以对网络的响应时间、网络抖动、丢包率等信息进行统计,从而能够实时采集到网络的各项运行指标。NQA支持DHCP、DNS、FTP、HTTP、ICMP、SNMP、TCP、Trace、UDP等各种测试机制,功能十分丰富。当然,NQA也能完成基本的IP可达性测试(例如使用ICMP测试机制),并且将测试结果与静态路由进行联动。在部署静态路由与NQA联动时,只需配置静态路由的设备支持NQA即可。
还是以图1-12的案例为例,依然是相同的需求,此时只需要在R2上部署一个NQA的实例,使用ICMP测试机制探测到R1(10.1.12.1)的可达性,并将测试结果与下一跳为R1的静态路由进行联动即可。当NQA检测到10.1.12.1可达时,静态路由生效,当检测到其不可达时,静态路由失效,此时浮动路由将出现在路由表中。
首先在R2上创建一个NQA的ICMP测试实例:
在以上配置中,admin是测试实例的管理者名称,test1是测试实例名,这两个名称都是自定义的。Test-type命令定义了该测试实例使用的测试机制为ICMP;destinationaddress定义的是测试对象的IP地址;frequency定义的是每一轮测试的时间间隔(单位为秒);probe-count命令定义了每一轮测试的探测次数;interval seconds定义了在每一轮测试当中每个探测报文的发送间隔(单位为秒);而timeout则定义了每一次探测的超时时间(单位秒)。最后start now命令使该测试实例开始执行。
接下来为R2配置静态路由,将静态路由ip route-static 10.9.9.0 255.255.255.0 10.1.12.1与admin test1这个NQA实例进行联动,然后再另外配置一条浮动静态路由:
完成上述配置后,首先查看一下NQA实例的探测结果:
从上述输出可以看到,R2已经完成了三轮测试,每一轮测试的结果都是成功的(Success)。使用display nqa history命令可以查看到每一次探测的结果:
由于当前每一轮NQA检测的都是成功的,因此与该NQA实例联动的静态路由也是活跃的,此时它出现在R2的路由表中:
到达10.9.9.0/24的流量被R2转发给了R1。
现在将R1连接SW的接口关闭,来模拟R1发生故障的情景。
此时R2的NQA实例检测失败(failed),如此一来,与该实例联动的静态路由失效,浮动路由出现在了路由表中:
此时,到达10.9.9.0/24的流量被R2平滑地切换到了R3。
而当R1的接口恢复后,R2到10.1.12.1的IP可达性也跟着恢复了,NQA实例又能够检测成功,因此与该实例联动的静态路由又再次出现在了路由表中,到达10.9.9.0/24的流量被R2重新切换到R1。
1.2.7 案例3:A与B互ping的问题
在网络维护过程中,大家可能时常会碰到一些“奇怪”的问题,其实,许多问题只要深入挖掘、仔细分析,是能够找到科学及合理的解释的。有这么一个小问题相信不少读者曾经遇到过:“A能ping通B,但是B无法ping通A”。
“A能ping通B,但是B无法ping通A”的一个典型场景是在防火墙组网中位于两个不同安全区域(Security Zone)的主机构成的拓扑。在图1-13所示的网络中存在一台防火墙,PC1及PC2分别处于防火墙的两个不同安全区域中。PC1位于安全级别较高的可信赖区域(Trust),而PC2则位于安全级别较低的非可信赖区域(Untrust),为了保证Trust区域内PC的安全,可在防火墙上部署安全策略,允许Trust区域内的PC主动向Untrust区域内的PC发起访问,反之则禁止。因此在这个环境中,当PC1主动访问PC2时,去程流量能够被防火墙检测通过并放行(因为安全策略允许了这些流量),而PC1访问PC2后所触发的、PC2发送的回程流量,也能够被防火墙放行,因此在这个场景中,PC1是能够ping通PC2的。然而PC2是无法主动向PC1发起访问的,换句话说,PC2是无法ping通PC1的。PC2主动访问PC1时所产生的流量由于不被防火墙的安全策略所允许,因此将被防火墙直接丢弃。读者可能会有疑惑:为什么PC2响应PC1的访问时所产生的回程流量能够被防火墙放行,而PC2主动访问PC1的流量则无法穿越防火墙?流量的方向同样是从Untrust区域到Trust区域,为什么会区别对待?实际上这与防火墙的工作机制有关,目前行业中多数的防火墙都是状态化防火墙,当一个会话的首包顺利通过防火墙的安全检查并被其转发时,防火墙会为该会话动态地产生一个状态化信息——会话表项(Session Table Entry),该表项包含着这个会话的五元组信息(源IP地址、目的IP地址、协议类型、源端口号及目的端口号),而回程流量由于拥有相匹配的五元组信息,因此防火墙根据会话表项的查询判断出该流量为一个已知会话的回程流量,于是将其放行,如图1-14所示。而PC2主动访问PC1时,防火墙查询会话表后发现并无相匹配的表项,而且安全策略又禁止了这些流量,因此PC2主动发往PC1的流量被丢弃,这就是PC2无法ping通PC1的原因。
图1-13 在防火墙组网中A与B互ping的问题
图1-14 PC1能够ping通PC2
除了防火墙组网经常容易出现“A能ping通B,但是B无法ping通A”的现象(当然在防火墙组网中,这是正常现象,也是符合业务需求的现象)外,纯路由器组网也可能会遇到类似的现象。在图1-15中,网络管理员在R1上使用ping 1.1.1.1命令测试到PC的可达性时,发现结果是成功的,但是从PC却无法ping通R1的接口地址10.1.12.1。网络故障定位能力是一个网络从业人员必备的基本素质,在面对网络中出现的故障时,最重要的是要有清晰的思路。
图1-15 R1能够ping通PC,而PC无法ping通R1
尝试在PC使用tracert 10.1.12.1命令测试一下:
我们发现只有第一跳设备即R5做了回应,因此需进一步检查网络中相关设备的路由表。首先PC将默认网关设置为1.1.1.254,当PC ping 10.1.12.1时,其产生的ICMP Request报文的源IP地址为1.1.1.1,而目的IP地址为10.1.12.1,这个报文首先是被发往PC的默认网关R5,而R5则通过在自己的路由表中查询到达10.1.12.1的路由来确定如何转发这个报文,在R5的路由表中存在如下路由:
那么,当R5收到去往10.1.12.1的报文时,会将其转发给R3。而网络管理员检查R3的路由表后发现,R3并没有到达目的网段的路由,因此报文在R3处被丢弃。这就是PC无法ping通R1的原因。但是为何反过来,R1却能ping通PC呢?对于R1而言,有两个接口连接到了这个网络,这两个接口的IP地址分别是10.1.12.1/24及10.1.14.1/24,那么当R1 ping PC时,使用的源IP地址究竟是哪一个?实际上,在R1上执行ping 1.1.1.1命令时,它所产生的ICMP Request报文的源IP地址缺省即该报文的出接口的IP地址,也就是说,这个ICMP Request报文从哪个接口发出,缺省其源IP地址即该接口的IP地址。而R1是依据其路由表来决定将到达1.1.1.1的ICMP Request报文从哪个接口发出。
在R1的路由表中,网络管理员发现存在一条到达1.1.1.0/24的静态路由:
因此当R1 ping PC时,其产生的ICMP Request报文的源IP地址为10.1.14.1。而PC在回应这个ICMP Request报文时,所产生的ICMP Reply报文的源IP地址为1.1.1.1,目的IP地址为10.1.14.1。
报文的传输路径如图1-16所示。
图1-16 从R1 ping PC时,ICMP报文的交互路径
由于处于该转发路径上的路由器都拥有到达目的网段的路由,因此R1可以ping通PC。所以看似简单的A访问B,B访问A,实际上报文的源IP地址及目的IP地址是不同的,转发路径也是不同的。
1.2.8 案例4:静态路由在以太网接口中的写法及路由器的操作
大家已经知道,使用ip route-static命令可以为设备添加静态路由,本书在“静态路由配置须知”一节中也已经介绍过静态路由在配置时的一些注意事项,实际上,当出接口为BMA类型(例如以太网接口)时,静态路由的不同书写方法将导致路由器执行不同的操作。
在图1-17中,R1、R2及R3预备采用静态路由实现各个网段的互通,我们将围绕R1到达3.3.3.0/24这一目标,来看看当R1采用不同的静态路由配置时路由器的操作过程。
图1-17 静态路由的不同写法将影响路由器的操作
1.配置场景一
当R1采用如下配置时:
这是一种非常典型、也是通常推荐的静态路由配置方法,该路由指定了明确的下一跳IP地址。这条静态路由书写完成后,R1会将其添加到路由表中,由于该条静态路由并未指定出接口,因此R1继续在路由表中查询到达该路由下一跳IP地址10.1.12.2的路由,它发现该IP地址是本地接口GE0/0/0所直连的网段中的地址,于是将路由3.3.3.0/24关联到出接口GE0/0/0。R1的这个操作被称为递归(Recursion)查询,也被称为路由迭代。
此时假设R1收到去往3.3.3.3的报文,它会将报文从GE0/0/0接口转发出去,并且报文被转发给10.1.12.2。
2.配置场景二
当R1采用如下配置时:
该条静态路由只关联了出接口,而并未指定下一跳IP地址信息。完成上述配置后,R1将认为3.3.3.0/24从GE0/0/0接口出去即可到达,由于没有明确的下一跳IP地址信息,因此当其转发到达3.3.3.0/24的报文时(以目的主机3.3.3.3为例),它将直接从GE0/0/0接口发送ARP Request广播数据帧,试图获知3.3.3.3对应的MAC地址。此时如果R2的GE0/0/0接口激活了ARP-Proxy,并且其存在到达3.3.3.0/24的路由,则R2会回应R1关于3.3.3.3的ARP Request,并且以自己GE0/0/0接口的MAC地址进行回应。如此一来,R1即可将到达3.3.3.3的数据帧转发给R2,再由后者进一步转发。当然,如果R2没有在GE0/0/0接口上激活ARP-Proxy,那么在本环境中,R1所发出的ARP Request将势必无法收到任何回应,它自然也就无法将到达3.3.3.3的流量顺利转发出去。
3.配置场景三
当R1采用如下配置时:
该静态路由既指定了下一跳IP地址又指定了出站接口,因此这条路由拥有了足够的转发信息,它将被直接加载到R1的路由表中——虽然,初始时R1的路由表中并没有到达10.1.23.0/24的任何路由信息。此时R1认为3.3.3.0/24可以通过GE0/0/0接口所直连的10.1.23.3到达,因此R1并不会在路由表中对下一跳地址10.1.23.3进行递归查询。
当有去往3.3.3.0/24的流量到达R1时,R1将直接在GE0/0/0接口上发送ARP Request,尝试请求10.1.23.3这个IP地址对应的MAC地址。此时如果R2的GE0/0/0接口激活了ARP-Proxy,则会以自己的接口MAC地址进行回应,数据帧则可以到达R2,再由R2转发到目的地,否则数据帧无法被R1顺利发出。当然,这种静态路由的配置方式并不被建议。
4.配置场景四
当R1采用如下配置时:
初始时,该路由并不会被加载到R1的路由表,因为其下一跳IP地址10.1.23.3无法经递归查询确认直连的出接口(该路由本身并未指定出接口,与此同时R1在路由表中也无法查询到去往10.1.23.3的路由)。
此时在R1上增加静态路由:ip route-static 10.1.23.0 255.255.255.0 10.1.12.2,则到达3.3.3.0/24及10.1.23.0/24的路由都会出现在R1的路由表中,R1根据路由表将路由3.3.3.0/24的下一跳10.1.23.3进行递归查询,它能够找到匹配10.1.23.3的路由表项,并且该表项的下一跳IP地址为10.1.12.2,进一步在路由表中查询10.1.12.2,则发现该IP地址处于本地直连网段10.1.12.0/24中,且出接口为GE0/0/0。因此R1获取了足够的转发信息,当其转发到达3.3.3.3的流量时,将其从GE0/0/0接口发出,下一跳为10.1.12.2。