你对BGP的Pre-bestpath Cost Community了解多少?

弈心:从事计算机网络工作十一年(新加坡7年,沙特4年),2013年考取CCIE,在新加坡先后任职于AT&T,新加坡交通部,苹果,Equinix,苏格兰皇家银行等大型企业、银行和政府部门。目前供职于“世界第一土豪大学“沙特阿卜杜拉国王科技大学(KAUST),担任Senior Network Engineer,为KAUST校史上第一位也是唯一一位华人IT部门高级职员。2019年6月在知乎发布了华语圈第一本专门为编程零基础的网络工程师量身打造的Python教程《网络工程师的Python之路》。


这是笔者从业11年来碰到过最难的一道CCIE挑战题,能把EIGRP和BGP两个路由协议研究到如此的深度,不得不佩服出题者的钻研精神。好东西不敢独享,特意拿出来分享给大家,相信读完本文你肯定能收获一些不为大多数人所知的干货。


背景信息:

你对BGP的Pre-bestpath Cost Community了解多少?


1. 某公司有两个site, Site A(192.168.1.55)直连CE-1,Site B (192.168.2.55)直连CE-2。

2. 两个site跑MPLS VPN, CE-1直连PE-1,CE-2直连PE-2,PE和CE之间的IGP用的是EIGRP。

3. CE-1和CE-2之间有一条直连的后门(Backdoor)链路192.168.12.0/30.

4. 在PE-2上做traceroute,PE-2去往Site-A(192.168.1.55)的流量走的是PE-2----P----PE-1----CE-1。这是因为PE-2去往192.168.1.55的路由是从MPLS的BGP学到的。"show ip orute vrp CUST_A 192.168.1.55"和"show bgp vpnv4 uni all 192.168.1.55"的结果证明了这点

你对BGP的Pre-bestpath Cost Community了解多少?


你对BGP的Pre-bestpath Cost Community了解多少?


5.现在公司要求使用CE-1和CE-2之间的后门链路,使得PE-2去往Site-A(192.168.1.55)的流量走PE-2----CE-2----CE-1。为了达到目的,针对PE-2去往192.168.1.55的这条路由,出题者尝试在PE-2上修改在BGP里重分发的EIGRP路由的local pref到500来影响BGP的选路,从而达到目的,配置如下:


你对BGP的Pre-bestpath Cost Community了解多少?


问题:

配置过后,如下图再show bgp vpnv4 uni all 192.168.1.55看一遍,发现PE-2去往Site A的下一跳依然是10.255.255.1,也就是MPLS! 这还不止,更扯的是这里注意看localpref 100这个参数,这说明了前面将192.168.1.55的路由的local pref改到500根本没起作用,要求给出解释和解法。


你对BGP的Pre-bestpath Cost Community了解多少?


解题思路:

如下图,这道题的关键还是在“show bgp vpnv4 uni all 192.168.1.55"里(改了local pref过后),注意看带下划线的部分:“Cost :pre-bestpath:128:156160”。

你对BGP的Pre-bestpath Cost Community了解多少?


Cost:pre-bestpath:128:156160是什么?其实它就是Pre-bestpath Cost Community。Cost Community是BGP的一个扩展的Community属性,它只能传递给iBGP邻居或联邦peer(含联邦iBGP及联邦eBGP邻居),不能传递给eBGP邻居。众所周知,BGP有14条选路原则,一般的网络工程师最多记住前六条选路原则就足够应付工作中绝大多数的BGP选路问题了,比如weight,local pref, as-path, med之类的,而这个cost community绝大多数人觉得很陌生,为什么?因为它排在14条选路原则的最后!

和weight这个BGP属性一样,cost community最初也是由思科提出的,并且针对该BGP属性的RFC尚未正式公布,目前只知道该RFC尚处在“草稿阶段”,该RFC草稿又被称为"BGP Custom Decisions"。

重点:

"BGP Custom Decisions"引用了“插入点”( point of insertion,又称POI)这一概念来决定一台BGP路由器什么时候开始使用“14条选路原则“来进行BGP选路,"BGP Custom Decisions"制定了4个POI值,分别为128,129,130,131,它们的含义如下图所示:


你对BGP的Pre-bestpath Cost Community了解多少?

以这道题的Cost:pre-bestpath:128:156160为例,128为POI值,紧接在它后面的156160为community cost的具体值,这里提一下,community cost值又叫做Value/Cost,越小越优先,理论上的最大值为4294967294.

现在按照上图各个POI值来看,一目了然,当POI值为128的时候,BGP路由器直接使用"Cost Community"来做为选路属性,也就是说它直接忽略了排在选路原则第一位的weight,(当然也更不用说,在这道题里面,作者修改的排在第二位的Local Preference值了),正因为当Cost Community的POI值为128时”如此强大“,所以思科又将POI等于128的cost community的值称为 ABSOLUTE_VALUE,并且给它赋名"Pre-bestpath Community Cost"。

理解了cost community这个BGP扩展属性后,再来看看它和EIGRP有什么关系。

1. 默认情况下,所有在MP-BGP里被重分发的EIGRP路由的POI值(也叫做Community-ID)都为128。

2. 既然POI值为128,那就意味着在选路的时候,我们只需要看该重分发路由的cost community值(也叫做Value/Cost)了,这个cost community值是怎么来的?很简单,其实它就是EIGRP路由被重分发之前的度量值。EIGRP的度量值计算很复杂,Delay, Bandwidth, Reliability, Load, MTU等等都要看,如果K值被修改过,那么计算起来更复杂,关于EIGRP度量值的计算这里不做讨论,任何一个能坚持把这篇文章读到这里的人,不可能不了解EIGRP的度量值怎么计算。

3.当EIGRP被用作MPLS的CE和PE之间的IGP时,PE路由器使用另外一组community(如下图)来将EIGRP度量值传递给下一个PE,这里需要注意的是MPLScloud的度量值为0,也就是说不管两个PE之间隔了多少个P,它们之间所传递的这个EIGRP度量值不会因此而增加。

你对BGP的Pre-bestpath Cost Community了解多少?

4. 这道题里的这些0x8800, 0x8801, 0x8802等等community在哪里看?答案还是在”show bgp vpnv4 uni all 192.168.1.55“里,如下图:

你对BGP的Pre-bestpath Cost Community了解多少?

5. 上图里已经针对各个community给出了详细的解注了,不再赘述。这里只要知道这道题里的Cost :pre-bestpath:128:156160,这个156160(cost community值)代表的是EIGRP的度量值。

理解了在MP-BGP里重分发的EIGRP路由的community cost是怎么回事后,下面就系统地分析一下这道题的问题出在哪。

假设我们现在从PE-2上的某个loopback口做为源地址来ping Site A(192.168.1.55)。不管这个ping包它怎么走,icmp echo request包最终必然会经过CE-1才能到达192.168.1.55,因为Site A和CE-1直连。当192.168.1.55收到icmp echo request包后,它当然会把icmp echo reply包回丢给做为自己默认网关的CE-1。CE-1跑的是EIGRP,它现在有两个EIGRP邻居,一个是PE-1,另外一个是CE-2,这意味着这时CE-1将有两条路来选择将该包丢回给PE-2:一条是走PE-1,经过MPLS丢回给PE-2;另外一条是走CE-2,也就是后门链路,再丢回给PE-2。

1. 先来看当CE-1走PE-1,也就是MPLS这条路时发生了什么。之前已经分析过了,走这条路的EIGRP度量值是156160,所以当PE-1在其MP-BGP里重分发CE-1的EIGRP路由时,该条路由的pre-bestpath community cost值为Cost: pre-bestpath:128:156160。而且前面也提到过,MPLS cloud本身不会对该pre-bestpath community cost值做任何修改,最后PE-2从MPLS收到的icmp echo reply包仍然是Cost:pre-bestpath:128:156160。

