BGP中的联盟原理和实验(华为设备)

背景:

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

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

联盟概述:

在这里插入图片描述

为保证IBGP对等体之间的连通性(也就是解决一个AS中的条目传递问题),需要在IBGP对等体之间建立全连接(Full-mesh)关系。假设在一个AS内部有n台路由器,那么应该建立的IBGP连接数就为n(n-1)/2。当IBGP对等体数目很多时,对网络资源和CPU资源的消耗都很大。利用联盟和路由反射可以解决这一问题。

BGP联盟可以将AS分割为多个子自治系统,从而让大型转接AS变得更具管理性。被分割的AS本身将成为联盟,而分割后的子自治系统则成为成员自治系统。联盟之外的AS将整个联盟视为一个AS,看不见成员自治系统。由于成员自治系统对外界来说是隐而不见的,因而成员自治系统可以使用公有或私有AS号(建议采用私有AS号)。

联盟可以极大的降低IBGP连接的数量。在联盟中,只需要在成员自治系统内进行IBGP的全连接,而成员自治系统间使用一种特殊的EBGP连接,我们称之为联盟EBGP。

联盟的特点:

配置联盟后,原AS号将作为每个路由器的联盟ID。在联盟内部具有以下特点:

  1. 在联盟内部将会保留联盟外部的next_hop属性。
  2. 通告给联盟内的路由的MED属性在整个联盟范围内保留。
  3. Local Preference属性在整个联盟范围内保留,而不只是在通告的成员AS内。
  4. 在联盟内将成员的AS号加入AS_ PATH中,但不会将联盟内的AS号通告到联盟之外。在联盟中,AS_ PATH属性又添加了两种类型AS-CONFED-SEQUENCE、AS-CONFED-SET,默认联盟将成员的AS号以AS-CONFED-SEQUENCE的形式在AS_ PATH当中列出,如果在联盟内配置了聚合,AS号将以AS-CONFED-SET形式列出。
  5. AS_ PATH中的联盟AS号用于避免环路,但是在联盟选择最短的AS_ PATH路径时不会比较联盟AS号。
  6. 联盟内相关的属性传出联盟时将会被自动删除,无需过滤子AS号等信息操作。

实验:

在这里插入图片描述
目的:
在BGP联盟存在的情况下,保证R1和R5能够正常通信。

环境描述:
我们将AS200分成2个成员AS:AS65535和AS65534。而对于R1和R5来说,他们看到的中间的转接AS仍然是AS200。

配置:

R1上配置:
bgp 300
peer 10.0.14.2 as-number 200

ipv4-family unicast
undo synchronization
network 10.1.4.0 255.255.255.0 //通告对于网段
peer 10.0.14.2 enable

R2上关键配置:
bgp 65534 /本机AS为成员AS号
confederation id 200 /联盟ID,外部路由器看来,连接AS仍然为200
confederation peer-as 65535 /说明本机连接了其他哪些成员AS
peer 10.0.12.3 as-number 65535 //和成员建立EBGP邻居关系
peer 10.0.14.1 as-number 300 //和非成员建立IBGP邻居关系

ipv4-family unicast
undo synchronization
peer 10.0.12.3 enable
peer 10.0.12.3 next-hop-local /注意也需要配置这一条
peer 10.0.14.1 enable

R3上关键配置:
bgp 65535
confederation id 200
confederation peer-as 65534
peer 10.0.12.2 as-number 65534
peer 10.0.23.4 as-number 65535

ipv4-family unicast
undo synchronization
peer 10.0.12.2 enable
peer 10.0.23.4 enable
peer 10.0.23.4 next-hop-local /配置并不会生效

R4上关键配置:
bgp 65535
confederation id 200
peer 10.0.23.3 as-number 65535
peer 10.0.35.5 as-number 100

ipv4-family unicast
undo synchronization
peer 10.0.23.3 enable
peer 10.0.23.3 next-hop-local
peer 10.0.35.5 enable

R5上配置:(和R1上相似)
bgp 100
peer 10.0.35.4 as-number 200

ipv4-family unicast
undo synchronization
network 10.1.5.0 255.255.255.0
peer 10.0.35.4 enable

现在R1和R5已经得到的对方的路由条目,通信测试:成功
在这里插入图片描述
这样,整个AS200内,只需要建立一个IBGP连接和一个EBGP连接,就可以实现路由的传递和数据包的转发。需要注意的是,联盟AS内仍然需要保证IGP的连通性,才能保证数据包的正确转发。否则下一跳会出现不可达的状况。

补充:为什么说peer 10.0.23.4 next-hop-local这条配置不会生效呢?
我们可以看到在R3上的BGP路由条目:下一跳为10.0.12.2。
在这里插入图片描述
在R4上查看路由信息:仍然没有改变,需要注意的是()中表示的是其联盟内的子AS号。
在这里插入图片描述
所以我们得出在联盟的IBGP邻居之间,这条命令是不起作用的。但是需要说明的是,在联盟的EBGP邻居之间,这条命令是起作用的,并且如果不配置这条命令,其下一跳是不会修改为自己的IP地址,这里和普通的EBGP邻居有区别。因为默认认为的是在整个AS中,包括与外部AS建立邻居关系的接口所在的网段,都是通告进入IGP路由协议的。当然我们实际情况下通常没有把对应接口通告进入IGP中。

AS-Path属性在联盟中的应用:

分类:
1:AS_SET,一个无序的AS号列表。
2:AS_SEQENCE,一个有序的AS号列表。
3:AS_CONFED_SET,BGP联盟中特有的AS_PATH类型,类似AS_SET,其列表中含有的AS号均属于BGP联盟中的AS号。
4: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和172.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_PAT用符号“()”表示,而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_SET,只要有序的部分,还是会以有序的进行排列,只会将无法分别顺序的一部分作为无序排列。没有任何标记的是AS_SEQUENCE,{}标记的是AS _SET,() 标记的是AS_CONFED_SEQUENCE,[]标记的是AS_CONFED_SET。后面两个只在联盟中出现。

整理资料来源:《交换机在江湖》、华为路由交换培训资料

猜你喜欢

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