当前位置:文档之家› BGP选路原则详解,2012最新版(超级详细)

BGP选路原则详解,2012最新版(超级详细)

BGP选路原则详解,2012最新版(超级详细)
BGP选路原则详解,2012最新版(超级详细)

废话部分,我肯定不是第一个总结bgp选路原则的,也不会是最后一个总结选路原则的,下面的所有总结是我整理出来以我最容易理解的方式表达的,我习惯是能用文字或

语言表达,尽量不动手做实验,有的地方只有比较特殊的top结构才会出现的情况,我懒

得做实验,我也没提top结构,就麻烦大家自己动动手设计一个呗,嘿嘿……本人水平有限难免有差错,那个哥们要是发现不对之处,请立刻提出来,我自己理解错了没关系,我不想误人子弟。

……………………………………………正文开始了…………………………………………

首先要明确一点在往下看选路原则,所有这些选路原则都是在BGP表里进行的,并不一定是选取最终的路由表中的路由条目。例如:你BGP下宣告的路由是通过IGP学到的,这条路由在BGP表里也会参与选取,并且正常情况会在第一条weight就比较出来,作为有效地的优选路由,但是本地的路由表肯定不会装下,因为任何一个IGP的默认的AD都会小于IBGP的AD值(200),如果你非要把IGP的AD值改成比IBGP大,那么恭喜你,你成功的把BGP下这条路由的引入根源给干掉了……结果不用说了,感兴趣自己试试吧。如果是非思科厂商也可能,不在这一条比较出来,而是在第三条next-hop比较出来,但是最终的装表结果一样。(如果没看懂我啰嗦的,那就往下看,看完你就明白了。)

选路知识铺垫篇:

BGP的属性:

1.well-know

(1)well-know mandatory 公认必遵的,每条BGP路由必须携带的属性并且传给其他路由必须识别

(2)well-know discretionary 公认自决,每条BGP路由可以携带也可以不携带的属性,但一旦携带必须被其他的路由器所识别的属性。

2.optional

(1)optional transitive 可选的传递的属性,即这个属性值传递到其他路由器可识别也可不识别,但必须继续传递给其他的路由器或者AS域。(会在属性的flags 中的partial bit置1)

(2)optional non-transitive 可选非传递的属性,这个属性值传递到其他路由器可识别可也不识别,如果本地路由器不识别此属性则要丢弃该路由前缀。

相关属性归类:

well-know mandatory 1.origin 2. AS-path 3.Next-hop

well-know discretionary 1.Local preference 2.atomic aggregate

optional transitive 1.aggregator https://www.doczj.com/doc/8b10882570.html,munity

optional non-transitive 1.Med 2.originater-id 3.cluster-list

BGP的选路前提:路由的下一跳可达、关闭同步、路由没有被惩罚、前缀没有被

入境路由策略拒绝。

正式进入选路部分:

0..…………………………………此条被封印,过于凶残……………………………………

1.weight(越大越优先),本地有效。默认为0 ,范围(0-65,535)

注意:Weight属性是Cisco私有的,可是很多厂商也是内置该属性(但无法显示及修改),这样就保证了本地始发的路由是最优先的,因为本地始发路由的Weight为32768,从其他BGP Peer学习过来的路由的Weight为0。还有就是一点,weight是本地有效的属性,不可以传递,所以只能在in方向学路由是时修改其值,转发不会携带此属性,所以没必要修改也没法修改。最后一点,本地有效,并不代表它不能影响其他路由器的选路。

2.local-Preference(越大越优先),AS内有效。默认为100,范围

(0-4,294,967,295)

Local Preference属性只能在IBGP Peer之间传递。

(1) IBGP传来的路由信息携带locprf (默认值=100)

(2) EBGP传来的路由信息不携带locprf只,是接收路由器赋予的默认值100

如果在EBGP Peer之间收到的路由的路径属性中携带了Local Preference,则会触发Notifacation报文,造成会话中断,因为没有任何一个参数或者方法是允许ebgp之间直接传递Local Preference。

3.next-hop,0.0.0.0优于非0.0.0.0

比较下一跳,next-hop为0.0.0.0是本地始发路径,非0.0.0.0,那就是通过BGP学习来的(BGP发送或接收路由条目一定会携带next-hop,因为next-hop是well-know mandatory),理所当然的本地优于通过BGP学来的。

