BGP路由协议配置详解
一、BGP路由协议配置
BGP(Border Gateway Protocol,边界网关协议)是一种实现AS(自治系统)之间路由的距离矢量性动态路由协议。它不同于RIP、OSPF和IS-IS协议,它们均是用于解决一个AS内部网络路由的IGP(内部网关协议),而BGP则是用于解决不同AS间网络路由的EGP(Exterior Gateway Protocol,外部网关协议)。
为方便管理规模不断扩大的网络,网络被分成了不同的自治系统。1982年,EGP被用于在AS之间动态交换路由信息。但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,所以很快就无法满足网络管理的要求。
BGP是用于取代最初的EGP而设计的另一种外部网关协议。与最初的EGP不同, BGP能够进行路由优选、避免路由环路、更高效地传递路由和维护大量的路由。
本示例的基本拓扑结构如下图所示:

需要在所有Router间运行BGP协议(如果没有在系统视图下全局配置路由器ID的话,则需要专门在BGP视图下为设备配置由BGP路由使用的路由器ID),其中RouterA、RouterB之间建立EBGP连接,RouterB、RouterC和RouterD之间建立IBGP全连接。
1. 基本配置思路分析
本示例的要求很简单,仅需要在各路由器上启动BGP进程,然后根据要求在各路由器上配置EBGP或IBGP对等体,引入必要的路由即可。
2. 具体配置步骤
① 配置各路由器接口的 IP 地址。下面仅以 RouterA 上的接口为例进行介绍,其他路由器各接口的IP地址的配置方法一样,略。
<RouterA> system-view
[RouterA] interface gigabitethernet 1/0/0
[RouterA-GigabitEthernet1/0/0] ip address 8.1.1.1 8
AI助手
② 配置 RouterB、RouterC 和 RouterD 之间的 IBGP 连接。注意,每个对等体连接均需要在双方设备上分别配置,且 IBGP 对等体中,双方都处于同一个 AS 中。
因为本示例没有配置Loopback接口,也没有在系统视图下全局配置路由器ID,所以需要在BGP视图下手动配置各路由器ID。为了便于区分,RouterB、RouterC和RouterD的路由器ID分别设为2.2.2.2、3.3.3.3和4.4.4.4。此处,IBGP连接的源接口和源IP地址均缺省采用设备的物理接口和物理接口IP地址。
RouterB上的配置如下:
[RouterB] bgp 65009
[RouterB-bgp] router-id 2.2.2.2
[RouterB-bgp] peer 9.1.1.2 as-number 65009
[RouterB-bgp] peer 9.1.3.2 as-number 65009
AI助手
RouterC上的配置如下:
[RouterC] bgp 65009
[RouterC-bgp] router-id 3.3.3.3
[RouterC-bgp] peer 9.1.3.1 as-number 65009
[RouterC-bgp] peer 9.1.2.2 as-number 65009
AI助手
RouterD上的配置如下:
[RouterD] bgp 65009
[RouterD-bgp] router-id 4.4.4.4
[RouterD-bgp] peer 9.1.1.1 as-number 65009
[RouterD-bgp] peer 9.1.2.1 as-number 65009
AI助手
③ 配置RouterA与RouterB 之间的EBGP 连接,也需要在双方分别配置,此处也采用缺省的物理接口和物理接口IP地址作为EBGP连接源接口和源IP地址。RouterA的路由器ID设为1.1.1.1。
RouterA上的配置如下:
[RouterA] bgp 65008
[RouterA-bgp] router-id 1.1.1.1
[RouterA-bgp] peer 200.1.1.1 as-number 65009
AI助手
RouterB上的配置如下:
[RouterB-bgp] peer 200.1.1.2 as-number 65008
AI助手
配置好BGP 对等体后,可通过display bgp peer命令查看各设备上的BGP对等体的连接状态。下面是同时有IBGP连接和EBGP连接的RouterB上的输出结果,从中可以看出,RouterB到其他路由器的BGP连接均已建立。
[RouterB] display bgp peer
BGP local router ID : 2.2.2.2
Local AS number : 65009
Total number of peers : 3 Peers in established state : 3
Peer V AS MsgRcvd MsgSent OutQ Up/Down State PrefRcv
9.1.1.2 4 65009 49 62 0 00:44:58Established 0
9.1.3.2 4 65009 56 56 0 00:40:54Established 0
200.1.1.2 4 65008 49 65 0 00:44:03Established 1
AI助手
④ 配置RouterA发布与EBGP 对等体之间的非直连路由8.0.0.0/8。注意,这里要在对应的地址视图下进行配置,因为如果是在BGP视图下发布,将在多种地址族下生效。
[RouterA-bgp] ipv4-family unicast
[RouterA-bgp-af-ipv4] network 8.0.0.0 255.0.0.0
AI助手
此时可通过display bgp routing-table命令查看各路由器上的BGP 路由表信息,可发现它们均已有RouterA发表的这条8.0.0.0/8路由,其中前面带*的路由表示有效路由。
下面分别是 RouterA、RouterB 和 RouterC 上的输出信息(RouterD 的路由信息与RouterC 上的一样),从中可以看出,RouterA 和 RouterB 上的该路由都是有效的,而RouterC虽然学习到了AS65008中的8.0.0.0/8路由,但因为下一跳200.1.1.2不可达(因为目前还没有BGP路由到达),所以也不是有效路由。
[RouterA] display bgp routing-table
BGP Local router ID is 1.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 1
Network NextHop MED LocPrf PrefValPath/Ogn
*> 8.0.0.0 0.0.0.0 0 0 i
[RouterB] display bgp routing-table
BGP Local router ID is 2.2.2.2
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed,S -Stale
Origin : i - IGP, e -EGP, ? - incomplete
Total Number of Routes: 1
Network NextHop MED LocPrf PrefValPath/Ogn
*> 8.0.0.0 200.1.1.2 0 0 65008i
[RouterC] display bgp routing-table
BGP Local router ID is 3.3.3.3
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 1
Network NextHop MED LocPrf PrefValPath/Ogn
i 8.0.0.0 200.1.1.2 0 100 0 65008i
AI助手
从以上路由表信息可以看到,RouterA 上的 8.0.0.0/8 路由的下一跳为0.0.0.0,因为这条路由是本地设备上通告的,没有经过下一跳,而 RouterB 和 RouterC上的8.0.0.0/8路由的下一跳均为200.1.1.2,那是因为在EBGP对等体之间的EBGP路由发布时,下一跳将为发送路由器的出接口IP地址,在IBGP对等体之间的EBGP路由发布时,下一跳不变。而 IBGP 对等体之间进行 IBGP 路由发布时只能进行单跳通告,收到IBGP路由的设备不再通告给它自己的对等体。
在路由表中最后一列的“Path/Ogn”用来表示路由的 AS 路径和路由源类型,因为8.0.0.0/8路由是通过network命令通告的,所以显示为i,代表IGP类型。
⑤ 为了解决RouterC 和RouterD可以到达8.0.0.0/8 路由的下一跳200.1.1.2,只须在它们共同连接的RouterB上使BGP协议引入直连路由即可。
配置如下:
[RouterB-bgp] ipv4-family unicast
[RouterB-bgp-af-ipv4] import-route direct
AI助手
此时可以看到,在RouterA的BGP路由表中除了有原来自己通告的8.0.0.0/8路由表项外,还有RouterB引入的三条直连路由,具体如下所示(参见输出信息中的粗体字部分),其中带>的表示到达对应网段的优选路由。
[RouterA] display bgp routing-table
BGP Local router ID is 1.1.1.1
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 4
Network NextHop MED LocPrf PrefValPath/Ogn
*> 8.0.0.0 0.0.0.0 0 0 i
*> 9.1.1.0/24 200.1.1.1 0 0 65009?
*> 9.1.3.0/24 200.1.1.1 0 0 65009?
200.1.1.0 200.1.1.1 0 0 65009?
AI助手
在RouterC的BGP路由表中也可见到RouterB所引入的三条直连路由,另外,原来的8.0.0.0/8路由变为有效、可达到了(前面有一个*号),具体如下所示。
[RouterC] display bgp routing-table
BGP Local router ID is 3.3.3.3
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 4
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 8.0.0.0 200.1.1.2 0 100 0 65008i
*>i 9.1.1.0/24 9.1.3.1 0 100 0 ?
i 9.1.3.0/24 9.1.3.1 0 100 0 ?
*>i 200.1.1.0 9.1.3.1 0 100 0 ?
AI助手
二、BGP路由配置实战
1、BGP初探
ISPA和ISPB通过一条高速链路连接在一起,两个ISP想把各自的路由通告给对方?

