BGP路由反射器原理和实现(华为设备)

背景:

在一个大型的AS当中受到iBGP水平分割(从iBGP的邻居接收到的路由不能再传递给其他的iBGP邻居)的影响,将会造成BGP的路由无法通过iBGP邻居接收。解决办法有三种:

  1. 建立全互联的iBGP邻居
  2. BGP的联盟(上一个笔记)
  3. 路由反射器

路由反射器概述:

在这里插入图片描述

在一个AS内,其中一台路由器作为路由反射器RR(Route Reflector),其它路由器作为客户机(Client)。客户机与路由反射器之间建立IBGP连接。路由反射器和它的客户机组成一个集群(Cluster)。路由反射器在客户机之间反射路由信息,客户机之间不需要建立BGP连接。

  1. 路由反射器RR(Route Reflector):允许把从IBGP 对等体学到的路由反射到其他IBGP对等体的BGP设备。
  2. 客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
  3. 非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系。
  4. 始发者(Originator):在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路。
  5. 集群(Cluster):路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。

最终达到的目标,让整个IBGP客户机能够获得相应的BGP路由条目。

路由反射原理:

在这里插入图片描述

同一集群内的客户机只需要与该集群的RR直接交换路由信息,因此客户机只需要与RR之间建立iBGP连接,不需要与其他客户机建立iBGP连接,从而减少了iBGP连接数量。在向多个对等体发送路由更新时,可以对RR实现进行优化,使RR只简单地复制Update消息,而不是针对每个对等体逐一生成相同的路由进行更新。

上图中示,在AS100内,一台设备作为RR,两台设备作为客户机,形成Cluster 1;一台作为非客户机。两个客户机之间不需要建立IBGP连接,不仅简化了设备的配置,也减轻了网络和CPU的负担。RR打破了iBGP水平分割的限制,并采用Cluster List 属性和Originator, ID属性防止路由环路。RR向iBGP邻居发布路由规则:

  1. 从非客户机学到的路由, 发布给所有客户机。
  2. 从客户机学到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
  3. 从eBGP对等体学到的路由,发布给所有的非客户机和客户机。

运用反射中的两个BGP属性:

当网络中只部署一台RR时会难以提供更好的可靠性及冗余性,如果该RR设备发生故障,将会导致其他所有的路由器无法收到路由,因此部署多台RR可以提供更好的冗余。如图所示,在一个AS内部署了两台RR设备,都能够用于路由的反射,其他设备同时与两台RR建立iBGP邻居关系。

即使其中一台出现故障,另外一台也可以工作。但是部署过多的RR以及复杂的拓扑也可能带来环路的隐患,传统的AS_ PATH无法检测到AS内的环路。因此,在部署路由反射器时,BGP提供了两种属性,用于检测AS内的环路问题,分别是Originator_ID和Cluster_ List 属性:
在这里插入图片描述

  1. Originator_ID:可选非过渡属性,该属性由RR产生,封装在Update消息中,使用的Router_ ID 的值标识路由的始发者,用于防止集群内产生路由环路。
  2. Cluster_ List:可选非过渡属性,该属性是集群ID (Cluster_ ID)的列表,AS内的每个集群都由唯一的Cluster_ID来标识(可以在BGP进程中使用Cluster_ID命令来修改,默认为BGP的Router_ ID)。 路由反射器使用Cluster_ List 属性记录路由经过的每个集群的Cluster_ ID (类似AS_ PATH属性),用来在集群间避免环路。当一条路由第一次被RR反射的时候,RR会把本地Cluster_ ID添加到Cluster_ List 的前面。如果没Cluster_List属性,RR就创建一个。当RR接收到一条更新路由时,RR会检查Cluster_List。如果Cluster_ List 中已经有本地Cluster_ ID,丢弃该路由:如果没有本地Cluster_ID,将其加入Cluster_ List,然后反射该路由。

一、集群内防止环路:
在这里插入图片描述
场景描述:一个集群中部署两个RR (两个RR使用相同的Cluster__ID), 每个RR和集群中每个客户建立iBGP邻居关系。一条路由从Client 1 发送给RRI,RR1 将该路由反射给RR2 (RR2可以不是RRI的客户),RR2继续反射该路由给其客户Client 1, 路由回到始发路由器,Client 1如果使用该路由,则环路出现。

使用originator_ID来解决,解决方式如下:

  1. Client 1将路由传递给RR 1。
  2. RR 1将为该路由添加Originator_ID属性,该属性为始发者的Router_ID (Client 1)。
  3. 该路由反射给RR2后,再继续由RR2反射给Client 1。反射过程中Originator_ ID属性不变化。
  4. Client 1收到带有Originator_ ID的路由,将Originator_ ID属性值和本地的Router_ ID 进行比较,如果一致,说明Client 1收到的这条路由是其通告出去的路由,路由形成了环路,Client 1拒绝接收该路由以避免环路。

说明:
上述场景并不会发生,原因是由于另外一个BGP属性Cluster_List在RR 1反射Client 1的路由给RR2时,由于RR2和RR1具有相同的Cluster_ID,RR2根本不会接收从相同Cluster_ ID的RR反射过来的路由(同集群的RR间不互相接收对方路由),所以,RR2 也不会反射路由回Client 1。

二、集群间防止环路:
在这里插入图片描述

场景描述:如图所示,RR 1/RR 2/RR3是三个反射集群中的路由反射器,假设RR 1/RR 2/RR3中,任两个RR都是另一个RR的客户,并部署全互联的iBGP邻居关系。来自Client 1-1的路由通告给RR 1,若RR 1反射给RR 2,RR 2再反射给RR3,接着RR3又重新将该路由发送回RR1,一旦RR 1接收并使用该路由,则环路形成。

使用Cluster_ List来解决,解决方式如下:

  1. Client 1将路由传递给RR 1。RR 1接收到路由,检查Cluster_ List中是否有自己的Cluster_ ID,如果没有则添加进去,有则丢弃掉,并且反射给它的客户机。
  2. RR2是Cluster 1的客户机,RR 2接收路由后,检查Cluster_ List 中是否有自己的Cluster_ ID,如果有则丢弃该路由,没有则添加自己的Cluster_ ID, 并继续反射给它的客户机。
  3. RR 3也是Cluster 2的客户机,RR 3收到路由并检查Cluster_ List中是否有自己的Cluster_ ID,如果有则丢弃掉该路由,没有则添加,并再次反射给它的客户机。
  4. RR 1从RR 3收到该路由,检查Cluster_ List, 发现在该列表中已经有了自己的Cluster_ ID,该路由将直接被丢弃掉,避免路由环路。

注意:
Cluster_ List和Originator_ID这两个属性仅存在于当RR将从iBGP邻居收到的路由向另一个iBGP邻居通告时(反 射行为),用于防止环路而添加的仅在AS内起作用的属性,这两个属性并不会出现在AS外。

路由反射器运行场景:

一、备份RR:
在这里插入图片描述
备份RR主要是为了解决单点故障,增加了网络环境的冗余性:

  1. VRP需要使用命令reflector cluster-id给所有位于同一个集群内的路由反射器配置相同的Cluster_ID。
  2. 在冗余的环境里,客户机会收到不同反射器发来的到达同一目的地的多条路由,这时客户机应用BGP选择路由的策略来选择最佳路由。
  3. Cluster_List的应用保证了同一AS内的不同RR之间不出现路由循环。
  4. 备份RR之间建立普通IBGP邻居关系。

拓扑描述

  1. 当客户机Client1从外部对等体接收到一条更新路由(10.0.0.0/24)后,它通过IBGP向RR1和RR2通告这条路由。
  2. RR1接收到该更新路由后,它向其他的客户机(Client2、Client3)和非客户机(RR2)反射,同时将本地Cluster_ID添加到Cluster_List前面。
  3. RR2接收到该反射路由后,检查Cluster_List,发现自己的Cluster_ID已经包含在Cluster_List中。因此,它丢弃该更新路由,不再向自己的客户机反射。

二、同级反射器:
在这里插入图片描述
一个骨干网被分成多个反射集群,每个RR将其它的RR配置成非客户机,各RR之间建立全连接。每个客户机只与所在集群的RR建立IBGP连接。这样该自治系统内的所有BGP路由器都会收到反射路由信息。例如RR2收到了其客户机发送的路由条目,将客户机的条目反射到非客户机RR1和RR3上,然后传递到对应的集群中,RR1和RR3同理,当RR2接收到了从RR1和RR3反射回来的带有Cluster2标记的路由条目后就会将其丢弃,防止环路的产生。

三、分级反射器:
在这里插入图片描述
Cluster1中部署了一个一级RR(RR-1),Cluster2和Cluster3中的RR(RR-2和RR-3)作为RR-1的客户端。例如当Client1的报文发送给RR2,RR2会发送给自己的非客户机RR1,RR1会将客户机RR2发送的路由发送给自己的客户机RR3,RR3会将非客户机的路由发送到自己的客户机上去,Cluster2和Cluster3上的最底层的客户机就会互相学习到对方的路由条目了。当然Cluster值也会防止其中产生的环路。

实验:

在这里插入图片描述
如上图,R2、R3、R4任何一台作为RR都可以,本例我们用R3作为RR。R3的关键配置如下:(如果在R2上配置,则R3和R4作为其客户机,之间建立IBGP邻居关系)

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内唯一的ClusterID作为标识。

改变路由属性:

使能路由反射器通过出口策略修改路由的路径属性,可以改变BGP的选路结果。

背景信息:路由反射器上不能通过出口策略修改路由路径属性,因为这样配置可能会导致路由循环。所以默认情况下,禁止路由反射器通过出口策略修改路由路径属性。但是如果需要对网络流量进行重新规划,可以使能路由反射器通过出口策略修改路由的路径属性。

配置:

在这里插入图片描述

联盟与路由反射器的比较:

在这里插入图片描述

当然,在某些场景下,联盟和路由反射器同时使用将更加事半功倍。一个简单的例子:
在这里插入图片描述
在每个子AS内做路由反射,子AS之间划分为建立EBGP邻居关系,方便又快捷。

整理资料来源:华为Hedex文档、HCIE路由交换学习指南

猜你喜欢

转载自blog.csdn.net/tushanpeipei/article/details/112788723