注意:本地始发的路径特点是next-hop为0.0.0.0,weight为32768,大家还记得学来的路由默认weight是0吧!所以呢……就是说在本地始发路由与BGP 学来的路由的比较上,在第一条weight已经决出胜负了。所以思科设备上默认情况下就不会比较到第三条{前面提到Weight属性是Cisco私有的,可是很多厂商也是内置该属性(但无法显示及修改),这样就保证了本地始发的路由是最优先的,就是说其他厂商也可能就在第一条就解决了本地始发优于学习来的路由问题,这块我又有点啰嗦了,嘿嘿……}。默认情况下只有在那些根本就不支持weight的设备上才会比较到这一条,当然如果在思科上你手动把学来的路由wight改成32768也可以比较到这条。

小注:BGP路由本地始发的三种引入方式network,redistribute,aggregate

这些方式之间是存在优先顺序的原则:network>redistribute>aggregate,但该原则是不会影响BGP路由选路,因为他们下一跳都是0.0.0.0。

4.AS-path (AS-path中AS最少的优先)

(要是怎看as-path顺序都不知道呢,建议别往下看了……先敲等级2的实验手册去吧,学习要一步步来)注意: (1)可以配置bgp bestpath as-path ignore来忽略这一步

(2) 联盟内的AS-Path列表中的( )的AS号长度不做计算依据,也就是说对

于其他非联盟的外部AS域在计算AS-Path时只把联盟AS号算做一个

AS,并把( )内的联盟子AS全都内容忽略。

(3) 在做聚合路由时,使用as-set后产生的AS-Path列表中的{ }里的AS号

长度只算一个AS号的长度,{ }里面的内容是为后期还原as-path的属

性准备的,但是这个里面的每个AS的顺序并不在是聚合前的正确的

AS-Path顺序,所以后期这个恢复的AS-Path很大的可能会是乱序。

(4) 通过route-map修改AS-path时插入的AS号可是选择in或者out,具体区别

自己做试验试试吧,我想强调的是,在实际中只能添加自身的AS-path,

不能修改为其他的AS号。原因好多,比如你修改的AS号和某个真实运行

的AS相同,那么这个AS不会被接收路由条目,BGP的传递规则,域间防

环路就不在这里多啰嗦了,不是这个文档介绍的重点。

5.origin

最低起源类型的顺序是IGPEGP>incomplete(记住最后这个顺序就行了,要是记不住,就不用记了。嘿嘿……因为这第五条选路原则我觉得实在是没啥大用。)

注意:(1)EGP的方式现在已经不用(从EBGP重发布进BGP产生的)

(2)通过network和aggregate方式产生的BGP路由的起源属性是IGP

(3)通过重分布或者aggregate(前提本身这条路由就是重分布进来的,并

且在汇聚时候携带了as-set参数就把原来的origin给恢复了)产生的BGP

路由是imcomplete

6.MED(multip-exit-disc),越小越优范围(0-4,294,967,295)MED值的用途:在2个AS之间有多个BGP连接的情况下,MED值用于影响从邻居AS到本AS的路由选择,用于影响邻居AS到本AS的流量是从哪个接口进来的,这是通过向相邻AS的EBGP邻居发送具有不同MED值的路由来实现的。

比较MED的前提:学来的路由信息中的as-path第一个值必须相同,也就是说此路由条目是通过同一个AS(或者联盟)学来的,如果不同则不进行MED值的比较。

MED属性的通告与赋值规则:

1.从EBGP对等体学来的MED值只在本AS内传递,不会传出本AS。本AS边界

路由器把这条路由通告给下一个AS的EBGP对等体之前,会清除MED值,置为空,再进行通告。如果强制通告给下一个ebgp对等体Med属性,可用set metric-type internal进行修改。

2.在本地通告进BGP的路由在被通告给EBGP对等体时携带Med值。

(1)如果通过network或者redistribute命令产生的BGP路由是来此于IGP的,则Med值不为0(一般是等同于IGP的cost)。

(2)如果通过network或者redistribute命令产生的BGP路由是自身的直连接口,

则MED值为0。

(3)如果通过aggregate-address通告出来的路由,那么BGP Med不被设置。