方案:
先于域内运行OSPF,则R1和R2可以知晓各自域内的所有路由,再于R1和R2相连的接口上运行RIP协议,将OSPF路由引入RIP中,这样R1和R2就可以通过RIP协议交换各自的域内路由。在RIP协议交换路由完毕后,再将RIP路由引入回OSPF中,这样ISPA和ISPB就可以互相了解对方的路由了。
方案缺点:
IGP在这个场景下有天然的缺陷,
1)ISPA和ISPB的边界路由设备必须有一个同步的过程,也就是说当R1和R2在建立邻居的时候,需要把自己的整个路由表传输给对方。而传统的RIP协议是使用UDP作为自己的传输协议的,这个协议的最大缺点就是不可靠,不适合传输大量的数据。
2)缺省情况下,RIP协议的路由更新报文的发送间隔为30秒,这样如果ISPA和ISPB的路由表非常大(达到100000条),30秒得时间间隔尚且不够完成路由的通告,这样整个高速链路就完全为RIP通告服务,而不能转发其他数据了。
那如何解决这个问题呢?
首先,路由传递初始,自己毫无防备,导致一些路由数据的丢失,造成这个问题的主要原因是自己的RIP使用的内功基础是UDP,UDP的特点在于敌不动我不动,不去预先建立连接。那如果采用另一内功TCP,TCP的特点就在于面向连接,这样我就有充分的防备,路由的初始同步问题就解决了。
其次,由于RIP每隔30秒就会同步一次路由表,在之前路由条数相对比较少的情况下,自己上尚可应付,现在面对规模如此巨大的路由表,难免不可支撑。这个问题也好解决,那就取消每隔30秒全量同步路由的机制,改为增量通告规则:如果路由没有变化,则不发任何通告;如果是路由增加,则通告给对方增加的路由;如果是路由删除,则通告给对方删除的路由;如果是路由修改,则首先通告一个路由删除,再通告一个路由增加,而这就是BGP协议的原理。
当我们把 RIP 的传输层协议改为 TCP 之后,RIP 使用的发现和维护邻居的机制也应该改变,以往 RIP 协议使用 HELLO 报文建立邻居的方法也不可取了。这里给大家留一个问题,当传输层协议改成 TCP 之后,我们发现和维护邻居的机制应该设计成怎样呢?
1)TCP面向连接,基于TCP的协议必然有一个先建立连接的过程。要先建立连接,两端的设备就必须先互相知道对方的IP地址,并且路由可达。那么是采用静态配置的方式,还是动态建立连接的方式呢?BGP采用的是静态配置的方式,只要双方指定的地址路由可达,就可以建立连接。
这样做有以下好处:
- 可以与对端设备用任何IP地址建立邻居,而不限于某个固定接口的IP。这样,我们就可以采用环回地址而非直连接口地址建立BGP邻居,两台设备之间如果主链路中断了,只要有备份链路存在,就可以把流量切换到备份链路上,保持邻居不断,增加了BGP连接的稳定性。
- 可以跨越多台设备建立邻居。由于是静态配置的方式,不一定只有直连设备才能建立BGP邻居,只要双方指定的地址路由可达(通过IGP或者静态路由),就可以建立邻居,这在AS内部建立IBGP连接时,就不用所有设备之间都建立IBGP连接。
2)知道对方IP地址后,BGP会通过发送open报文来进行邻居的建立。如果连接不能建立,说明对端设备状态不正常,于是会等待一段时间再进行连接的建立,这个过程一直重复,直到建立连接
3)连接建立后,就可以进行路由表的同步了,BGP通过发送update报文进行路由表的同步。
4)路由表同步完成后,并不是马上拆除这个连接,因为随时有可能会有路由的更新或者删除,建立TCP连接是一个非常耗费资源的过程,所以BGP通过定期发送keepalive报文进行TCP连接的维持,这样就可以不用重新建立连接,立刻就可以进行路由更新。
5)如果经过一段时间(一般是3个keepalive报文发送周期)还没有收到对方的keepalive报文时,我们就认为对方出现了问题,于是可以拆除该TCP连接,并且把从对方收到的路由全部删除。
2、BGP应用组网案例
如下图,有3个AS,AS之间运行BGP协议。 AS65008域内运行OSPF协议。R1和R5上只运行BGP协议,R2和R4上运行OSPF和BGP协议,R3上只运行OSPF协议。

这里先解释下EBGP和IBGP:
EBGP:运行于AS之间两台设备的BGP关系。如图中R1和R2、R4和R5。
IBGP:运行于AS内部两台设备的BGP关系。如图中R2和R4。
AS内部不是有IGP么,为什么还要建立IBGP关系?
这是因为如果R2和R4之间不建立BGP关系,那么如果R1要把路由传递给R5,经过AS65008时,就只能把BGP路由引入到IGP中,通过IGP进行传递。而把数以10万计的BGP路由引入到IGP中的后果是灾难性的。所以上图中,R2和R4之间建立了IBGP的关系。值得一提的是,如上文所提及,由于BGP是通过静态配置的方式建立TCP连接,所以并非只能在两台直连的设备上建立BGP关系,如上图,R2和R4间通过OSPF路由可达,可以建立IBGP关系。
为什么控制面路由已经传递成功,但是数据包却无法发过来呢?
这里,我们对路由的传递过程和数据包的传递过程分别进行分析。
路由的传递过程:

R1—R2:由于两台设备直连,并且建立EBGP关系,R1可以直接发送update报文至R2。
R2—R4:两台路由非直连,但是两台路由建立了IBGP关系,R2将update报文发送给R4。即该update报文的目的IP是R4,于是R2查询自己的路由表,由于域内运行了OSPF协议,通过OSPF,R2查询到去R4的下一跳是R3,于是将该update报文发给R3,R3收到该报文后,虽然没有运行BGP协议,但是根据报文的目的IP,将该update报文发送给R4。
R4—R5:同样,两台设备直连,并且建立EBGP关系,R4可以直接发送update报文至R5。
这样,路由的传递就完成了。
数据包的传递过程:

R5—R4:R5发送的数据包,源IP是R5,目的IP是R1,于是R5查询路由表,因为从R4收到一条R1的路由,该路由的下一跳标识为R4。于是将数据包发送给R4。
R4—R2:当R4收到从R5发过来的数据包时,该数据包的源IP是R5,目的IP是R1。于是,R4查询路由表,发现去往R1的路由下一跳是R2(我们假定R2上配置了peer next-hop-local命令),由于下一跳非直连,于是R4查询去R2的下一跳。
由于域内运行了OSPF,R4发现,去R2的下一跳是R3,于是将数据包发给了R3。当R3收到该数据包时,由于数据包的目的IP是R1的IP,但是R3并没有运行BGP,所以R3上没有R1的路由。于是R3将该数据包丢弃。
这就是经常说到的数据层面的“路由黑洞”。
解决路由黑洞的几个方法:
- 根据BGP同步机制将BGP路由引入到IGP中。(S系列交换机缺省不启用BGP同步机制,但可以通过命令synchronization命令启用),这个方案的弊端上文已经说明。
- 物理全连接:以上图为例,如果AS65008内三台设备均通过物理线路连接起来,则R4可以直接将数据包发送给R2,而不需要通过R3转发。这个方案的弊端在于物理线路的铺设非常麻烦。
- 逻辑全连接:已上图为例,如果AS65008内三台设备均启用BGP进程,并且两两建立IBGP连接,则R3上也有R1的路由。可以成功转发数据。这个方案的弊端在于如果设备数量非常多,大量IBGP的连接难于管理。
当年这创立BGP的时候,就早已料想到这种情况,所以BGP同步学习自IBGP邻居的路由在进入IGP路由表或宣告给BGP邻居之前,必须首先通过IGP来知晓该路由。
于是规定了这条心法,在S67收到S97发来的路由时,发现OSPF路由表里并没有这条路由,就不会将该路由发送给S57。反之,如果你将该路由引入到OSPF路由表中,那么在数据包从S57发给S27时,S27也能通过OSPF将数据包转发出去。
虽然可以解决路由黑洞的问题,但却必须将BGP路由引入到IGP中,不免非常不切实际。于是BGP改用“物理全连接”和“逻辑全连接”来解决这个问题。
虽然管理麻烦,但是相比BGP同步和物理全连接,还是方便不少。到后面出现了MPLS,完美的解决了包括路由黑洞在内的各种问题。
3、IBGP连接数量过多解决方案
1. 联盟
逻辑全连接的方案弊端在于数量众多的IBGP连接难于管理,有什么办法可以缓解这个问题呢?
如下图所示:

如果采用逻辑全连接的方式,需要建立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的一些关键配置:
#
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 /这个配置并不生效,详细会在下文提及。
#
AI助手
这样,整个AS200内,只需要建立一个IBGP连接和一个EBGP连接,就可以实现路由的传递和数据包的转发。
需要注意的是:联盟AS内仍然需要保证IGP的连通性,才能保证数据包的正确转发。
在联盟内部应遵守以下规则:
- 联盟外部路由的NEXT-HOP在整个联盟中都是被保留的。
- 被宣告到联盟之内的路由的MED属性在整个联盟中都被保留。
- 路由的LOCAL_PREF属性在整个联盟中都被保留,而不仅仅是在为它们赋值的成员AS之内。
- 在联盟内部需要将成员AS的AS号加入到AS_PATH列表中,但这些AS号不能被宣告到联盟之外。在默认情况下,成员AS号被列在AS_PATH中作为AS_PATH属性类型4,即AS_CONFED_SEQUENCE。如果在联盟中使用了手动聚合命令(aggregate)并配置了关键字as_set,那么位于聚合点之后的成员AS号将被列在AS_PATH中作为AS_PATH属性类型3,即AS_CONFED_SET.
- AS_PATH中的联盟AS号用于实现环路避免功能,但是在联盟内部进行BGP路由选路过程中,选择最短AS_PATH时,不考虑这些联盟AS号。
上述规则的本质原因是整个联盟都被外界视为一个自治系统。对于规则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在仅仅在外部路由在联盟内部传递的情况下是不生效的。
2. 路由反射器
下面是一个路由反射器的示例:

