1.5 路由汇总
随着业务对网络的需求不断增加,网络的规模在逐渐变大。对于一个大规模的网络来说,路由器或其他具备路由功能的设备势必需要维护大量的路由表项,为了维护臃肿的路由表,这些设备就不得不耗费大量的资源。当然,在一个规模更大的路由表中进行查询时,路由器也会显得更加吃力。因此在保证网络中的路由器到各网段都具备IP可达性的同时,如何减小设备的路由表规模就是一个非常重要的课题。一个网络如果具备科学的IP编址,并且进行合理的规划,是可以利用多种手段减小设备路由表规模的。一个非常常见而又有效的办法就是使用路由汇总(Route Summarization或Route Aggregation)。路由汇总又被称为路由聚合,是将一组有规律的路由汇聚成一条路由,从而达到减小路由表规模以及优化设备资源利用率的目的,我们把汇聚之前的这组路由称为精细路由或明细路由,把汇聚之后的这条路由称为汇总路由或聚合路由。
在图1-24所示的网络中,对于R1而言,如果要到达R2右侧的192.168.1.0/24、192.168.2.0/24……192.168.255.0/24,自然是要有路由的,若手工为每个网段配置一条静态路由,这就意味着要给R1手工配置255条静态路由,显然工作量太大了,R1的路由表也将变得非常臃肿。
图1-24 在R1上部署路由汇总
您可能会想到,在这个场景中如果不在R1上配置这些静态路由,而是使用一条指向R2的默认路由似乎就可以解决上述问题,通过这条默认路由,R1能够到达R2右侧的所有网段,而且其路由表被极大地精简了。但是默认路由的“颗粒度”太大,无法做到对路由更为细致的控制,而且如果R1的其他接口还连接了一条出口链路并且已经在这个出口上使用了默认路由,那么这里只能另想他法了。
路由汇总可以很好地解决这个问题。原来需使用255条明细路由,而运用路由汇总的思想后,仅仅使用一条路由即可实现相同的效果,例如在R1上进行如下配置:
以上的配置便是在R1上创建一条静态的汇总路由,该路由的目的网络地址及掩码长度为192.168.0.0/16。192.168.0.0/16实际上是将192.168.1.0/24、192.168.2.0/24……192.168.255.0/24这些网段都“囊括”在内了。在R1上使用这样配置,一个直接的好处就是其路由表条目数量大大减少了。
路由汇总是一个非常重要的网络设计思想,通常在一个大中型网络的设计过程中,必须时刻考虑网络及路由的可优化性,其中路由的可汇总性往往就是一个非常关键的指标。在这个例子中实际上是部署了静态的路由汇总,当然,几乎所有的动态路由协议也都支持路由汇总功能。
路由的汇总实际上是通过对目的网络地址和网络掩码的灵活操作实现的,形象的理解就是,用一个能够囊括这些小网段的大网段来替代它们。然而汇总路由的计算是要非常谨慎和精确的,否则可能导致路由的紊乱,如图1-25所示的例子。
图1-25 汇总路由需要谨慎把控
为了让R2能够到达R1左侧的网段,出于网络优化的目的,我们为其配置了一条静态的汇总路由:
虽然这确实起到了网络优化的目的,但是,这条汇总路由太“粗犷”了,它甚至将R3右侧的网段也囊括在内,如此一来,去往R3右侧网段的数据包在到达R2后,就有可能被R2转发到R1,从而导致数据包的丢失,我们称这种路由汇总行为不够精确。因此,一种理想的方式是,为R2配置一条“刚刚好”囊括所有明细路由(例如R1左侧的这些网段)的汇总路由,这样一来就可以避免汇总不够精确的问题。
一个网络能够部署路由汇总的前提是该网络中IP编址及网络设计具备一定的科学性和合理性,如果网络规划得杂乱无章,路由汇总部署起来就相当困难甚至完全不具备可实施性了。
那么如何进行汇总路由的精确计算呢?下面再来看一个例子:现有明细路由:172.16.1.0/24、172.16.2.0/24……172.16.31.0/24,请计算出关于这些明细路由的、最精确的汇总路由(换句话说,计算出一个掩码长度最长的汇总路由)。
大家要做的事情非常简单,将明细路由的目的网络地址都换算成二进制,然后排列起来,找出所有目的网络地址中“相同的比特位”。由于这些明细路由的目的网络地址是连续的,因此实际上只要挑出首尾的两到三个目的网络地址来计算就足够了,具体的过程如下。
(1)将这些IP地址写成二进制形式,然后按图1-26所示进行排列,实际上只要考虑第三个8位组即可,因为只有它是在变化的。
图1-26 汇总路由的精确计算
(2)接着画一根竖线,要求是:这根线的左侧每一列的二进制数值都是一样的,而线的右侧则无所谓,可以是变化的,这根线的最终位置,就标识了汇总路由的掩码长度。注意,这根竖线可以从默认的掩码长度,例如24开始,一格一格地往左移,直到线的左端每一列数值都相等时即可停下,这时候,这根线所处的位置就刚刚好。这样一来就找出了所有明细路由的目的网络地址中共同的比特位。
(3)如图1-26所示,线的位置是19,所以经计算得到汇总路由的目的网络地址及掩码长度172.16.0.0/19,这就是一个最精确的汇总地址,换句话说,是一个掩码最长的汇总地址。
因此,图1-25所示的例子,可以在R2上进行如下配置:
也就是将R1左侧的网段进行精确汇总,得到汇总网络地址及掩码长度:172.16.0.0/19,然后在R2上配置相应的静态汇总路由,将下一跳配置为R1;将R3右侧的网段进行精确汇总,得到汇总网络地址及掩码长度:172.16.32.0/19,然后也在R2上配置相应的静态汇总路由,并将下一跳配置为R3。
路由汇总是一个非常重要的网络优化思维,然而如果处理不当,也有可能带来数据转发的环路。在图1-27中,R1左侧连接着192.168.0.0/24、192.168.1.0/24及192.168.2.0/24三个网段,为了让它们能够访问Internet,R1配置了指向R2的默认路由。而为了让这些网段访问Internet的回程流量能够顺利返回,又为了精简路由表,R2配置了一条静态汇总路由192.168.0.0/22,且下一跳为R1。这样做看似没什么问题,但是却存在一个不小的隐患。考虑这样一种情况:有一个网络攻击者连接到了R1,它开始向R1发送大量垃圾数据包,这些数据包的目的IP地址是192.168.3.0/24子网中的随机地址(该子网在R1上并不存在),以发往192.168.3.1的垃圾报文为例,该报文首先被发送到R1,后者通过路由表查询后发现数据包的目的IP地址只能匹配默认路由,因此将其转发给默认路由的下一跳R2,然而R2经过路由表查询后,发现数据包的目的IP地址匹配路由表中的汇总路由192.168.0.0/22,因此又将数据包转发给R1,R1又将报文转发回R2,至此就产生了环路,发往192.168.3.1的垃圾报文将不断地在R1与R2之间被来回转发,直到它们的TTL(Time To Live)值递减到0时才被丢弃。设想一下,如果攻击者持续发送大量的垃圾数据包,那么R1及R2的性能必将受到极大的冲击,并且两者之间互联链路的带宽也将迅速被抢占,合法的网络流量势必受到影响,业务可能会出现卡顿甚至中断的现象。
图1-27 路由汇总存在的隐患
数据转发路径若出现环路,产生的危害是非常大的,针对本案例的解决办法很简单,在R1上增加一条黑洞路由:ip route-static 192.168.0.0 22 Null0即可。这条路由的出接口非常特殊,是Null0,这是一个系统保留的逻辑接口,当路由器在转发某些数据包时,如果使用出接口为Null0的路由,那么这些报文将被直接丢弃,就像被扔进了一个黑洞里。关于黑洞路由的概念及进一步的内容,本书将在1.6节中介绍。
在R1的配置中增加这条黑洞路由之后,当其收到发往192.168.3.0/24这个在R1上并不存在的网段的非法报文时,就会直接丢弃这些报文,而不会再转发给R2了,因为这些报文的目的地址匹配这条指向Null0的路由。当然,R1如果收到目的地址为192.168.0.0/24、192.168.1.0/24及192.168.2.0/24这三个网段的数据包时,会把它们从相应的直连接口转发出去,而不会丢弃,因为这三个网段在R1的路由表中存在直连路由,而相比于黑洞路由,这些直连路由的掩码更长。
利用Null0路由来解决路由汇总场景中的数据转发环路问题,是一种有效且常见的解决方案。这个思路在部署路由汇总的时候非常关键。