当前位置:网站首页>BGP路由协议的那些事?(中)

BGP路由协议的那些事?(中)

2022-08-09 07:41:00 菜鸟叔叔好厉害

上一篇我们解决了路由黑洞的问题。本篇我们来聊聊BGP的防环机制

BGP的两种防环机制

在这里插入图片描述

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的路由环路问题就解决了。

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处直接获取到路由。

何为“AS_PATH属性”?

我们把添加在BGP路由中,为了解决某些问题的数据称为属性。如上文解决EBGP环路问题所引入的数值,就是我们目前第一次引入的属性的概念,我们称之为AS_PATH属性。在BGP中,属性是一个非常重要的概念,因为BGP相较IGP非常大的一个优势就是可以在路由中携带丰富的属性,这些属性可以帮助我们对路由进行控制。

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

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

这里我们通过路由策略,在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较短的。

AS_PATH属性

BGP联盟中,AS_PATH属性有以下2个规则:

  • 在联盟内部需要将成员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号。

联盟内部AS号不能宣告到联盟之外,并且在选路中也不考虑这些AS号的长短,那么这些AS号应该如何记录呢?

要弄清楚这个问题,我们来介绍一下4种类型的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和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长度考虑在内。这也解释了我们上期的问题。

LOCAL_PRAF和MULTI_EXIT_DISC属性

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
#

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
#

配置完之后,我们在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

#

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

#

配置完成后,查看R1的BGP路由表:

在这里插入图片描述
可以看到去往3.3.3.0/24目的地有两条路由,下一跳为R2的路由被优选,因为其MED值较小。4.4.4.0/24的路由同理。

本期问题:在BGP联盟内部的EBGP和IBGP对等体互相传递路由时,LP属性和MED属性是如何变化的呢?

原网站

版权声明
本文为[菜鸟叔叔好厉害]所创,转载请带上原文链接,感谢
https://pokes.blog.csdn.net/article/details/126227411