如图,左边组网内有5台设备,如果采用IBGP全连接方式,将会有众多连接需要管理,非常麻烦。我们说过,IBGP有一个防环机制,任何从IBGP收到的路由,都不会发给其IBGP对等体,这是为何我们要建立逻辑全连接的原罪。
聪明的人们想到,能不能有条件的打破这个规则呢?
我们发现,对于左图,如果我们只允许任何一台设备转发从IBGP对等体收到的路由,都是不会产生路由环路的。于是,我们指定其中一台设备可以转发从IBGP对等体收到的路由,则其他设备只需要和该设备建立IBGP连接,就可以保证路由能够传递到所有的设备上。这就是路由反射器的思想。
根据右图,我们先介绍下路由反射器中的一些概念:
- 路由反射器RR(Route Reflector):允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。
- 客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
- 非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部所有非客户机与所有RR之间仍然必须建立全连接关系。
- 始发者(Originator):在AS内部始发路由的设备。Originator_ID属性用于防止集群内产生路由环路。
- 集群(Cluster):路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。
RR向IBGP邻居发布路由规则如下:
- 从非客户机学到的路由,发布给所有客户机。
- 从客户机学到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
- 从EBGP对等体学到的路由,发布给所有的非客户机和客户机。
我们根据交换机的难题来看下路由反射器的配置:

如上图,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
#
AI助手
我们在R1上发布10.1.4.0/24这条路由,查看R4的路由表,发现R4已经收到这条路由,在R4上查看这条路由的详细信息:

这条路由的NEXT-HOP为10.0.23.2:
这条路由的Cluster_list属性中,已经记录了0.0.0.1。集群使用AS内唯一的ClusterID作为标识。为了防止集群间产生路由环路,路由反射器使用Cluster_List属性,记录路由经过的所有集群的Cluster ID。
- 一条路由第一次被RR反射的时候,RR会把本地Cluster ID添加到Cluster List的前面。如果没有Cluster_List属性,RR就创建一个。
- 当RR接收到一条更新路由时,RR会检查Cluster List。如果Cluster List中已经有本地Cluster ID,丢弃该路由;如果没有本地Cluster ID,将其加入ClusterList,然后反射该更新路由。
当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,如果相同,则丢弃该路由。这样就防止了在集群内部的路由环路。
3. 联盟和路由反射器比较
联盟和路由反射器都是在大规模自治系统中减少IBGP对等体数量的有效方法,和联盟相比,路由发射器有以下两个好处:
1) 联盟中的所有路由器都必须理解和支持联盟机制,而路由反射方案只需要路由反射器了解路由反射机制即可,客户路由器和RR之间只建立不同的IBGP连接。
2)无论从所需的配置命令还是从拓扑结构的设计上说,路由反射器的实现都更加的简单。
如上面所述就是一个典型的例子,通过路由反射器,只需要在R3上增加一条配置命令,即可解决问题。但是如果希望用各种EBGP机制来管理大规模AS,那么联邦将是一个更优的解决方案。
当然,在某些场景下,联盟和路由反射器同时使用将更加事半功倍。
一个简单的例子:

4、AS_PATH
拓扑图如下:

路由环路是每一个路由协议必须考虑的问题,而BGP是距离矢量协议,其防环机制是什么呢?
1. BGP的两种防环机制
1)EBGP的路由环路
首先我们来看一下EBGP的路由环路是怎么形成的,如上图所示:三个AS通过3台设备两两建立EBGP进行连接。假设在AS100中有一条路由192.168.16.0/24,S97把该路由通告给了交换机,交换机又通告给了S77,S77又重新通告给了S97。
这时候如果由于某种原因,AS100中192.168.16.0/24这条路由消失了,而与此同时,S97又从S77那里学习到了192.168.16.0/24这条路由,路由环路就产生了。这时,S97上,192.168.16.0/24这条路由的下一跳是S77;S77上192.168.16.0/24这条路由的下一跳是交换机;而交换机上,192.168.16.0/24这条路由的下一跳是S97。
那如何防止这种现象的发生呢?我们可以像一下,这种情况发生的根本原因,其实就是192.168.16.0/24这条路由的起源和经过的AS是不明确的。如果我们给192.168.16.0/24这条路由在传递时附加一些数值,这些数值反应了这条路由经过的每一个AS,这样就不会有路由环路的发生了。
例如:

在S97将192.168.16.0/24这条路由发给交换机的时候,给这条路由附加一个数值100,代表这条路由是从AS100中发出,交换机在将这条路由发给S77时,在100后面在加上一个数值200,代表这条路由又经过了AS200。
最后,S77将这条路由发送给S97时,再增加一个数值300。这样当S97接收到这条路由时,检查一下附加在这条路由的数值,发现含有数值100,则代表这条路由曾经经过自己这里,则不接收该路由。这样,EBGP的路由环路问题就解决了。
2)IBGP的路由环路
IBGP路由环路产生的原因和EBGP类似,但是由于IBGP是在AS内部建立的BGP关系,所以无法通过记录路由经过的AS号来进行防环。对于IBGP,协议采用了类似RIP的水平分割的机制,我们称之为IBGP的水平分割,其内容为:从IBGP对等体接收到的路由不会通告给其他的IBGP邻居。

如图,R1、R2、R3、R4之间建立IBGP连接(R1和R4未建立IBGP关系),R1将192.168.16.0/24这条路由发给R2和R4,R2和R4不会将这条路由再发给R3,于是就防止了路由环路。
这种情况下,R3就完全接收不到R1传过来的路由。所以必须在4台路由器之间建立IBGP的全连接的关系,R3才能从R1处直接获取到路由。
我们把添加在BGP路由中,为了解决某些问题的数据称为属性。如上文解决EBGP环路问题所引入的数值,就是我们目前第一次引入的属性的概念,我们称之为AS_PATH属性。在BGP中,属性是一个非常重要的概念,因为BGP相较IGP非常大的一个优势就是可以在路由中携带丰富的属性,这些属性可以帮助我们对路由进行控制。
2. AS_PATH路由选路和路由过滤典型应用

要求的是S67之间的交流要经过S97,而我和S57之间的交流要经过S127。但是现在有了AS_PATH属性,这个问题就简单了,只需要调整一下S97和S127发给我路由所携带的AS_PATH属性,就解决了。
拓扑图精简如下:

现要求R4访问1.1.1.0/24网段必须通过R2,访问2.2.2.0/24网段必须通过R3。通过AS_PATH属性我们可以很轻松的解决这个问题。R4会通过R2和R3分别获得1.1.1.0/24和2.2.2.0/24这两条路由,下一跳选择R2还是R3我们可以通过AS_PATH来进行控制。BGP里规定, AS_PATH属性较短的路由,将会被优选。那么我们让R3把1.1.1.0/24这条路由发给R4时,携带的AS_PATH属性变长,R4优选R2发来的1.1.1.0/24的路由进行转发(因为R2发来的1.1.1.0/24路由的AS_PATH属性较短),则R4访问1.1.1.0/24网段的流量就会通过R2进行转发。访问2.2.2.0/24同理。
下面我们看一下具体配置,这里的关键配置在R2和R3上。
R2的关键配置:
bgp 1
peer 10.1.1.1 as-number 2
peer 10.3.1.2 as-number 1
#
ipv4-family unicast
undo synchronization /这条是缺省的。
peer 10.1.1.1 enable
peer 10.3.1.2 enable
peer 10.3.1.2 route-policy loop1 export /这里对出方向使用路由策略。
peer 10.3.1.2 next-hop-local /注意这条必配,设备向IBGP对等体发送路由时缺省
不改变路由的下一跳,配了这条之后,会将下一跳改为自己。如果不配,发到R4上的路由下一
跳为R1的接口地址,由于R4上没有到R1的路由,所以该路由的下一跳不可达,即路由不生效。
#
route-policy loop1 permit node 5 /配置路由策略,在匹配到ip-prefix loop1的
情况下给该路由添加AS_PATH属性6,7,8
if-match ip-prefix loop1
apply as-path 6 7 8 additive
#
route-policy loop1 permit node 10 /注意这条是必须的配置,如果不配置,则除了匹
配2.2.2.0/24的路由,其他路由均被过滤,无法发送给BGP对等体。
#
ip ip-prefix loop1 index 10 permit 2.2.2.0 24
AI助手
R3的关键配置:
bgp 1
peer 10.2.1.1 as-number 2
peer 10.4.1.2 as-number 1
#
ipv4-family unicast
undo synchronization /这条是缺省的。
peer 10.2.1.1 enable
peer 10.4.1.2 enable
peer 10.4.1.2 route-policy loop0 export /这里对出方向使用路由策略。
peer 10.4.1.2 next-hop-local /注意这条必配,设备向IBGP对等体发送路由时缺省
不改变路由的下一跳,配了这条之后,会将下一跳改为自己。如果不配,发到R4上的路由下一
跳为R1的接口地址,由于R4上没有到R1的路由,所以该路由的下一跳不可达,即路由不生效。
#
route-policy loop0 permit node 5 /配置路由策略,在匹配到ip-prefix loop0的
情况下给该路由添加AS_PATH属性6,7,8
if-match ip-prefix loop0
apply as-path 6 7 8 additive
#
route-policy loop0 permit node 10 /注意这条是必须的配置,如果不配置,则除了匹
配1.1.1.0/24的路由,其他路由均被过滤,无法发送给BGP对等体。
#
ip ip-prefix loop0 index 10 permit 1.1.1.0 24 /配置ip-prefix
AI助手
这里我们通过路由策略,在R2上配置将2.2.2.0/24的路由发给R4时,添加AS_PATH属性6,7,8;在R3上配置将1.1.1.0/24路由发给R4时,添加AS_PATH属性6,7,8。
我们查看R4的BGP路由表:

可以看到,R4上1.1.1.0/24优选的路由下一跳为R2,2.2.2.0/24优选的路由下一跳为R3。均为AS_PATH较短的。
5、AS号记录
BGP联盟中,AS_PATH属性有以下2个规则:
1)在联盟内部需要将成员AS的AS号加入到AS_PATH列表中,但这些AS号不能被宣告到联盟之外。在默认情况下,成员AS号被列在AS_PATH中作为AS_PATH属性类型4,即AS_CONFED_SEQUENCE。
如果在联盟中使用了手动聚合命令(aggregate)并配置了关键字as_set,那么位于聚合点之后的成员AS号将被列在AS_PATH中作为AS_PATH属性类型3,即AS_CONFED_SET。
2)AS_PATH中的联盟AS号用于实现环路避免功能,但是在联盟内部进行BGP路由选路过程中,选择最短AS_PATH时,不考虑这些联盟AS号。联盟内部AS号不能宣告到联盟之外,并且在选路中也不考虑这些AS号的长短,那么这些AS号应该如何记录呢?
要弄清楚这个问题,我们来介绍一下4种类型的AS_PATH属性:
- AS_SET,一个无序的AS号列表。
- AS_SEQENCE,一个有序的AS号列表。
- AS_CONFED_SET,BGP联盟中特有的AS_PATH类型,类似AS_SET,其列表中含有的AS号均属于BGP联盟中的AS号。
- AS_CONFED_SEQUENCE,BGP联盟中特有AS_PATH类型,类似AS_SEQENCE,其列表中含有的AS号均属于BGP联盟中的AS号。
小伙伴是不是已经被绕晕了?没事,我们通过一个例子来说明一下,如下图:

我们按照上图配置好BGP对等体之后,在R1上将两条Loopback接口的直连路由引入BGP,在R4上通过命令display bgp routing-table可以发现:

172.16.1.0/24和72.16.2.0/24这两条路由已经被进入BGP路由表,并发送到R4。两条路由的AS_PATH均为“3 2 1”。这里,R4知道,要到达这两个目的地,需要经过AS3、AS2再经过AS1才能到达。所以这里就是有序的AS_PATH,也就是这里的AS_PATH类型是AS_SEQENCE。
这时,我们对这个网络做一个小小的优化,我们在R3上做一个手动聚合,将172.16.1.0/24和172.16.2.0/24这两条明细路由聚合成172.16.0.0/16这条聚合路由,并且只将这条聚合路由传给R4。
在R3上配置命令:aggregate 172.16.0.0 16 detail-suppressed。这里detail-suppressed
关键字代表R3只会向R4发送聚合路由。
在R4上查看BGP路由表可以发现:

可以发现,R4上只剩下172.16.0.0/16这条聚合路由,并且其AS_PATH只剩下AS3。
这是因为配置了路由聚合后,会丢失其下的明细路由的AS_PATH属性,所以当R3将聚合路由发送给R4时,只会携带自身的AS号。
这是我们来看一种情况,假设如图所示,我们在R2和R4之间的链路上也配置了EBGP对等体,R4会将这条聚合路由再发给R2,而这时,这条聚合路由所携带的AS_PATH只有AS3。R2所在的AS2并不在AS_PATH列表中,于是R2会接收这条路由。
如我们前面所述,路由环路就产生了。EBGP本身依赖AS_PATH来进防止路由环路,但是在路由聚合的场景下,会丢失明细路由的AS_PATH,导致这种环路的产生,那么应该如何解决这个问题呢?
我们可以思考一下,其实只需要R3在发送聚合路由的时候,也带上被聚合的明细路由的AS_PATH就可以了,这些明细路由的AS_PATH只作为防止路由环路的作用。
我们在将R3上的聚合路由命令修改一下,增加一个关键字:as-set。 在R3上配置命令:aggregate 172.16.0.0 16 detail-suppressed as-set。这里as-set关键字代表,当R3发送聚合路由给R4时,会生成AS_SET类型的AS_PATH列表,这个AS_PATH会包含所有明细路由的AS号。
配置完以后,我们在R4上查看BGP路由表:

可以看到,172.16.0.0/16这条路由的AS_PATH已经包含了所有明细路由的AS_PATH。然而在这里,所有明细路由的AS_PATH属性是一个有序列表(3 2 1),所以这里虽然生成了AS_SET
类型的AS_PATH属性,但是和AS_SEQENCE没有任何区别。
为了更明确的说明一下AS_SET类型的AS_PATH,我们再增加一台路由器R5:

这里,我们增加了位于AS5中的路由器R5,并将R5上172.16.3.0/24和172.16.4.0/24两条路由注入BGP路由表,在R4上查看BGP路由表可以发现:

聚合路由的AS_PATH已经变成了“3 2 {5 1}”。这里,明细路由包含的AS_PATH中,{5 1}就是无序的AS_SET类型,而“3 2”是AS_SEQENCE类型的AS_PATH。
注意:AS_SET类型的AS_PATH在设备上都是用“{}”符号表示,并且在在BGP路由选路中,所有AS_SET类型的AS_PATH都算作长度1。.例如:“3 2 {5 1}”在选路中AS_PATH长度算做3。
下面我们再把这个例子变动一下,把AS1、AS2、AS3、AS5都作为子AS加入到BGP联盟中,联盟AS号为100。
如下图:

这次我们.在R2上进行聚合,并只将聚合路由172.16.0.0/16发送给R3。
我们在R3上查看BGP路由表:

可以看到,如我们上面所说,有序的AS_PATH是2,而无序的AS_PATH是5和1,所以我们可以看到“(2)”就是AS_CONFED_SEQUENCE类型的AS_PATH,而“[5 1]”就是AS_CONFED_SET类型的AS_PATH。一般在设备上,AS_CONFED_SEQUENCE类型的AS_PATH用符号“()”表示,而AS_CONFED_SET类型的AS_PATH用符号“[]”表示。
我们在看一下R4的BGP路由表:

可以看到,联盟子AS号是不会传到联盟之外,所以R4上,这条聚合的AS_PATH只有100。
注意:AS_CONFED_SEQUENCE类型的AS_PATH和AS_CONFED_SET类型的AS_PATH均只是为了防止路由环路而存在,在BGP选路中,不作为AS_PATH长度考虑在内。这也解释了我们上面的问题。
拓扑图如下:

此出入方向流量的路径控制,想要通过AS_PATH来控制流量路径,虽非不能,也不免非常麻烦 。
LOCAL_PRAF属性(以下简称LP)和MULTI_EXIT_DISC属性(以下简称MED)是BGP协议在控制AS出口流量路径时经常用到的两个属性。
LP属性被用于在去往同一目的地的多条路由中设置路由优先级,从名字就可以看出,LP属性只是应用于本地对等体之间,即,只能在IBGP对等体之间传递,不会应用于EBGP对等体之间。LP属性常用于AS出口出方向流量的路径控制,LP属性值越大,路由越优。
通常情况下,MED属性的作用是在去往邻居AS存在多条链路时,允许AS为入站流量传达其优先级。(一般来说,比较不同AS的MED属性没有太大意义,特殊场景除外。)从MED属性的作用可以看出,MED属性只是作用于EBGP对等体,而IBGP对等体互相通告路由时,会忽略MED属性。MED属性常用于AS出口入方向流量的路径控制,MED属性值越小,路由越优。
以下面拓扑图为参考,来说明一下两种属性的作用:

如图,要求AS1访问1.1.1.0/24网段的流量必须从R2出AS1,访问2.2.2.0/24网段的流量必须从R3出AS1。
具体实现方法是,在R2和R3上做路由策略,使R2在发送路由1.1.1.0/24进AS1时(这里就是发给R4)携带的LP大于R3在发送路由1.1.1.0/24时携带的LP值。这样R4收到两条目的地相同的路由时,会优选LP属性大的值。对于路由2.2.2.0/24同理。
R2的关键配置:
#
bgp 1
peer 10.1.1.1 as-number 2
peer 10.3.1.2 as-number 1
#
ipv4-family unicast
undo synchronization
peer 10.1.1.1 enable
peer 10.3.1.2 enable
peer 10.3.1.2 route-policy LP export /对R4出方向使用路由策略LP
peer 10.3.1.2 next-hop-local
#
route-policy LP permit node 5 /设置路由策略LP,如果匹配前缀LP,则LP置为200
if-match ip-prefix LP
apply local-preference 200
#
route-policy LP permit node 10
#
ip ip-prefix LP index 10 permit 1.1.1.0 24 /配置前缀列表LP,匹配1.1.1.0/24
#
AI助手
R3的关键配置:
#
bgp 1
peer 10.2.1.1 as-number 2
peer 10.4.1.2 as-number 1
#
ipv4-family unicast
undo synchronization
peer 10.2.1.1 enable
peer 10.4.1.2 enable
peer 10.4.1.2 route-policy LP export /对R4出方向使用路由策略LP
peer 10.4.1.2 next-hop-local
#
route-policy LP permit node 5 /设置路由策略LP,如果匹配前缀LP,则LP置为200
if-match ip-prefix LP
apply local-preference 200
#
route-policy LP permit node 10
#
ip ip-prefix LP index 10 permit 2.2.2.0 24 /配置前缀列表LP,匹配2.2.2.0/24
#
AI助手
配置完之后,我们在R4上查看BGP路由表:

可以看到,在R4上,去到1.1.1.0/24网段有两条路由,但是下一跳为R2的路由的LP属性为200,而下一跳为R3的路由的LP属性为100,所以优选R2进行转发,去到2.2.2.0/24网段的路由同理。
我们对上面的例子稍作修改,在R4上也发布两条路由3.3.3.0/24和4.4.4.0/24。
如图:

要求,所有访问3.3.3.0/24网段的流量必须从R2进入AS1,而所有访问4.4.4.0/24的流量必须从R3进入AS1。
实现方式和LP基本一致,使用路由策略,使R2在将3.3.3.0/24路由发往AS外部时(这里就是发给R1)携带的MED属性小于R3发送3.3.3.0/24路由时携带的MED属性。对于路由4.4.4.0/24同理。
R2新增配置:
#
bgp 1
#
ipv4-family unicast
peer 10.1.1.1 route-policy MED export /对R1出方向使用路由策略MED
#
route-policy MED permit node 5 /设置路由策略MED,如匹配前缀MED,则MED置为10
if-match ip-prefix MED
apply cost 10
#
route-policy MED permit node 10
#
ip ip-prefix MED index 10 permit 4.4.4.0 24 /配置前缀列表MED,匹配4.4.4.0/24
#
AI助手
R3新增配置:
bgp 1
#
ipv4-family unicast
peer 10.2.1.1 route-policy MED export /对R1出方向使用路由策略MED
#
route-policy MED permit node 5 /设置路由策略MED,如匹配前缀MED,则MED置为10
if-match ip-prefix MED
apply cost 10
#
route-policy MED permit node 10
#
ip ip-prefix MED index 10 permit 3.3.3.0 24 /配置前缀列表MED,匹配3.3.3.0/24
#
AI助手
配置完成后,查看R1的BGP路由表:

可以看到去往3.3.3.0/24目的地有两条路由,下一跳为R2的路由被优选,因为其MED值较小。4.4.4.0/24的路由同理。
6、LP属性和MED属性变化
在BGP联盟内部的EBGP和IBGP对等体互相传递路由时,LP属性和MED属性是如何变化的呢?
还记得我们说BGP联盟的规则时,有两条关于LP属性和MED属性的规则怎么说来着:
- 路由的LOCAL_PREF属性在整个联盟中都被保留,而不仅仅是在为它们赋值的成员AS之内。
- 被宣告到联盟之内的路由的MED属性在整个联盟中都被保留。
由于在外界看来,BGP联盟实际上是一个AS,所以其LP属性和MED属性在整个BGP联盟中是被保留的。

以MED属性和LP属性解决了出口流量控制的难题。
拓扑如下图所示,如何配置,使得访问AS100访问少林的流量需要从交换机这里过,访问武当的流量需要从S127这里过。

在学习BGP之前,还真是难以处理,只是目前已然今非昔比。用BGP中的LP属性,可以轻松应对。只要我和S127把收到的少林路由和武当路由标明不同的LP属性,就可以完美的解决这个问题。
S97、S77、S67、S57你们4个负责接收路由,然后全部发给我和S127,我们给路由打上不同的LP属性也可以解决这个问题。
但按照之前的LP属性的配置方法,交换机需要对每一个发过来的路由,配置前缀列表,并且配置路由策略,为符合该前缀列表的路由打上LP属性。这样如果发过来的路由数量非常大的时候,这样的配置会非常繁琐,并且容易出错。
那么小伙伴们先想一想,如何解决这个问题呢?
何为团队属性(Community)?
团队属性也是BGP路由属性的一种,利用团队属性可以将路由策略应用于一组路由。大家可以回忆一下,我们用LP、MED、AS_PATH属性来解决BGP路由的各种问题的时候,无一例外都要用到路由策略,而路由策略很多都是基于前缀来进行处理的。
当需要处理路由特别多的时候,我们的配置和维护工作量就会大幅度增加,在大型网络中,这种配置和维护的成本是难以接受的。所以我们可以对需要做同一策略的路由标识一个相同的团队属性,这样就可以基于团队属性来对路由实施策略了。
我们还是以交换机遇到的问题为例,先将场景简化一下:

这里我们要求R3发给R4的少林路由均打上LP属性值100,而发给R4的武当路由均打上LP属性值200。
如何通过通过团队属性来实现这个目的呢?
一般的做法是,我们先要求R1通过路由策略,将发给R3的少林路由打上团队属性100:1。而发给R3的武当路由打上团队属性200:1。
注意:团队属性的团体号取值有两种形式:
- 整数形式,取值范围是0~4294967295
- AA:NN形式,AA和NN的取值范围均为0~65535
我们要求R2也同样在将路由发给R3时打上团队属性。这样,我们在R3上就可以通过路由策略,将携带团队属性100:1的路由打上LP属性值100,将携带团队属性200:1的路由打上LP属性值200,这样配置和管理的工作量就小了很多,下面看一下具体配置。
R1的关键配置:
#
bgp 1
peer 11.1.1.2 as-number 100
#
ipv4-family unicast
undo synchronization
network 1.1.1.0 255.255.255.0
network 2.2.2.0 255.255.255.0
peer 11.1.1.2 enable
peer 11.1.1.2 route-policy R1 export /对R3出方向使用路由策略R3
peer 11.1.1.2 advertise-community /注意这个必配,对R3发送路由时携带团队属
性,缺省情况下,BGP不讲团队属性发送给任何对等体。
#
route-policy R1 permit node 5 /配置路由策略,所有匹配前缀列表shaolin的路由
打上团队属性100:1
if-match ip-prefix shaolin
apply community 100:1
#
route-policy R1 permit node 10 /配置路由策略,所有匹配前缀列表wudang的路由
打上团队属性200:1
if-match ip-prefix wudang
apply community 200:1
#
ip ip-prefix shaolin index 10 permit 1.1.1.0 24 /前缀列表shaolin匹配前缀
1.1.1.0/24
ip ip-prefix wudang index 10 permit 2.2.2.0 24 /前缀列表wudang匹配前缀
1.1.1.0/24
#
AI助手
R2的关键配置:
#
bgp 2
peer 12.1.1.2 as-number 100
#
ipv4-family unicast
undo synchronization
network 3.3.3.0 255.255.255.0
network 4.4.4.0 255.255.255.0
peer 12.1.1.2 enable
peer 12.1.1.2 route-policy R2 export
peer 12.1.1.2 advertise-community
#
route-policy R2 permit node 5
if-match ip-prefix shaolin
apply community 100:1
#
route-policy R2 permit node 10
if-match ip-prefix wudang
apply community 200:1
#
ip ip-prefix shaolin index 10 permit 3.3.3.0 24
ip ip-prefix wudang index 10 permit 4.4.4.0 24
#
AI助手
R3的关键配置:
#
bgp 100
peer 11.1.1.1 as-number 1
peer 12.1.1.1 as-number 2
peer 13.1.1.2 as-number 100
#
ipv4-family unicast
undo synchronization
peer 11.1.1.1 enable
peer 12.1.1.1 enable
peer 13.1.1.2 enable
peer 13.1.1.2 route-policy R3 export /对R3出方向实施路由策略R3
peer 13.1.1.2 next-hop-local /这条必配,否则R3上BGP路由不生效
#
route-policy R3 permit node 5 /配置路由策略R3,所有匹配团队属性过滤器1的路由
打上LP属性值100
if-match community-filter 1
apply local-preference 100
#
route-policy R3 permit node 10 /配置路由策略R3,所有匹配团队属性过滤器2的路
由打上LP属性值200
if-match community-filter 2
apply local-preference 200
#
ip community-filter 1 permit 100:1 /配置团队属性过滤器1,允许团体属性100:1
ip community-filter 2 permit 200:1 /配置团队属性过滤器2,允许团体属性200:1
#
AI助手
配置完成后,我们在R3上通过命令display bgp routing-table community 100:1和命令display bgp routing-table community 200:1查看团队属性100:1和200:1对应的BGP路由。

可以看到,所有发来的少林路由都被打上了团队属性100:1,而武当路由被打上了200:1。
我们在R4上查看BGP路由表:

可以看到,所有少林路由已经被打上了LP属性值100,而所有武当路由已经被打上了LP属性值200。.
除了可以为路由配置团队属性值外,还能指定路由属于一些众所周知(Well-known)的团队。
下面我们简单介绍一下几种众所周知的团队属性::
- Internet:设备收到携带该团队属性的路由可以将之发送给任何对等体,缺省情况下任何路由都属于该团体。
- No_Advertise:设备收到携带该团队属性的路由后,不向任何对等体发送该路由。
- No_Export:设备收到携带该团队属性的路由后,不向AS外(EBGP对等体)发送该路由。
- No_Export_Subconfed:设备收到携带该团队属性的路由后,只能在AS内传递,并且如果配置BGP联盟,不向其他子AS发送该路由。
下面以No_Export说明一下,其他周知团队属性类似。
假设上例中,AS1不希望AS2能够访问本AS中的少林网段和武当网段,这时就可以利用No_Export来实现。
先看一下R2的BGP路由表:

这时,R2上是有AS1的路由的。
我们在R1上修改如下配置:
#
route-policy R1 permit node 5
if-match ip-prefix shaolin
apply community 100:1 no-export
#
route-policy R1 permit node 10
if-match ip-prefix wudang
apply community 200:1 no-export
#
AI助手
这样可以使R1在发送路由时也携带No_Export团队属性,查看R2的BGP路由表:

R2上已经没有AS1的路由。
7、BGP路由简化配置
BGP路由经常数以万计,如果有大量不同但是又非常相似的团队属性需要实施同样的路由策略(比如:需要对携带团队属性“100:1、200:1、300:1、400:1、500:1…”的路由实施相同的策略),该如何简化配置呢?
参照我们前面所说,如果需要对携带团队属性“100:1、200:1、300:1、400:1、500:1…”的路由实施相同的策略,我们必须配置多条团队属性过滤器:
ip community-filter 1 permit 100:1
ip community-filter 2 permit 200:1
ip community-filter 3 permit 300:1
ip community-filter 4 permit 400:1
ip community-filter 5 permit 500:1
AI助手
这样不免非常麻烦,这时我们可以用到高级团队属性过滤器。高级团队属性过滤器作用和普通团队属性过滤器一致,不同点就在于其过滤器的编号为100~199。
高级团队属性过滤器可以使用正则表达式来制定团体,这一点在使用AA:NN格式的团队属性时非常有用。
如上面这个例子,如果我们使用高级团队属性过滤器,则只需要配置一条命令即可:
ip community-filter 101 permit .*:1
AI助手
关于正则表达式,这里不多做介绍。在使用路由策略,尤其是使用AS_PATH和团队属性时,正则表达式是一个非常有用的工具,可以极大的降低我们的配置工作量,有兴趣得小伙伴可以查找相关资料了解。
由于BGP中自动聚合限制非常多,实际效果非常不理想,所以绝大部分情况下,我们会采用手动聚合的方式。
手动聚合有两种方式:
1. 利用静态路由进行聚合
这种方式是先在路由表中为聚合地址创建静态表项,之后再利用network命令宣告该聚合地址,如下面这个例子:

如图,AS100中有192.168.1.0/24、192.168.2.0/24、192.168.3.0/24和192.168.4.0/24四个内部网络,现在要将4个内部网络的路由聚合成一条192.168.0.0/16这条路由。
R1的关键配置:
#
bgp 100
peer 11.1.1.2 as-number 200
#
ipv4-family unicast
undo synchronization
network 192.168.0.0 255.255.0.0 /将聚合路由发布到BGP中
peer 11.1.1.2 enable
#
ip route-static 192.168.0.0 255.255.0.0 NULL0 /配置一条指向NULL0的静态聚
合路由
#
AI助手
由于聚合路由本身并不是合法的终端目的地址,因而静态路由指向Null接口,该路由在R1的路由表中仅代表一条精确路由。
如果数据包的目的地址属于AS100的C类地址,那么AS100的外部路由器将撇配该聚合路由并转发给R1,到了路由器R1之后,数据包将被匹配到更精确的地址,并被转发到正确的内部下一跳路由器。如果因某种导致更精确的C类地址不在R1路由表中的话,将把该数据包转发到Null接口并予以丢弃。我们查看R2的BGP路由表:

R2的路由表中只有一条聚合路由,其他明细路由均未进入R2的路由表。
2. 通过aggregate命令手动聚合路由,并抑制明细路由
在上面这种简单的场景下,通过静态路由进行聚合的方式已经足够了,但是对于拓扑结构或者路由策略稍微复杂一些的情况,通过静态路由进行聚合的方式不建议被使用,我们可以使用aggregate命令进行手动聚合。
下面我们具体说明下aggregate命令极其参数的作用,先在上面那个简单的例子中使用aggregate命令。
R1的关键配置:
#
bgp 100
peer 11.1.1.2 as-number 200
#
ipv4-family unicast
undo synchronization
aggregate 192.168.0.0 255.255.0.0 detail-suppressed
network 192.168.1.0
network 192.168.2.0
network 192.168.3.0
network 192.168.4.0
peer 11.1.1.2 enable
#
AI助手
想要宣告由aggregate命令指定的聚合路由,必须通过重分布或者network命令使至少一个更精确的地址进入BGP路由表。这里我们查看R1和R2的BGP路由表:


可以看到,R1的BGP路由表中包含了所有精确路由,而R2的路由表中只有一条聚合路由,这是因为我们在aggregate命令中配置了detail-suppressed参数,使R1只会将聚合路由发送给R2。而R1的BGP路由表中,明细路由前面都有“s”的标志,代表这些路由已经被抑制。
3. 同时发送聚合路由和明细路由
对于像上面这种简单拓扑来说,确实不需要同时宣告聚合路由和明细路由。
我们再看一下下面这个例子:

如图,AS100多归属到AS200,AS200需要从AS100接受全部路由以设置路由策略,但AS200仅能向AS300发送聚合路由。这个场景下,AS100就需要将全部路由发送给AS200。
这里一种简单的解决方式是利用我们上一回中所说的团队属性。让AS100发送给AS200的明细路由携带NO_EXPORT团队属性。
R1的关键配置:
#
bgp 100
peer 11.1.1.2 as-number 200
#
ipv4-family unicast
undo synchronization
aggregate 192.168.0.0 255.255.0.0 /路由聚合为192.168.0.0/16,并且不抑制
明细路由
network 192.168.1.0
network 192.168.2.0
network 192.168.3.0
network 192.168.4.0
peer 11.1.1.2 enable
peer 11.1.1.2 route-policy COMMUNITY export /对R2出方向使用路由策略
COMMUNITY
peer 11.1.1.2 advertise-community /对R2发送携带团队属性的路由
#
route-policy COMMUNITY permit node 5 /配置路由策略COMMUNITY,对匹配前缀列
表AGGREGATE的路由不设置团队属性
if-match ip-prefix AGGREGATE
apply community none
#
route-policy COMMUNITY permit node 10 /未匹配上一个节点的路由,为其打上团队
属性NO_EXPORT,这样就实现了仅对明细路由打上NO_EXPORT属性
apply community no-export
#
ip ip-prefix AGGREGATE index 10 permit 192.168.0.0 16 /配置前缀列表
AGGREGATE仅匹配192.168.0.0/16
#
AI助手
我们通过命令display bgp routing-table 192.168.0.0查看R2上聚合路由的详细信息:

可以看到,该路由已被并标明是一条聚合路由,并且在AS100进行聚合,始发路由器的ROUTER ID是11.1.1.1。该路由并未携带任何团队属性。
我们再查看R5的BGP路由表:

R5上只存在聚合路由,明细路由由于携带NO_EXPORT团队属性,并未发送给R5。
4. 仅发送聚合路由和选定的明细路由
在上述场景下,通过仅发送聚合路由和选定的明细路由,我们还可以实现链路的备份和负载分担,方法如下:
- 让R1-R2的链路只宣告192.168.1.0/24和192.168.2.0/24这两条路由。
- 让R3-R4的链路只宣告192.168.3.0/24和192.168.4.0/24这两条路由
- 通过上述两条链路宣告聚合路由作为备份,再任一条链路出现故障的情况下,所有该链路上访问AS100的流量都会迅速被切换到另外一条链路上。

这里,我们需要R1和R3分别发送聚合路由和一部分明细路由,这时,我们会用到aggregate命令的另外一个参数“suppress-policy”,下面给出R1和R3的关键配置。
R1的关键配置:
#
bgp 100
peer 11.1.1.2 as-number 200
#
ipv4-family unicast
undo synchronization
aggregate 192.168.0.0 255.255.0.0 suppress-policy SUPPRESS /聚合路由
时使用抑制列表SUPPRESS,对于匹配路由策略SUPPRESS的明细路由进行抑制。
network 192.168.1.0
network 192.168.2.0
network 192.168.3.0
network 192.168.4.0
peer 11.1.1.2 enable
#
route-policy SUPPRESS permit node 5 /配置路由策略,注意这里只能配置if-match
子句,用来匹配被抑制的路由。
if-match ip-prefix SUPPRESS
#
ip ip-prefix SUPPRESS index 10 permit 192.168.3.0 24 /配置前缀列表
ip ip-prefix SUPPRESS index 20 permit 192.168.4.0 24
#
AI助手
R3的关键配置:
#
bgp 100
peer 12.1.1.2 as-number 200
#
ipv4-family unicast
undo synchronization
aggregate 192.168.0.0 255.255.0.0 suppress-policy SUPPRESS
network 192.168.1.0
network 192.168.2.0
network 192.168.3.0
network 192.168.4.0
peer 12.1.1.2 enable
#
route-policy SUPPRESS permit node 5
if-match ip-prefix SUPPRESS
#
ip ip-prefix SUPPRESS index 10 permit 192.168.1.0 24
ip ip-prefix SUPPRESS index 20 permit 192.168.2.0 24
#
AI助手
我们通过抑制特定的明细路由,实现了R1和R3只宣告聚合路由和特定的明细路由,在R5上查看BGP路由表:

