BGP选路原则

选路原则

选路的意义:只有最优路由才会被写入主路由表(配置了maximum-path时例外),只有最优路由才会通告给邻居。

准备工作1、忽略下一跳不可达的路由(包括没有路由和循环递归路由)。

只有默认路由匹配下一跳时也算下一跳可达。

默认情况下拒绝接收从EBGP邻居学习到的下一跳不可达的路由,但是不会拒绝从IBGP邻居学习到的下一跳不可达的路由,这是为什么呢?因为默认情况下,将路由通告给EBGP邻居时,会修改地址为自己的接口地址,这个接口对接收者来说通常是直连可达的,所以下一跳不可达的路由会被拒绝,如果配置了多跳EBGP,那么就允许接收下一跳不可达的路由了。因为IBGP邻居默认情况下可以跨越多跳,所以允许接收下一跳不可达的路由,现在虽然不可达,但是可能待一会儿可能就可达了。

准备工作2、忽略还没有达到同步的IBGP路由。

默认情况下,忽略这一步,因为默认情况下起了BGP进程之后就自动产生no synchronization这条配置,而且通常不启用同步功能。如果启用了同步,如果某条路由它的同步条件还没有达到,那么这条路由不是最优路由,也不会通告给EBGP邻居。

BGP在选路时是两条路由一直比,直到有路由胜出,再拿优胜者和其它路由比。这样可能出现因为MED比较这一步选路结果随路由接收顺序的不同而不同的情况。如果配置了bgp deterministic-med之后,就不会出现这个问题,首先根据路由是从哪个AS学习到的进行分组,然后在组内进行成对比较,最后再进行组间比较。这一点参见quagga0.99.18 bgp_best_selection()。通常建议配置bgp deterministic-med。

下面是成对比较的选路原则。可以参考:quagga0.99.18 bgp_info_cmp()。

1、选择WEIGHT值最大的路由。

2、选择LOCAL_PREF值最大的路由。

Quagga0.99.18的处理方式是没有LOCAL_PREF属性的话,LOCAL_PREF看作是100来处理。

3、优选路由器自己产生的路由,包括本地network、redistribute、aggregate引入的路由,同为自己产生的路由,优先级为network > redistribute > aggregate。即静态注入和半静态注入优于动态注入。Aggregate产生的路由并非原始的路由信息,属性信息可能有损失,比如MED值,所以优先级最低。

4、选择AS path长度小的路由。一个AS_SET被计数为1,不管其中包含多少个自治系统。AS_CONFED_SEQUENCE和AS_CONFED_SET不算在在AS_PATH长度中。

如果配置了bgp bestpath as-path ignore,则不比较AS path的长度。

Quagga0.99.18中配置了命令bgp bestpath as-path confed后,则AS_CONFED_SEQUENCE和AS_CONFED_SET也算在AS_PATH长度中。

5、选择ORIGIN值最小的路由 (IGP < EGP < Incomplete)。即优选network进入BGP的路由,次选通过重发布命令进入BGP的路由。原因是静态注入和半静态注入优于动态注入。至于aggregate得到的聚合路由,ORINGIN可能是IGP,也可能是incomplete,如果具体路由中有incomplete路由,则聚合路由是incomplete,否则聚合路由是IGP。参考quagga0.99.18 bgp_aggregate_add()。

6、选择MED值最小的路由。

没有MED属性的路由MED值看作是0参与比较,如果配置了bgp bestpath med missing-as-worst则MED值看作是2的32次方-1。

Quagga0.99.18里按如下顺序判断

第一步:如果配置了bgp always-compare-med,则不管情况怎样,都对这两条路由进行MED值比较。

第二步:如果配置了bgp bestpath med confed,对于只包含AS_CONFED_SEQUENCE和AS_CONFED_SET的路由(联邦内子AS间路由)进行比较MED值的比较(不管最左边的子AS号是否相同)。

第三步:如果两条路由的AS_PATH的AS_SEQUENCE最左边的AS号相同(忽略AS_CONFED_SEQUENCE和AS_CONFED_SET),则对这两条路由进行MED值比较。如果AS_PATH最左边是AS_SET,则暂时不比较这两条路由,继续第四步。

第四步:如果两条路由的AS_CONFED_SEQUENCE最左边的子AS号相同,就对这两条路由进行MED值比较。如果AS_PATH最左边是AS_CONFED_SET,则暂时不比较这两条路由,继续第五步。

第五步:如果两条路由的AS_PATH中都没有AS号(即AS内部路由,有没有子AS号没有影响),则对这两条路由进行MED值比较。

注释1:我觉得第五步应该要求没有AS_CONFED_SEQUENCE和AS_CONFED_SET号比较合适。否则,因为有第五步所描述的情况包含了第二步所描述的情况,第二步的处理就没有意义了。

注释2:可以看出来bgp bestpath med confed是bgp always-compare-med的功能子集。

7、优选EBGP路由,次选IBGP路由和从联邦内的EBGP peer学习到的路由。不用担心本AS中的网段也会走了EBGP路由,因为这种EBGP路由AS path长度大。这一条就是用来比较其它AS的路由的。

8、选择下一跳IGP度量值小的路由。如果到下一跳的IGP度量值发生了变化,要重新进行选路。用于比较通过多个不同的IBGP peer学习到的路由。

RFC4271中,接下来两步是:

9、选择BGP ID小的speaker发来的路由。

10、选择低IP地址发来的路由。

实际cisco12.4和quagga0.99.18发现IBGP是这样处理的。但是对于EBGP路由,缺省Prefer the oldest route。这样处理是为了减少route-flap,但是同时也带来了网络管理者难以预期谁是最优路由的问题。如果配置了bgp bestpath compare-routerid,则选择BGP ID小的speaker发来的路由。

需要说明:如果IBGP路由中有ORIGINATOR_ID,则使用ORIGINATOR_ID来代替Router ID。

关于maximum-path命令

配置maximum-path,对于前8步打平手,并且AS-path完全相同时,才会将多条路由写入主路由表,不够BGP路由表中仍然只有一条最优路由。

选路原则与distance

RT1上到网络B的有两条路由,1条是MED 20的EBGP,1条是MED 10的IBGP路由。RT1会选择MED 10的IBGP路由。原因是BGP选路时先考虑MED值,后考虑路由类型(EBGP、IBGP)。有人会问EBGP DISTANCE是20,IBGP是200呀。当有多条路由要放入主路由表,他们是不同路由协议提供的,这个时候根据distance值来决定把谁学到的路由放入主路由表。也就是说首先是路由协议决定把一条路由放进主路由表,然后才能根据distance来进行选择,现在BGP的选路过程中就已经把MED 20的EBGP剔除掉了,还根本就没到比较distance的时候。

猜你喜欢

转载自blog.csdn.net/jxzdsw/article/details/82790236