接收到此类路径MED值为空的的路由条目,默认情况下,接受路由器自动会将此路径分配MED为0。但是如果开启参数了bgp bestpath med miss-med-worst则会把MED值设置为最大值4,294,967,295(无限大)。

还有种情况就是如果本地路由器从邻居学来的路径MED值就是最大值4,294,967,295。那么此条路径将会在进入BGP表之前被自动修改MED值,更改为4,294,967,294

介绍几个参数:

bgp bestpath med confedration(只包含AS_confed_Seq的路径才比较Med,如果包含了外部的AS时则不参与比较Med),也就是说,这个参数会强制路由器只会比较本联盟内的各个子AS之间传递过来的MED值。

bgp deterministic-med (根据AS号分类,默认是根据时间来分类越老越靠下)Cisco建议在所有新网络部署中均启用bgp deterministic-med命令。对于现有的网络,必须同时在所有路由器上部署此命令,或者逐步部署此命令,但要注意避免可能出现的内部BGP (iBGP) 路由环路。当BGP收到多个通往特定目标的路由时,它会按收到路由的相反顺序列出它们(从最新到最旧)。然后,BGP 按以下顺序成对比较路由:从最新的条目开始,并向最旧的条目移动(从列表顶部开始,向下移动)。例如,将entry1 与entry2 进行比较。随后,将这两个中的较好者与entry3 进行比较,依此类推。当启用bgp deterministic-med命令时,会打乱这个顺序将来自同一个自治系统的路由分组到一起,然后比较每一组的最佳条目。Show ip bgp 可以看出效果。

bgp always-compare-med对于一条路由的所有路径都进行比较MED,不考虑他们是否来自同一个AS(也包括自己的AS,)。对于这个参数选项最好是禁用(默认就是禁用的),如果你非要开启那么一定要在AS域内全部开启这个参数,不然可能会造成域内环路。

产生环路的具体环境我可以给大家点思路,看过这个帖子的兄弟感兴趣的可以设计一个试验环境出来。

首先:通过两种方式产生MED值,通过route-map,通过重发布IGP自动引入。

其次:如果是通过IGP重发布进来的(你底层运行的多个IGP,比如rip和eigrp),而且你又开启了bgp always-compare-med,那么本AS就会比较我本AS内的Ibgp学来的同一条路由的所有路径,那么就会牵扯到MED值得比较了。就有可能出现次优,那么随之而来的就是可能是环路……

7.EBGP>IBGP,EBGP>联邦EBGP(联邦eBGP和联邦iBGP不具有可比性,不比较。因为联邦ebgp和联邦ibgp都被看做内部路径没有差别)。

例如:有多个EBGP和多个IBGP条目时,会暂时优选所有EGBP条目。并把这些条目暂时优选出来的EBGP条目放到下一步比较。

注意:就算是都是EBGP也不会跳过第八条(有些文档资料上写了,会跳过第八条),原因到第八条解释。

下面的第一条情况包括上面说的通过比较暂时优选的EBGP条目,和本身就

只收到了多个EBGP条目,没有IBGP的情况。第二条也需要解释说明下吗…如果有一条EBGP存在也不会选择IBGP,这是第一准则。所以只有都是从IBGP学来的路由时才会出现第二种情况。

(1)如果现有的都是EBGP对等体的条目……

(2)或者的都是从IBGP对等体收到的条目……

(3)或者分别从联邦EBGP和联邦IBGP对等体收到的条目……

上面三种情况的任何一种就会继续向下一步进行。因为这步只会进行EBGP>IBGP的比较,都是同一种对等体关系学来的这步没有能力进行比较。

8.BGP优先选择到下一跳IGP度量值最低的路径

首先解释先为什么前面我说不论什么情况一定会比第八条,因为就算你是有多个EBGP,那么我们直觉会告诉我们,它的的下一跳是直连路由,没有开销,肯定是比不出来了,根本就没有必要比这条吗!!!可是如果EBGP关系是通过ebgp-multihop参数建立的邻居关系,那么EBGP的会话下一跳cost是不是就有比较的意义了。所以不论什么情况路由器还是按部就班的比较一下这条原则的。只能说是一般情况下的EBGP路径通过这条比较不出来而已。

