BGP选路规则
当BGP收到到达同一目的地的多条路由时,会根据选路规则选择出最优路由,然后将最优路由下发到IP路由表,指导数据流量转发。当到达同一目的地存在多条路由时,BGP采取如下策略进行路由选择:
- 优选协议首选值(PrefVal)最高的路由
协议首选值(PrefVal)是华为设备的特有属性,也在选路规则中位列第一位,因此最优先比较,该属性仅针对本路由器有意义,不会传递给其他设备。协议首选值越大越好,默认首选值为0。 - 优选本地优先级(Local_Pref)数值最高的路由。
本地优先级属性在整个AS内传递,但不会传递到AS之外,值越大越优先,一般用作AS内路由器选择一个最优出口去往外部。如果路由没有设置本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。 - 本地起源优先顺序依次为:①手动聚合路由→②自动聚合路由→③network 命令通告的路由→④import-route命令引入的路由→⑤从对等体学习的路由。
在当前路由器产生的BGP路由中,本地产生的路由要优于邻居学来的路由,本地产生的路由分本地生成的聚合路由和IP路由注入的路由。其中,聚合路由要优于不聚合的路由,而聚合可以分为手动聚合和自动聚合,且前者要优于后者;通过 network 命令通告进BGP的路由要优于通过import方式引入进BGP的路由;其次是从邻居学习到的路由。 - 优选AS路径(AS_PATH)最短的路由。
AS_PATH属性是记录达到目标网络的AS路径列表,类似距离矢量协议中的hop概念,AS_PATH长度短的路由优先。 - 依次优选Origin类型为IGP、EGP、incomplete的路由。
如该路由是通过network的方式产生的路由,那么origin类型为IGP(标识为i),如果是通过EGP协议学习到路由,origin类型为EGP(标识为e),如果将外部路由引入进BGP的路由,origin类型为incomplete(标识为?)。优先级顺序为i>e>?。
第3条规则和第5条规则容易弄混淆,规则3比较的是路由的注入位置(本地注入的优于邻居学来的),用于在本地产生的多条路由中选出最优的路由来发给它的邻居;规则5比较的是路由的注入方式(network或import)。起源代码则用于从不同的邻居收到多条一样的路由中选择出一条最优的。 - 优选MED(Multi Exit Discriminator)值最低的路由。
MED默认只比较来自同一个AS的路由的MED值,数值越小的路由越优先。如果是来自不同邻居AS的路由,MED不参与比较,除非开启compare-different-as-med命令,才可以在来自不同邻居AS的路由间比较MED。 - 依次优选eBGP路由、iBGP路由。
如果路由分别通过eBGP和iBGP同时学习,在其他规则都一样的情况下,会优先选择 eBGP对等体。理由很简单,eBGP连接外部AS,而iBGP连接内部的AS。路由器认为既然通过eBGP学到该路由必然是来自外部的AS,因此直接选择eBGP对等体到达外部比穿越整个AS再到达外部要更加优先。 - 优选到BGP下一跳IGP度量值(Metric)最小的路由。
BGP的路由下一跳地址是通过IGP协议学习到的,根据路由表,计算到下一跳的度量值,越小的越优先。 - 优选Cluster List最短的路由。
如果参与比较的路由没有Cluster List,则越过规则9,直接比较后面的规则,如果某条路由没有Cluster List,而其他路由有Cluster List,则没有ClusterList属性的路由优先。 - 优选Router ID最小的设备发布的路由。
(1)路由不携带Originator_ID属性时,比较Router_ID,最小的邻居通告的路由最优先。
(2)路由携带Originator_ID属性时,将比较Originator_ID的大小,不再比较Router_ID。其中,Originator_ID最小的路由最优。
如果参与比较的路由Oriainator_ID一样,也不再比较Router_ID,直接开始规则11。 - 优选从具有最小IP Address的对等体学来的路由。
最后一步将会比较邻居的IP地址,最小的最优先。
BGP在选择路由时严格按照先后顺序比较路由的属性,如果通过前面的属性就可以选出最优路由,BGP将不再进行后面的比较;如果BGP通过所有属性仍没有选出最优路由,则先收到的路由优选。
前面八个规则可以记住通过首个字母的方式记忆。例如第一个为首选权(PrefVal首选权)可以记住P,第二个(Local Pref本地优先级)可以记住L,第三个是本地产生的路由,可以记住L。以此类推:第四个用A代表AS_PATH,第五个用O代表origin,第六个用 M代表MED,第七个用E代表eBGP,第八个用N代表下一跳IGP的路由。将前面八条规则组成一个单词PLLAOMEN,使用拼音加英文的方式,可以分解为:PL(漂亮)LAO(老)MEN(男人)。
BGP的负载分担
在大型网路中,到达同一目的地通常会存在多条有效路由,但是BGP只将最优路中发布给对等体,这一特点往往会造成很多流量负载不均衡的情况。通过配置BGP负载分担,可以使流量负载均衡,减少网络拥塞。
BGP可实现2种形式的负载分担:BGP路由的负载分担和下一跳路由的负载分担。
1. BGP路由的负载分担
一般情况下,只有“BGP 选路规则”所描述的前8个属性完全相同,且 AS_PATH属性也相同时,BGP路由之间才能相互等价,实现BGP的负载分担。但路由负载分担的规则也可以通过配置来改变,如忽略路由 AS_PATH 属性的比较,但这些配置需要确保不会引起路由环路。
BGP默认仅下发一条最好的BGP路由到IP路由表。但这种行为可以通过maximum load-balancing [eBGP | iBGP] number命令来配置BGP负载分担的最大等价路由条数。如果满足负载分担条件的BGP路由数大于定义的BGP负载分担规格时,按选路规则顺序进行路由优选。
在公网中到达同一目的地的路由形成负载分担时,系统会首先判断最优路由的类型。若最优路由为iBGP路由,则只是iBGP路由形成负载分担:若最优路由为eBGP路由,则只是eBGP 路由形成负载分担。即公网中到达同一目的地的iBGP 路由和eBGP路由不能形成负载分担。
缺省情况下,路由在形成负载分担时会比较路由的AS_PATH属性,而BGP只对 AS_PATH属性完全相同的路由进行负载分担,BGP负载分担特性同样适用于联盟内部的自治系统之间。配置路由在形成负载分担时不比较路由的AS_PATH属性,可以通过命令load-balancing as-path-ignore来实现,但是该方式可能会引起路由环路,需谨慎使用。
负载分担只对本设备有效,本设备还是会根据选路原则选出最优路由发给其他对等体,但在路由表里是显示负载分担的。
如下图所示,AS254通告了两条BGP路由100.1.1.0/24 200.1.1.0/24,由 R5/R6通告进AS100,R1到AS200有2条eBGP路由,通过R5和R6都可以到达。
查看R1路由表,这两条BGP路由默认仅一条路由进入R1的IP路由表。
在R1的BGP进程中负载分担命令:maximum load-balancing eBGP 2。
bgp 100
ipv4-family unicast
maximum load-balancing ebgp 2
再次查看IP路由表,到达AS 254的两条路由各自有两个下一跳,同时进入到IP路由表。
R1的BGP表
2. 下一跳路由的负载分担
BGP区别于IGP协议的一点是其下一跳地址可以是非直连的路由器的接口IP。BGP在AS内的iBGP邻居间通告路由时,下一跳保持不变,数据流量按路由学来的方向转发数据。非直连的下一跳在路由器上会执行“迭代路由”进行查找路由表,BGP 依赖于下一跳路由来转发数据,所以如果下一跳地址所对应路由在IP路由表中是负载分担的,则此处同样算得上BGP的负载分担。
这种负载分担的实现其实和BGP没有直接的关系,完全得益于IGP协议路由中ECMP(Equal Cost Multiple Path)。IGP根据本身的路由算法计算路由的度量值(Metric),在度量值相等的路由间进行负载分担,实际是IGP的负载分担。
如下图所示,R6通告了一条BGP路由100.1.1.0/24,R5访问该网段,数据流经过R1时会进行负载分担,由于R1与R4建立iBGP邻居,而R1的BGP表中到达100.1.1.0网段的下一跳为R4的10.1.4.4(loopback0),而AS100内部运行的是OSPF协议,R1到达目标网段将会迭代到R4的1014.4,而到达R4则有两条等价路径。
查看R1的BGP路由表,下一跳地址为10.1.4.4
由于R1的IP路由表中到达10.1.4.4有两条等价路径,因此该BGP路由也会有两个下一跳