先看一张图
R1和R3分别和R2建立IBGP邻居关系,如果这个时候R1或者R3有路由需要传递,那么因为BGP通告原则之一的IBGP水平分割的原因会导致R1或者R3接收不到路由,那么对于这种情况我们的解决办法是建立IBGP全互联
如图,这5台路由器之间如果都希望拥有各自的路由,那么就必须使用IBGP全互联,但是随着自治系统内的路由器数量越多,所建立的BGP连接的数量也就越多,可以得出一个公式为n*(n-1)/2
那其实还有另一种解决方案,那就是通过路由反射器,简称为RR
把一台路由器设置为反射器,反射器收到的路由会反射给客户端,而且不需要建立IBGP全互联,所有路由器值需要和RR建立邻居关系即可。路由器数量越多,使用路由反射器带来的效果就越明显
在配置路由反射器的时候,客户端是感知不到自己是客户端,只需要在RR上把邻居配置为自己的RR客户端即可
既然路由反射器打破了IBGP水平分割,那么就意味着有可能带来路由环路的风险,这一点不得不防
如左图,R2、R3和R4互为RR,R1发布路由100.1.1.0/24,RR1收到之后反射给RR2和RR3,RR2收到之后反射给RR3,RR3收到之后反射给RR1,RR1收到之后反射给客户端R1,这样就形成了一个路由的环路了。为了解决这个问题,BGP使用到了一个路由属性Originator ID。
R1发布路由,RR1收到路由之后在把路由反射给RR2和RR3之前会为这条路由添加Originator ID,这个值为路由始发路由器的Router ID,全程不会发生改变,如果R1收到的路由发现Originator ID与自己的Router ID一样,那么认为是环路,不会接收此路由
另一个问题,如果环路发生在RR改如何防范?
当第一台RR反射路由的时候会添加一个Cluster_List,这个也是一个BGP属性,Cluster_List可配置,如果没有配置,那么默认是RR的Router ID,如果RR收到的路由Cluster_List=自己的Cluster_List一样,那么认为环路了,那么不接收此路由
下面介绍一些路由反射器的一些典型组网结构
备份RR组网:既然RR可以反射路由,那么RR就显得十分重要,一旦RR故障,那么全网就无法接收到路由了,容易出现单点故障。那么在设计网络的时候可以一台Client和多个RR建立BGP邻居关系,这样两个RR都会给自己反射路由了,Client在根据BGP路由选优选择选择最合适的路由。
两个RR之间是否需要建立BGP邻居关系?
这个是不用的,可以看到上图RR1和RR2是在一个集群的,RR2收到的路由是会携带RR1的集群ID的,RR2收到之后会发现和自己的集群ID一样,这个时候会不接收路由。另外呢,因为Client同时和多个RR建立BGP邻居关系,所以可以接收到多个RR反射过来的路由,所以RR之间是不需要建立BGP邻居关系的
多集群RR组网
如图有四台RR,RR相互之间建立IBGP全互联,么一个RR都属于不同的集群,配置不同的集群ID,连接自己的Client。每一个集群都可以看作是一个自治系统的网络,那么Client都可以接收到其他自治系统的路由