这一条比较原则相对简单,但是也是经常遇到的。第七条说的三种情况的任何一种都会再在这条在进行一次比较。如果不幸递归出来的下一跳IGP的cost 值也一样,那只能继续往下走。

8.5.………………………………这条暂时不介绍,最后补充……………………………………

正好也该看累了,可以回想一下前面几条的内容和联系。

9.BGP等价负载均衡

如果比较到了第九条证明是有多个等价的路径,而bgp默认是负载均衡路径的条数是一条……也就是不支持等价负载!所以要是默认条件下,这条就可以跳过了,默认配置时等价路径在这条肯定是不能继续优选,需要下一条选路原则。

所以在默认情况下我们(不是路由器啊,是我们人思考时)考虑路由选路都是直接进行第十条了。

这条选路原则只有在BGP进程下面配置了maximum-paths [ibgp] <1-16>,并且这个数字大于1的时候才会有意义。其实在我看来这条原则不算是选路原则,他只是一个和事老,把那些实力相当的路由一起全都收了,作为优选。这些等价路径都通过前面八步的层层磨难,好不容易到这里了,就不要非争个你死我活的比出来一条最好的。

maximum-paths [ibgp] <1-16>如果没有ibgp关键字,那么只会对EBGP对等体收到的路由执行等价负载均衡。

如果不配置maximum-paths那么将进行到下一条选路原则。

注意:不管是IBGP还是EBGP收到的路由要实现负载均衡必须as-path完全相同,包含as-set的和联邦子AS的也必须完全相同,也就是( )和{ }里面也要完全相同,如果有联邦

EBGP对等体和联邦IBGP对等体收到的路由他们两个之间不可以负载均衡。负载均衡show ip bgp x.x.x.x明细才可以看到,有multipath标记的都会装入路由表(show ip route)。

10.多条EBGP越老越优先(外部路径时,联邦EBGP对等体不算)

注意:不同路径的之间的老化时间差值,要大于一定的范围才会有效,才会认为有可比性,进行有效的比较。具体的值我也不清楚,嘿嘿。

大家先跟我想一下,如果从第七条没有比出来的,存在多条正常的通过直连学到的EBGP 关系的等价路径,那么在默认情况下第八条和第九条肯定是比不出来的,所以在这里就进行一个老化时间的比较,来选出一条最优先的路径,根据时间选择主要是考虑最小化的减少路由抖动。其实这段是废话,呵呵……

以一下情况会忽略此条比较:

(1)如果BGP进程下使用bgp bestpath compare-routerid命令,则忽略本条选路原则,跳到第11条选路原则;

(2)当多条路由具有相同的router-id时也忽略本原则。

(3)当没有当前最佳路由时,也忽略本原则,例如提供最佳路径的邻居忽然down掉。

(仅ebgp路由)

11.优选从最小的BGP router-id的BGP邻居学来的路由

几种可能情况:

1.从多个EBGP邻居学到相同路由,并且使用bgp bestpath compare-routerid 命令后,跳过第10条选录原则,拥有最小的router-id的路由被选为最优。(详见第10条选路原则)

2.从多个ibgp邻居学到相同路由的情况下,通过前10条选路原则不能选出最优路径的情况下,则最小router-id的路由被选为最优。

3.一个路由器从多个RR收到相同路由进行最优路径选择时(思考下为什么是多RR,单RR会怎么样的情况呢?单RR有可能有比较originator ID吗?),第11条选路原则用的

router-id被更改为originator ID(originator ID既是在本AS学得路由的第一跳路由器的router-id,是RR的一个cleint),而不是RR的router-id。

如果BGP路由只是从一个ASBR学习到然后传入AS内部,第11条选录原则将无能为力。

解释一下原因:

因为在AS内存在RR的情况,比较的是originator ID,而originator ID是本AS内关于此路由的第一条路由器的router-id,所以某条路径是从一台AS边界路由器通过EBGP学到传入本AS内,那么即便是你经过多个不同的RR反射给同一cleint路由器,它学习的这些路径的originator ID还是一样的。这种情况下将会继续向下用12条或13条。

4.如果你还能想出不在上述三种之内的其他的情况,那请你先在从1-10选路原则在从新筛选一遍,看看你想的情况是不是在前十个选路原则就给解决了。