2. 当CE-1走后门链路,也就是CE-2时,通过计算,该条路由的EIGRP度量值为158720, 当PE-2在其MP-BGP里重分发CE-2的EIGRP路由时,该条路由的pre-bestpath community cost值为Cost :pre-bestpath:128:158720。

如下图所示:

你对BGP的Pre-bestpath Cost Community了解多少?


3. 两相比较,156160<158720,所以PE-2会选择走MPLS这条路。

4. 如果你还在问我为什么修改了PE-2从CE-2重分发来的EIGRP路由的local pref为500后,PE-2依然走的是MPLS,那说明前面重点部分你还没读懂。

解法:

这道题解法有4种。

解法1.

在PE-2上修改Pre-bestpath community cost值,让EIGRP度量值大于158720。注意:这里不仅要修改EIGRP度量值,同时也要修改POI值,因为现在PE-2上有两个Pre-bestpath community cost值,一个走MPLS(156160),一个走EIGRP(158720),他们两个的POI值都为128,在这种情况下PE-2肯定选前者(这也就是为什么show bgp vpnv4 uni all 192.168.1.55的时候只看到156160, 而看不到158720)。同样的道理,如果我们继续使用128做为POI值的话,当EIGRP被MP-BGP重分发时,POI后面的community cost值会被重置回156160,因为156160依然小于我们配置的值(比如这里的999999),两个POI都为128,一个156160,一个999999,PE-2当然还是选156160,这样的话等于白做了。 所以这里我们必须把POI值修改为任意一个小于128的数值,因为根据RFC草稿,POI值越小越优先。

这里我们把POI修改为1,把度量值修改为999999,这样的话show bgp vpnv4 uni all 192.168.1.55后,你就能看到两个Pre-bestpath community cost值了,MPLS那条变成999999,大于EIGRP那条的158720,这样我们的目的也就达到了。


相关配置命令和验证如下:

PE-2#sh run | s access-list|route-map|router bgp

ip access-list standard CE1_LOOPBACK

permit 192.168.1.55

!

route-map SET_EXT_COST_COMMUNITY permit 10

match ip address CE1_LOOPBACK

set extcommunity cost pre-bestpath 1 9999999

route-map SET_EXT_COST_COMMUNITY permit 99

!

router bgp 100

address-family ipv4 vrf CUST_A

redistribute eigrp 100 route-map SET_EXT_COST_COMMUNITY


PE-2#sh bgp vpnv4 uni all 192.168.1.55

BGP routing table entry for 100:1:192.168.1.55/32,version 8