可以看到,R5上聚合路由有两个下一跳,而192.168.1.0/24和192.168.2.0/24这两条路由的下一跳为R2,而192.168.3.0/24和192.168.4.0/24这两条路由的下一跳为R4。
这就实现了访问AS100不同网段的流量的负载分担,而一旦有一条链路出现故障,由于聚合路由的存在,可以将流量快速切换到另外一条链路上。
5. 仅聚合特定的明细路由
依然是这个场景下,假定我们要求R1只将192.168.1.0/24和192.168.2.0/24这两条路由进行聚合,而聚合其余的明细路由。如图:

这里,我们可以用到aggregate命令的“origin-policy”参数,下面给出R1的具体配置。
R1的关键配置:
#
bgp 100
peer 11.1.1.2 as-number 200
#
ipv4-family unicast
undo synchronization
aggregate 192.168.0.0 255.255.0.0 detail-suppressed origin-policy
ORIGIN /这里只有匹配路由策略ORIGIN的路由被聚合,其他明细路由未被聚合。并只宣告聚
合路由
network 192.168.1.0
network 192.168.2.0
network 192.168.3.0
network 192.168.4.0
peer 11.1.1.2 enable
#
route-policy ORIGIN permit node 5 /配置路由策略ORIGIN,注意这里只能配置
if-match子句,匹配前缀列表ORIGIN的路由
if-match ip-prefix ORIGIN
#
ip ip-prefix ORIGIN index 10 permit 192.168.1.0 24 /配置前缀列表
ip ip-prefix ORIGIN index 20 permit 192.168.2.0 24
#
AI助手
这样,就实现了只聚合特定的明细路由,而其余明细路由未被聚合,我们查看一下R2的BGP路由表:

可以看到,R2的BGP路由表中,只有一条聚合路由,和两条明细路由。由于192.168.1.0/24和192.168.2.0/24这两条路由已被聚合,而R1上又配置了detail-suppressed参数,所以这两条明细路由并未发送给R2,而其余明细路由由于未被聚合,所以被发送给了R2,这里还需要说明的是,只有被聚合的明细路由(192.168.1.0/24和192.168.2.0/24)均失效的情况下,聚合路由才会实效,而其余明细路由失效与否是不会影响聚合路由的。
6. 修改聚合路由的属性
还是这个场景,在R5上,聚合路由的下一跳有两个,分别是R2和R4,而我们很可能要求手动实现R5选择R4作为优选下一跳,而选择R2作为备份下一跳。MED属性可以解决这个问题。如果用MED属性,我们需要在R2和R4上部署路由策略,这里我们采用另外一种方式:在发送聚合
路由的时候,可以修改聚合路由的属性。
由于明细路由均为我们手动Network进R1的,所以路由的Origin属性均为IGP,而当两条BGP路由的Origin分别为IGP和Incomplete时,BGP会优选Origin属性为IGP的路由。所以我们可以将R1发送给R2的聚合路由属性修改为Incomplete。

这时,我们会用到了aggregate命令的另一个参数“attribute-policy”,下面给出具体配置。
R1的关键配置:
#
bgp 100
peer 11.1.1.2 as-number 200
#
ipv4-family unicast
undo synchronization
aggregate 192.168.0.0 255.255.0.0 detail-suppressed attribute-policy
ATTRIBUTE /按照路由策略ATTRIBUTE修改聚合路由属性
network 192.168.1.0
network 192.168.2.0
network 192.168.3.0
network 192.168.4.0
peer 11.1.1.2 enable
#
route-policy ATTRIBUTE permit node 5 /配置路由策略ATTRIBUTE修改属性为
incomplete
apply origin incomplete
#
AI助手
我们查看R5的BGP路由表:

可以看到,BGP优选了R4作为优选下一跳,由于R4对应的路由Ogn值为“i”代表该路由的Origin属性为IGP,而R2对应的路由的Ogn值为“?”代表该路由的Origin属性为Incomplete。
8、BGP选路结果矛盾解决方案
BGP选路是有一定的规则的。当到达统一目的地存在多条路由时,BGP依次对比下列属性来选择路由:
- 优选协议首选值(PrefVal)最高的路由。
- 优选本地优先级(LP)最高的路由。
- 优选起源于本地的路由。
- 优选携带AIGP属性的路由。
- 优选AS路径(AS_PATH)最短的路由。
- 依次优选Origin类型为IGP、EGP、Incomplete的路由。
- 优选MED值最小的路由。
- 依次优选EBGP路由、IBGP路由、LocalCross路由、RemoeCross路由。
- 优选到BGP下一跳IGP度量值(Metric)最小的路由。
- 优选Cluster_List最短的路由。
- 优选Router ID最小的设备发布的路由。
- 优选从具有最小IP地址的对等体学来的路由。
下面,我们逐条说明一下:
1. 优选协议首选值(PrefVal)最高的路由
在有些情况下,当BGP路由器存在去往同一目的地的多条路由时,BGP会有很多默认的方法来选择这些路由,但实际情况中可能需要忽略这些默认的方法并实施一定的路由策略。RFC中并没有规定如何影响单台路由器的路由优先级的方法(如LP、MED均对相应对等体发布)。
华为S系列交换机提供了一个方法,即协议首选值属性。协议首选值属性是华为的私有属性,类似Cisco IOS中的管理性权值(Administrative Weight)。该属性可以理解为路由在本台路由器中的优先级,该属性的作用范围仅限于本路由器,不会传送给任何对等体。数值越大,路由越优,缺省情况下所有路由的协议首选值均为0。
下面看一个具体例子:

R1的关键配置:
#
bgp 100
peer 12.1.1.2 as-number 200
peer 13.1.1.2 as-number 300
#
ipv4-family unicast
undo synchronization
peer 12.1.1.2 enable
peer 12.1.1.2 preferred-value 100 /设置对等体R2发来的路由PrefVal为100
peer 13.1.1.2 enable
peer 13.1.1.2 preferred-value 200 /设置对等体R3发来的路由PrefVal为200
#
AI助手
配置完成后,我们查看R1的BGP路由表,可以发现:


R1优选了R3作为去往1.1.1.0/24网段的下一跳,而下一跳为R2的路由未被优选的原因是“not preferred for PreVal”。
2. 优选本地优先级(LP)较高的路由
LP属性仅用于IBGP对等体之间,用来向对方通告某被宣告路由的优先级。当去往相同目的地的两条BGP路由,其协议首选值相同时,接下来会比较其LP属性值。
3. 优选起源于本地的路由
当协议首选值和LP属性均相同时,BGP接下来会优先选择起源于本地的路由。
BGP的路由可以分为起源于本地的路由和从对等体获取的路由,这里起源于本地的路由将优于从对等体获取的路由。
起源于本地的路由包括:自动聚合路由、手动聚合路由、network命令引入的路由和import-route命令引入的路由。
这4类路由的优选规则为:
- 优选聚合路由,其中通过aggregate命令手动聚合路由优于通过summary automatic命令生成的自动聚合路由
- 其次优选network命令引入的路由
- 最后选择import-route命令引入的路由。
4. 优选携带AIGP属性的路由
AIGP(Accumulated Interior Gateway Protocol Metric)属性是一个比较新的BGP属性,用于传递并累加IGP Metric值,该属性是可选非过渡属性,IANA(InternetAssigned Numbers Authority)为AIGP分配的属性类型码是26。
在VRP5的实现中,AIGP属性只能通过路由策略添加,若不设置,则路由缺省不携带AIGP属性。在路由传递中,AIGP属性会根据建立邻居所依赖IGP路由的Metric增加其AIGP值。
在路由选路过程中:携带AIGP属性的路由优于未携带AIGP属性的路由,而如果都存在AIGP属性,则比较AIGP属性与其下一跳的IGP Metric之和,优选该值较小的。
由于S系列交换机并不支持AIGP属性,这里不给出AIGP属性的具体示例,有兴趣的小伙伴可以自行实验一下。
5. 优选AS路径(AS_PATH)最短的路由
AS_PATH属性利用了一串AS号描述了去往目的地的AS间路径或路由。当BGP再将一条路由宣告给EBGP对等体时,会将自己的AS号加入AS_PATH中。
在路由选路过程中,设备将选取AS_PATH最短的路由,这一点也很容易理解,AS_PATH最短往往意味着可以通过更少的AS到达目的地。
6. 依次优选Origin类型为IGP、EGP、Incomplete的路由
Origin也是BGP的属性之一,属于周知强制属性。该属性制定了路由更新的来源,该属性指定的路由来源有以下三种:
- IGP:该路由信息是从源AS的协议中学到的。比如:如果一条路由是通过network命令,从IGP路由表中宣告到BGP路由表中,那么该BGP路由的来源就是IGP。
- EGP:路由信息是从外部网关协议中学到的(将EGP路由引入BGP中)。
- 不完全的(Incomplete):路由信息是从其他渠道学习到的。不完全路由并不是说该路由有何缺陷,只是确定该路由来源的信息不完全而已。比如:BGP通过重分发机制学习到的路由将携带不完全路由来源属性,这是因为没有办法确定该路由的来源。
在BGP选路中,设备将优选来源为IGP的路由,其次是EGP,最后为Incomplete。由于EGP协议目前已经基本不再使用,S系列交换机也不支持EGP协议。所以事实上,我们只需要关心IGP类型和Incomplete类型。
下面看一个例子:

我们通过network命令在R2上引入1.1.1.0/24,通过import-route命令在R3上引入1.1.1.0/24。R2的配置相信大家已经很熟了,这里我们看一下R3的配置:
#
bgp 300
peer 13.1.1.1 as-number 100
#
ipv4-family unicast
undo synchronization
filter-policy ip-prefix R3 export /根据前缀列表R3对发出的BGP路由进行过滤
import-route direct /引入直连路由
peer 13.1.1.1 enable
#
ip ip-prefix R3 index 10 permit 1.1.1.0 24 /配置前缀列表R3
#
AI助手
可以看到,引入直连路由后,必然会将很多不必要的路由引入BGP路由表,我们通过配置一个简单的过滤器实现了R3只将1.1.1.0/24路由发给R1的目的。
在R1上查看BGP路由表和路由1.1.1.0/24的详细信息:

可以看到,去往两条路由的Ogn分别为“i”和“?”分别代表,IGP类型和Incomplete类型。而R2宣告的路由被优选,其原因是“not preferred for Origin”,即IGP类型的路由被优选了。
7. 优选MED值最小的路由。
该属性承载在EBGP Update报文中,可以让某AS向其他AS说明其优选的入口点,在上述条件相同的情况下,设备会优选MED属性较小的路由。
8. 依次优选EBGP路由、IBGP路由、LocalCross路由、RemoeCross路由
该规则很容易理解,当以上规则都相同时,设备会优选从EBGP学习到的路由,然后是从IBGP学习到的路由,最后是LocalCross路由和RemoeCross路由。
LocalCross路由和RemoeCross路由是VPN中的概念,这里不做解释,这里通过一个例子验证一下EBGP优于IBGP,如图:

R2通过EBGP将1.1.1.0/24宣告给R1,R3通过IBGP将1.1.1.0/24宣告给R1。配置很简单,不列了。直接看R1的BGP路由表及路由1.1.1.0/24的详细信息:

可以看到,R2宣告的路由被优选,原因是“not preferred for peer type”即EBGP宣告的路由被优选。
9. 优选到BGP下一跳IGP度量值(Metric)最小的路由
本条规则也很好理解,如果上述规则都无法判断,则会判断两条路由的Next_Hop在IGP中的Metric值,优选Next_Hop在IGP中Metric值较小的那一条路由。
以下图为例:

如图,我们正常配置BGP,并在转接AS100中配置OSPF用于域内联通。R5和R4上分别发布1.1.1.0/24路由。R2和R3上并未配置peer next-hop-local命令。所以在R1上1.1.1.0/24路由的下一跳分别为15.1.1.0/24网段和14.1.1.0/24网段(指R5和R4在这两个网段上对应的接口地址,这里为了描述方便)。
这两个网段路由均是从OSPF中学习到的,并且其在OSPF中的cost值也是一样的,现在我们在R1连接R2的接口上配置:ospf cost 10。这样R1到15.1.1.0网段的cost值就变大了。根据我们这条规则,R1将选择下一跳IGP Metric较小的路由,也就是会选择R4宣告的路由。
R5和R4只需要正确建立EBGP邻居并发布1.1.1.0/24路由,无需其他配置,我们来看一下R1、R2、R3的关键配置。
R1的关键配置:
#
interface GigabitEthernet0/0/0
ip address 12.1.1.1 255.255.255.0
ospf cost 10 /配置该链路OSPF的cost为10,一般GE接口OSPF cost为1
#
interface GigabitEthernet0/0/1
ip address 13.1.1.1 255.255.255.0
#
bgp 100
peer 12.1.1.2 as-number 100
peer 13.1.1.2 as-number 100
#
ipv4-family unicast
undo synchronization
peer 12.1.1.2 enable
peer 13.1.1.2 enable
#
ospf 1
area 0.0.0.0
network 12.1.1.0 0.0.0.255
network 13.1.1.0 0.0.0.255
#
AI助手
R2的关键配置:
#
bgp 100
peer 11.1.1.1 as-number 200
peer 12.1.1.1 as-number 100
#
ipv4-family unicast
undo synchronization
peer 11.1.1.1 enable
peer 12.1.1.1 enable
#
ospf 1
area 0.0.0.0
network 11.1.1.0 0.0.0.255 /注意这里虽然不能建立邻居,但是有发布路由的作用。
network 12.1.1.0 0.0.0.255
#
AI助手
R3的关键配置:
#
bgp 100
peer 13.1.1.1 as-number 100
peer 14.1.1.2 as-number 300
#
ipv4-family unicast
undo synchronization
peer 13.1.1.1 enable
peer 14.1.1.2 enable
#
ospf 1
area 0.0.0.0
network 13.1.1.0 0.0.0.255
network 14.1.1.0 0.0.0.255
#
AI助手
我们查看R1的BGP路由表及路由1.1.1.0/24的详细信息:

可以看到,R4宣告的路由下一跳IGP Metric为2,而R5宣告的路由为11,所以R1优选了R4宣告的路由作为最优路由,其优选的理由为“not preferred for IGP cost”即因为下一跳IGP Metric未被优选。
10. 优选Cluster_List最短的路由
小伙伴们还记得Cluster_List么?在路由反射器场景下,为了防止集群间产生路由环路,路由反射器使用Cluster_List属性,记录路由经过的所有集群的Cluster ID。
- 一条路由第一次被RR反射的时候,RR会把本地Cluster ID添加到Cluster List的前面。如果没有Cluster_List属性,RR就创建一个。
- 当RR接收到一条更新路由时,RR会检查Cluster List。如果Cluster List中已经有本地Cluster ID,丢弃该路由;如果没有本地Cluster ID,将其加入Cluster List,然后反射该更新路由。
在路由选路中,当上述规则都无法进行判断时,设备会选择Cluster_List较短的路由。
直接通过一个例子来讲解一下吧:

这里先讲一下配置的要点:
- 所有设备均在AS100中,所有BGP连接均为IBGP,设备间运行OSPF保证域内的连通性。
- 共配置3个RR:R2、R3和R5。R5作为R2和R4的客户机,R4作为R3的客户机。R2、R3、R5的Cluster ID分别为2、3、5。
- 配置R5连接R2的接口的OSPF cost值为2,这时因为当R1发布一条路由时,R5会收到从R2和R4发来的两条路由,这时这两条路由的下一跳IGP Metric值是不一样得(由于全是IBGP连接,这两条路由的下一跳均为R1,而R1-R3-R4-R5这条路径比R1-R2-R5多一跳)。所以我们需要手动给R5连接R2的接口配置OSPF cost值为2,保证两条路由的下一跳IGP Metric一致。
这时我们来分析一下,R1发布一条路由1.1.1.0/24,R5收到R2发来的路由,其Cluster_List为“2”,而收到从R4发来的路由,其Cluster_List为“3,4”,所以R5会优选从R2发来的路由。
我们查看R5的BGP路由表和路由1.1.1.0/24的详细信息:

可以看到R2发来的路由Cluster_List为“0.0.0.2”,R4发来的路由Cluster_List为“0.0.0.4,0.0.0.3”,所以R5优选了R2发来的路由,可以看到其优选的原因为“not preferred for Cluster List”,即因为Cluster_List未被优选。
11. 优选Router ID最小的设备发布的路由 ,优选从具有最小IP地址的对等体学来的路由
这两条规则比较简单,从字面意思就很容易理解,所以将他们放在一起。如果以上那么多条规则,还是无法确定选择哪条路由,设备会优选Router ID最小的设备发布的路由。
这时,有的小伙伴会问:设备的Router ID唯一标识了设备,这总不可能一样了吧?
非也,如果没有例外,就不用设计最后一条规则:设备会优选从最小IP地址的对等体学来的路由了。
我们就看一个例外情况:

如图也是一个路由反射器的场景,R1(Router ID为2.2.2.2)发布一条路由1.1.1.0/24,通过R2和R3两个RR的反射,R4收到两条1.1.1.0/24的路由。根据上面的内容,可以很简单的判断:前十条规则对于这两条路由都是一样的,所以我们不得不使用第十一条规则。
小伙伴们还记不记得,RR使用的Router ID的值标识AS内这条路由的始发者,所以这两条路由的Originator_ID都已经被标识为R1的Router ID 2.2.2.2。
当路由都携带Originator_ID时,设备是不会比较R2和R3的Router ID,而是比较这两条路由的Originator_ID,而这两条路由的Originator_ID均为R1的Router ID 2.2.2.2。于是,设备又无法选择了。
于是,我们就有了最后一条规则:优选IP地址小的对等体发来的路由。由于一个网络内,IP地址是不可能重复的,所以该规则无论如何都可以使设备选择一条路由作为优选路由。
BGP域内必须建立IBGP全连接,未免太过麻烦。如果以MPLS的标签交换,配合BGP必可契合如一。