12.cluster-list越短越优先

这个实在是不好说,所以我就上top和配置吧。下面的top图就是十一条中

第三种情况时,我啰嗦半天解释的那种originator ID相同无法比较的的情况,自己看图看配置吧,我就不解释了,嘿嘿……

R4#show ip bgp

Network Next Hop Metric LocPrf Weight Path

* i5.5.5.0/24 1.1.1.1 0 100 0 200 i

*>i 1.1.1.1 0 100 0 200 i

R4#show ip bgp 5.5.5.0

BGP routing table entry for 5.5.5.0/24, version 2

Paths: (2 available, best #2, table Default-IP-Routing-Table)

Not advertised to any peer

200

1.1.1.1 (metric 12) from 3.3.3.3 (3.3.3.3)

Origin IGP, metric 0, localpref 100, valid, internal

Originator: 1.1.1.1, Cluster list: 3.3.3.3, 2.2.2.2

200

1.1.1.1 (metric 12) from

2.2.2.2 (2.2.2.2)

Origin IGP, metric 0, localpref 100, valid, internal, best

Originator: 1.1.1.1, Cluster list: 2.2.2.2

思考一下上面两个RR与R4三台路由器之间互为什么关系……???,什么关系才会出现比较cluster-list。

13.优选来自用最低地址建立BGP连接的邻居的路径

这个地址是本地对等体路由器在其上配置TCP邻居并与远端对等体建立连接

时采用的地址(其实就是更新源)。

如果你又想到了什么想不明白的情况,那么就从1-13重新选一次,没准就能解决了。如果你还是想不明白,那去问老师吧,哈哈……

选路原则补完部分:

8.5.BGP自定义路径选择过程:

BGP Cost Community(BGP成本团体)的扩展团体属性提供了自定义最佳路径选择过程的方式。这个自动路径选择过程插入在BGP条选路原则的第8条之后,第9条之前,所以我叫它8.5条。首选成本值最低的路径。但是可以使用bgp bestpath cost-community ignore来忽略这一步操作,配置时要在AS内或联邦内统一配置,这样可以避免出现路由选择环路。

它存在的意义是什么呢???它可以对我们做路由选路做微调的一个利器,当第八条比较不出EBGP学来路由的几条等价路径时,正常情况是不是就要进行第九条,负载了!!!可是我现在只想让这些从多个EBGP学来的不同路由条目的等价路径中,关于某一个路由条目的路径进行负载(或者不负载)怎么办???我们就可以利用8.5条进行控制与实现。

下面是举例:

这些配置不包含route-map下调用的access-list或者prefix-list,这些因为实际中你想匹配什么,就按照自己的需求写,我就不在这啰嗦了。

半成品:

r1(config-route-map)#match ip address ?

<1-199> IP access-list number

<1300-2699> IP access-list number (expanded range)

WORD IP access-list name

prefix-list Match entries of prefix-lists

r9(config-route-map)# set extcommunity cost igp ?

<0-255> Community ID

r9(config-route-map)# set extcommunity cost igp 1 ?

<0-4294967295> Cost Value (No-preference Cost = 2147483647)

成品:

route-map zj permit 10

match ip address XXX

set extcommunity cost igp X X

BGP进程下调用:

router bgp XXX

maximum-paths XX

neighbor X.X.X.X route-map zj in

比较规则:先比cost number后比较cost communityID,都是越低越优先Cost Value 默认成本编号值为2,147,483,647。此值是0和4,294,967,295之

间的中央点。(所有的默认值相同,有点类似weight和local-Preference所以正常情况下是比较不出

来的,而且又不是经常用,所以容易被大家忽略)

这个团体属性为非传递的扩展团体属性。会传递给IBGP、联邦IBGP、联邦EBGP对等体,不会传递给EBGP对等体。

如果要传递此属性需配置neighbor x.x.x.x send-community extended

0.(我不知道叫啥合适)

它也是社团属性的扩展属性中的一个,简单参考案例:

route-map zj

set extcommunity cost pre-bestpath X X

如果设置此属性的话会忽略其他所有的选路原则,这个变成了No.1秒杀了其他的所有的选路原则。选举规则与应用可参照8.5

相关主题
文本预览
相关文档 最新文档