Paths: (1 available,best #1,table CUST_A)

Advertised to update-groups:

1

Local

192.168.2.2 from 0.0.0.0 (10.255.255.2)

Origin incomplete,metric 158720,localpref 100,weight 32768,valid,sourced,best

Extended Community: RT:100:1

Cost:pre-bestpath:1:9999999

Cost:pre-bestpath:128:158720 0x8800:32768:0 0x8801:100:133120

0x8802:65282:25600 0x8803:65281:1500

mpls labels in/out 33/nolabel

PE-2#

PE-2#traceroute vrf CUST_A 192.168.1.55

Type escape sequence to abort.

Tracing the route to 192.168.1.55

1 192.168.2.2 64 msec 28 msec 12 msec

2 192.168.12.1 44 msec * 24 msec

PE-2#


解法2.

在PE-1上修改Pre-bestpath community cost值,这个和解法1类似,不过注意的是PE-1上只需要修改走MPLS的Pre-bestpath community cost值,所以可以继续将POI值保留为128,只需修改EIGRP度量值,这里我们把EIGRP度量值改为777777. 相关配置命令和验证如下:

PE-1#sh run | s access-list|route-map|router b

ip access-list standard CE1_LOOPBACK

permit 192.168.1.55

!

route-map SET_EXT_COMM permit 10

match ip address CE1_LOOPBACK

set extcommunity cost pre-bestpath 128 7777777

route-map SET_EXT_COMM permit 999

!

!

router bgp 100

address-family vpnv4

neighbor 10.255.255.2 route-map SET_EXT_COMM out


PE-2#sh bgp vpnv4 uni all 192.168.1.55

BGP routing table entry for 100:1:192.168.1.55/32,version 36

Paths: (2 available,best #2,table CUST_A)

Flag: 0x820

Advertised to update-groups:

1

Local

10.255.255.1 (metric 3)from 10.255.255.1 (10.255.255.1)

Origin incomplete,metric 156160,localpref 100,valid,internal

Extended Community: RT:100:1

Cost:pre-bestpath:128:7777777 0x8800:32768:0

0x8801:100:130560 0x8802:65281:25600 0x8803:65281:1500

mpls labels in/out 24/20

Local

192.168.2.2 from 0.0.0.0 (10.255.255.2)

Origin incomplete,metric 158720,localpref 100,weight 32768,valid,sourced,best

Extended Community: RT:100:1 Cost:pre-bestpath:128:158720

0x8800:32768:0 0x8801:100:133120 0x8802:65282:25600 0x8803:65281:1500

mpls labels in/out 24/nolabel

PE-2#


解法3.

在PE-1将EIGRP重分发进MP-BGP并传给PE-2之前,在PE-1将EIGRP度量值用Offset-lists改大。

PE-1#sh run | s access-list|router eigrp

ip access-list standard CE1_LOOPBACK

permit 192.168.1.55

!

!

router eigrp 1

address-family ipv4 vrf CUST_A

offset-list CE1_LOOPBACK in 1000000 FastEthernet0/0


解法4.

关闭Pre-bestpath community cost,

这个是万不得已才用的方法,因为你必须在所有BGP路由器上都关闭pre-bestpath,如果遗漏哪怕一个路由器,都会因为不连续的community cost选路过程而造成造成环路!注意在关闭pre-bestpath后,show bgp vpnv4 uni all 192.168.1.55依然能看到128:156160和128:158720,但是这时它们已不会对选路造成影响了。

PE-1(config)#router bgp 100

PE-1(config-router)#bgp bestpath cost-community ignore

PE-1(config-router)#^Z

PE-2(config)#router bgp 100

PE-2(config-router)#bgp bestpath cost-community ignore

PE-2(config-router)#^Z


PE-2#sh bgp vpnv4 uni all 192.168.1.55

BGP routing table entry for 100:1:192.168.1.55/32,version 3

Paths: (2 available,best #2,table CUST_A)

Flag: 0x820

Advertised to update-groups:

1

Local

10.255.255.1 (metric 3)from 10.255.255.1 (10.255.255.1)

Origin incomplete,metric 156160,localpref 100,valid,internal

Extended Community: RT:100:1 Cost:pre-bestpath:128:156160

0x8800:32768:0 0x8801:100:130560 0x8802:65281:25600 0x8803:65281:1500

mpls labels in/out 19/18

Local

192.168.2.2 from 0.0.0.0 (10.255.255.2)

Origin incomplete,metric 158720,localpref 100,weight 32768,valid,sourced,best

Extended Community: RT:100:1 Cost:pre-bestpath:128:158720

0x8800:32768:0 0x8801:100:133120 0x8802:65282:25600 0x8803:65281:1500

mpls labels in/out 19/nolabel

PE-2#traceroute vrf CUST_A 192.168.1.55

Type escape sequence to abort.

Tracing the route to 192.168.1.55

1 192.168.2.2 24 msec 16 msec 20 msec

2 192.168.12.1 44 msec * 52 msec

PE-2#


分享到:


相關文章: