基于FRR全面解析BGP协议(三):BGP路由反射器

BGP路由反射器

背景

基于FRR全面解析BGP协议(三):BGP路由反射器_第1张图片

在中转AS65102中,BCDE路由互通。B与E运行BGP,并且两者建立IBGP对等体关系(两者并非直连,但是对于BGP,这是允许的,仅需确保两者之间能够正确建立TCP连接即可)。C与D并未运行BGP。 此时A将本地路由1.1.1.0/24通告到BGP,最终F能够通过BGP学习到该条路由。 但是C、D由于并未运行BGP,因此无法通过BGP学习到1.1.1.0/24路由。如此一来,F发往1.1.1.0/24网络的数据包在到达C/D后将被丢弃,在C及D路由器这里,就出现了路由黑洞。

水平分割

为了使得BGP路由能够正常交互,我们就不得不在该传输AS内所有路由器上都运行BGP,且构建全互联的IBGP对等体关系。但是这样也引入了一个问题,就是如何防环。我们知道BGP路由在AS之间的防环依赖于AS_Path路径属性,当路由器收到BGP路由后,发现该路由所携带的AS_Path属性中出现了其自己所处的AS号,则路由器认为出现了路由环路,它将忽略该条路由。AS_Path属性仅在路由离开AS时才会被更改,而BGP路由在AS内部传递时,路由的AS_Path属性值不会发生改变,如此一来,IBGP路由的防环就无法依赖AS_Path。为了防止BGP路由在AS内部传递时发生环路,BGP规定路由器不能将自己从IBGP对等体学习到的路由再传递给其他IBGP对等体,这就是IBGP水平分割规则。
基于FRR全面解析BGP协议(三):BGP路由反射器_第2张图片

上图中,C从E学习到的IBGP路由,由于水平分割规则的限制,不能够传递给B路由器,这将导致B无法学习到F通告的BGP路由。所以由于IBGP水平分割原则的存在,BGP要求AS内须保证IBGP对等体关系的全互联,因为只有这样,才能够确保每一个路由器都能学习到路由。然而在AS内的所有BGP路由器之间维护全互联(full-mesh)的IBGP对等体关系是需要耗费大量资源的,一方面路由器需维护大量的TCP及BGP连接,尤其在路由器数量较多时,另一方面网络的可扩展性、可维护性也非常差。为了解决这一问题,BGP提出了两个解决方案:路由反射器(RR)和BGP联邦。

路由反射器(RR)原理

路由反射器就像一面镜子,将自己学习到的IBGP路由“反射”出去,使得IBGP路由得以在AS内传递。当然,反射器并不是将所有的IBGP路由都进行反射,它将遵循一定的规则。将一台BGP路由器指定为反射器的同时,还需要指定其Client。至于Client本身,无需做任何配置,而且它并不知晓反射器在网络中的存在。
基于FRR全面解析BGP协议(三):BGP路由反射器_第3张图片
路由反射器规定了三个角色:反射器、Client和非Client。反射器在接收到BGP路由后,会遵循这样的规则

  • 如果该路由学习自非Client IBGP对等体,则反射给自己所有的Client;

  • 如果路由学习自Client,则反射给所有非Client IBGP对等体和除了该Client之外的所有Client;

  • 如果路由学习自EBGP对等体,则发送给所有Client和非Client IBGP对等体。

在这三条规则中,出现了两种行为:发送和反射。发送指的是传统情况下(相当于RR不存在的场景下)的BGP路由传递行为,而反射指的是遵循路由反射规则的情况下,RR执行的路由传递动作,被反射出去的路由会被RR插入特殊的路径属性Originator_ID和Cluster_List,用来防止环路和进行路由优选。

Originator_ID

Originator_ID是一个可选非传递属性,属性类型为9。是一个32bit的数值。RR将一条BGP路由进行反射时会在反射出去的路由中增加该路径属性,其值被设置为以下这些路由器的BGP Router-ID:

  • 如果路由为本地AS始发:则Originator_ID被设置为BGP路由宣告者的Router-ID;

  • 如果路由为非本地AS始发:则Originator_ID被设置为本地AS的边界路由器的Router-ID。

  • 如果AS内存在多个RR,则Originator_ID属性由第一个RR创建,并且不被后续的RR所更改。

当BGP路由器收到一条携带Originator_ID属性的IBGP路由,并且Originator_ID属性值与自身的Router-ID相同,则它会忽略关于该条路由的更新。同时,Originator_ID及属性将会影响路由优选的决策。

基于FRR全面解析BGP协议(三):BGP路由反射器_第4张图片
上图中,R1收到BGP路由后,发现该路由携带着Originator_ID属性,并且该属性的值与自己的BGP Router-ID相同,则意识到出现了路由环路,因此忽略关于该路由的更新。

Cluster_list

BGP路由反射器定义了一个概念路由反射簇(Cluster),路由反射簇包括反射器RR及其Client。一个AS内允许存在多个路由反射簇。

  • 每一个簇都有唯一的簇ID(Cluster-ID,缺省时为RR的BGP Router-ID)。
  • 当一条路由被反射器反射后,该RR(该簇)的Cluster_ID就会被添加至路由的Cluster_list属性中。

当RR收到一条携带Cluster_list属性(可选非传递)的BGP路由,且该属性值中包含该簇的Cluster_ID时,RR认为该条路由存在环路,因此它将忽略关于该条路由的更新。
基于FRR全面解析BGP协议(三):BGP路由反射器_第5张图片
R2收到BGP路由后,发现该路由携带着Cluster_List属性,并且该属性的值包含与本地的Cluster_ID相同的Cluster_ID ,则意识到出现了路由环路,因此忽略关于该路由的更新。

换句话说,Cluster_list用于非始发反射器的环路识别;Originator_ID用于边界和始发反射器的环路识别。

配置路由反射器

#设置cluster-id
bgp cluster-id A.B.C.D
#设置反射器client
neighbor PEER route-reflector-client

你可能感兴趣的:(FRR)