让我们先来回忆一下,上期交换机碰到的难题:
如果采用逻辑全连接的方式,需要建立3个IBGP连接。这只是转接AS(这里为AS200)内只有3台设备的情况,事实上,转接AS内如果每增加一台设备,需要建立的IBGP连接数量将呈几何级数上升。
BGP联盟可以将AS分割为多个子自治系统,从而让大型转接AS变得更具管理性。被分割的AS本身将成为联盟,而分割后的子自治系统则成为成员自治系统。联盟之外的AS将整个联盟视为一个AS,看不见成员自治系统。由于成员自治系统对外界来说是隐而不见的,因而成员自治系统可以使用公有或私有AS号(建议采用私有AS号)。
联盟可以极大的降低IBGP连接的数量。在联盟中,只需要在成员自治系统内进行IBGP的全连接,而成员自治系统间使用一种特殊的EBGP连接,我们称之为联盟EBGP。下面看下具体配置。
如上图,我们将AS200分成2个成员AS:AS65535和AS65534。而对于R1和R5来说,他们看到的中间的转接AS仍然是AS200。下面截取了R3的一些关键配置:
R3:
#
bgp 65535 /本机AS为成员AS号
confederation id 200 /联盟ID,外部路由器看来,连接AS仍然为200
confederation peer-as 65534 /说明本机连接了其他哪些成员AS
peer 10.0.12.1 as-number 65534 /和成员AS65534建立联盟EBGP连接
peer 10.0.23.1 as-number 65535 /和本成员AS内部设备建立IBGP连接
#
ipv4-family unicast
undo synchronization
peer 10.0.12.1 enable
peer 10.0.23.1 enable
peer 10.0.23.1 next-hop-local /这个配置并不生效,详细会在下文提及。
#
这样,整个AS200内,只需要建立一个IBGP连接和一个EBGP连接,就可以实现路由的传递和数据包的转发。
需要注意的是:联盟AS内仍然需要保证IGP的连通性,才能保证数据包的正确转发。
在联盟内部应遵守以下规则:
上述规则的本质原因是整个联盟都被外界视为一个自治系统。对于规则2、3、4、5,将在后面说到AS_PATH属性和MED属性时,进行详细说明。本期我们通过一个具体例子说明规则1。仍旧以上面交换机的难题为例:
首先,我们在R1上通过Loopback1口发布一条路由:10.1.4.0/24,这条路由通过EBGP连接发送给R2时,NEXT-HOP为R1建立连接的接口地址10.0.14.4/24。正常来说,R2和R3建立的是EBGP连接,R2在将这条路由发送给R3时,会将这条路由的NEXT-HOP修改为自己和R3建立EBGP连接的接口地址10.0.12.1/24,但是我们发现并不是这样:
可以看到,R3上10.1.4.0/24路由的NEXT-HOP依然是10.0.14.4。这时,我们在R3上配置命令peer 10.0.23.1 next-hop-local。由于R3和R4之间是IBGP关系,正常来说配置了这条命令之后,R3在把该路由发送给R4时,会将NEXT-HOP设置为本设备接口地址。在R4上查看BGP路由发现,NEXT-HOP依然为10.0.14.4。
这就是由于外部路由的NEXT-HOP在联盟内部都是被保留的。这也解释了为什么我们之前说:联盟内部必须要保证IGP的连通性,如果联盟内部没有运行IGP,那么R4和R3上将没有到达10.0.14.0/24网段的路由,导致该BGP路由不生效。
接着我们在R5上也通过Loopback1接口引入一条路由10.1.5.0/24,并且在R4上配置命令peer 10.0.23.1 next-hop-local。查看R3上的BGP路由表:
可以看到,10.1.5.0/24这条路由的NEXT-HOP被修改为R4建立IBGP的接口地址10.0.23.1。这是因为,peer next-hop-local在仅仅在外部路由在联盟内部传递的情况下是不生效的。
下面是一个路由反射器的示例:
如图,左边组网内有5台设备,如果采用IBGP全连接方式,将会有众多连接需要管理,非常麻烦。上期我们说过,IBGP有一个防环机制,任何从IBGP收到的路由,都不会发给其IBGP对等体,这是为何我们要建立逻辑全连接的原罪。聪明的人们想到,能不能有条件的打破这个规则呢?
我们发现,对于左图,如果我们只允许任何一台设备转发从IBGP对等体收到的路由,都是不会产生路由环路的。于是,我们指定其中一台设备可以转发从IBGP对等体收到的路由,则其他设备只需要和该设备建立IBGP连接,就可以保证路由能够传递到所有的设备上。这就是路由反射器的思想。
根据右图,我们先介绍下路由反射器中的一些概念:
RR向IBGP邻居发布路由规则如下:
我们根据交换机的难题来看下路由反射器的配置。
如上图,R2、R3、R4任何一台作为RR都可以,本例我们用R3作为RR。R3的关键配置如下:
#
bgp 200
peer 10.0.12.1 as-number 200
peer 10.0.23.1 as-number 200
#
ipv4-family unicast
undo synchronization
reflector cluster-id 1 /配置cluster-id,缺省为设备router id,可选配置
peer 10.0.12.1 enable
peer 10.0.12.1 reflect-client /配置10.0.12.1为客户机
peer 10.0.23.1 enable
peer 10.0.23.1 reflect-client
#
我们在R1上发布10.1.4.0/24这条路由,查看R4的路由表,发现R4已经收到这条路由,在R4上查看这条路由的详细信息:
这条路由的NEXT-HOP为10.0.23.2
这条路由的Cluster_list属性中,已经记录了0.0.0.1。集群使用AS内唯一的Cluster ID作为标识。为了防止集群间产生路由环路,路由反射器使用Cluster_List属性,记录路由经过的所有集群的Cluster ID。
当AS内部存在多个集群时,可能会产生集群环路,当RR从其他集群收到Cluster_list中含有1的路由时,将其丢弃,从而防止了集群间的路由环路。
同样我们看到,这条路由的Originator已经被记录为10.0.1.1。这个ID是R2的Router ID。Originator_ID由RR产生,使用的Router ID的值标识AS内这条路由的始发者,这里,10.1.4.0/24这条路由在AS200内的始发者是R2。当RR收到这条路由时,会将R2的Router ID加在这条路由中作为Originator_ID属性。当设备接收到这条路由时,会比较Oringinator_ID和设备本身的Router ID,如果相同,则丢弃该路由。这样就防止了在集群内部的路由环路。
联盟和路由反射器都是在大规模自治系统中减少IBGP对等体数量的有效方法,和联盟相比,路由发射器有以下两个好处:
如上面所述就是一个典型的例子,通过路由反射器,只需要在R3上增加一条配置命令,即可解决问题。但是如果希望用各种EBGP机制来管理大规模AS,那么联邦将是一个更优的解决方案。