BGP的路由优选规则和负载分担

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BGP的路由优选规则和负载分担相关的知识,希望对你有一定的参考价值。

参考技术A 1.Preferred-Value数值

Preference_Value是BGP的私有属性(华为私有属性),Preference_Value相当于BGP选路规则中Weight值,仅在本地路由器生效。Preference_Value值越大,越优先,默认缺省值为0 只能改变自己的入向选路。

默认情况下,会选择Router id小的作为自己的最优下一跳

step1:在R1上使用ip-prefix或者acl筛选出路由条目

step2:使用路由策略(由于首选值只在本地路由器生效,所以只能应用在本设备的入方向)

step3:在R1的BGP进程中调用路由策略

step4:验证现象(R1到达4.4.4.4/32的下一跳指向R3,首选值被修改成100)

小结:Pre-Value最大,Preference_Value值越大,越优先,默认缺省值为0,且只在本地路由器有效。

2. Local_Preference

Local_Pref属性仅在IBGP邻居之间有效,不通告给其他AS。它表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。一般用来控制本区域流量怎么出去,默认情况下Local-Pref值为100 该数值越大 优先级越高

默认情况下,会选择Router id小的作为自己的最优下一跳(即R2)
step1:在R1上使用ip-prefix后者acl筛选出路由条目

step2:使用路由策略

step3:在BGP进程中调用路由策略

1:R1中BGP进程里指向R3的入方向上(改大)

2:R3中BGP进程里指向R1的出方向上(改大)

3:R3中BGP进程里指向R4的入方向上 (改大)

4:R1中BGP进程里指向R2的入方向上 (改小)

5:R2中BGP进程里指向R1的出方向上  (改小)

6:R2中BGP进程里指向R4的入方向上  (改小)

不能调用在R4的export方向上面(因为Local-preference只能在本AS内进行传递的)

step:验证现象

3.路由生成方式

Aggregate>Summary>Network>import>从邻居学习的路由

BGP在IPv4网络中支持自动聚合和手动聚合两种方式,而IPv6网络中仅支持手动聚合方式:

1:自动聚合:对BGP引入的路由进行聚合。配置自动聚合后,BGP将按照自然网段聚合路由(例如非自然网段A类地址10.1.1.1/24和10.2.1.1/24将聚合为自然网段A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。

2:手动聚合:对BGP本地路由表中存在的路由进行聚合。手动聚合可以控制聚合路由的属性,以及决定是否发布具体路由。

为了避免路由聚合可能引起的路由环路,BGP设计了AS_Set属性。AS_Set属性是一种无序的AS_Path属性,标明聚合路由所经过的AS号。当聚合路由重新进入AS_Set属性中列出的任何一个AS时,BGP将会检测到自己的AS号在聚合路由的AS_Set属性中,于是会丢弃该聚合路由,从而避免了路由环路的形成。

自动聚合summary
step1:在R4上使用ip-prefix或者acl筛选出目标路由,使用Route policy调用。

step2:在BGP进程中将路由引入,并配置自动聚合命令

step3:在R4上查看BGP路由表,发现明细路由被抑制

step4:在R1上查看BGP路由表,发现路由被聚合成自然网段。

手动聚合

step1:在R4的BGP进程里宣告4.4.4.4/24的路由,并配置手工聚合,并抑制明细路由

step2:在R4上查看BGP路由表,明细路由通过detail-suppressed被抑制。

step3:在R1上查看BGP路由表,发现只收到R1的聚合路由。

手工聚合

1:as-set信息在避免路由环路时很重要,因为它记录了被聚合路由所经过的AS

2:attribute-policy 设置聚合路由的属性

3:detail-suppressed参数是把明细给抑制,如果不加的话,会把明细路由和聚合路由都传过去

4:origin-policy仅选择符合route-policy的具体路由来生成聚合路由(只要有这条路由信息,我才能产生聚合路由)

5:suppress-policy能产生聚合路由,但抑制指定路由的通告,可以使用route-policy和if-match子句有选择的抑制一些具体路由,其他具体路由仍被通告(抑制聚合中的某些路由)

路由聚合产生的问题

如果路由聚合后携带所有明细路由经过的AS信息,当明细路由发生频繁震荡时,聚合路由也可能受其影响频繁刷新。因此,聚合路由是否携带丢失的AS_Path信息,需要设计者综合考虑网络环境

4:AIGP

BGP优选AIGP较小的路由。AIGP属性是一种新的BGP路由属性,用于传递并累加IGP Cost值,该属性为可选非过渡属性。在一个AIGP域内部署AIGP属性,可以使BGP像IGP那样基于路由的Cost值优选出最优路由,从而保证一个AIGP域内的设备都按照最优路径进行数据转发。AIGP的比较遵循如下规则:

1:有AIGP属性的路由优先级高于没有AIGP属性的路由。

2:如果路由都存在AIGP属性,则比较AIGP属性与其下一跳的IGP Cost之和,优选该值较小的。

AIGP属性只能通过路由策略添加。在BGP引入、接收或发送路由时,可以人为通过路由策略里的 apply aigp cost | inherit-cost 命令设置AIGP属性值的大小。其中,在BGP引入IGP路由时,若不进行设置,BGP路由没有AIGP属性值。

bgp 200(R4)

#

ipv4-family unicast

  peer 14.1.1.2 aigp                                    //使能与对等体之间的AIGP能力

  peer 15.1.1.2 aigp                                    //使能与对等体之间的AIGP能力

  peer 14.1.1.2 route-policy 1 export

  peer 15.1.1.2 route-policy 1 export

#

route-policy 1 permit node 10                //定义路由策略的第一个节点,设置路由4.4.4.4/32的AIGP为10

if-match ip-prefix prefix1

apply aigp 10

#

route-policy 1 permit node 20                //定义路由策略的第二个节点,不设置匹配条件,允许其他路由通过路由策略

if-match ip-prefix prefix1

apply aigp 5

#

ip ip-prefix prefix1 index 10 permit 4.4.4.4 32        //定义地址前缀列表prefix1,匹配路由

R2:

ipv4-family unicast

  peer 14.1.1.1 aigp                                    //使能与对等体之间的AIGP能力

R3:

 ipv4-family unicast

  peer 15.1.1.2 aigp                                     //使能与对等体之间的AIGP能力

5.AS_Path

AS_Path属性有四种形式,分别是:AS_Sequence、AS_Set、AS_Confed_Sequence和AS_Confed_Set。

AS_Sequence:它是到目的地的路径上所经过的AS号的有序集合,按照顺序记录了路由经过的所有AS。

AS_Set:它是到目的地的路径上所经过的AS号的无序集合。AS_Set通常用在路由聚合的场景。

AS_Confed_Sequence:是联盟内子AS的一个有序集合。

AS_Confed_Set:是联盟内子AS的一个无序集合,主要用在联盟内路由聚合的场景。

AS号追加

route-policy 1 permit node 10                   //定义路由策略add_asn的第一个节点

if-match ip-prefix prefix1                            //匹配IP地址前缀列表prefix1

apply as-path 65003 65003 65003 additive             

AS号替换

配置 apply as-path 命令时,如果选择 overwrite 参数,则可以对AS_Path中的编号进行替换。AS编号替换的应用比较灵活,主要有以下几种情况:

隐藏路由的真实路径信息。

如果配置了 as-path-limit 命令,接收路由时会检查AS_Path属性中的AS号是否超限,如果超限则丢弃路由。这样对于AS_Path较长的路由,在接收之前,可以把AS_Path替换成较短的AS_Path,防止路由由于AS号超限而被丢弃。

缩短AS_Path长度,使路由被优选。

AS号替换还可以用于形成负载分担

6.Origin

Origin属性主要有三种:

IGP:具有最高的优先级。路由是用 network 命令注入到BGP路由表中的,则Origin属性为IGP。

EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。

Incomplete:优先级最低。路由是用 import-route 命令注入到BGP路由表中的,则Origin属性为Incomplete。

3种Origin属性的优先级为:i>e>Incomplete(?)

7.MED(越小越优,默认为0)

特点:仅在AS内部或者相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS

MED属性相当于IGP使用的度量值(Metrics),它用于判断流量进入AS时的最佳路由(用于比较来自相同AS的路由)

修改方法:

注意要点:

执行 compare-different-as-med 命令后,BGP将强制比较来自不同AS的路由的MED值。除非能够确认不同的AS采用了同样的IGP和路由选择方式,否则不要使用 compare-different-as-med 命令(可能产生环路)。

执行 bestroute med-none-as-maximum 命令后,BGP选路时将该路由的MED值按最大值4294967295来处理,选路结束后,MED值恢复为原始值。

执行 bestroute med-confederation 命令后,只有当AS_Path中不包含外部AS号(不属于联盟的子AS),且AS_CONFED_SEQUENCE的第一个AS号相同时,才能比较MED值的大小。

执行 deterministic-med 命令后,将消除路由接收顺序对选路结果的影响。

step1:在R4上使用ip-prefix或者acl命令匹配路由

step2:使用Route policy匹配ip-prefix或者acl,apply cost

step3:在R1上验证

8.邻居类型(EBGP优于IBGP路由)

在运营商网络存在多个出口设备从Internet获取路由的场景,出口设备会经常比较邻居类型。

所有设备处于同一个AS。SwitchA和SwitchB做为运营商网络的出口设备,之间建立IBGP邻居关系,并且和其他的设备也都建立IBGP邻居关系。做为运营商网络的出口设备,SwitchA和SwitchB同时从Internet获取路由,然后将EBGP路由向自己的所有IBGP邻居发布。在这种情况下,SwitchA和SwitchB上分别有一条IBGP路由和EBGP路由,并且二者的AS_Path属性相同。通过邻居类型的比较,SwitchA和SwitchB都选择EBGP路由做为最优路由。

9.IGP的开销值

默认情况下:R1会优先选择R2作为到达4.4.4.4/32的下一跳(router id小)

在R1的G0/0/0接口下使用命令ospf cost 10,使IGP的开销值大于默认开销值1.

验证如下:

10.Cluster_list

step2:RR收到客户机Client 1的update报文后,RR第一次反射该路由时,会把cluster-ID添加到Cluster_List,如果RR没有cluster_ID属性,则自己创建一个再添加。同时也会把Originator_ID添加进去,标识此条路由的发起设备(Router ID值)

11. Router ID (越小越优)

Router ID在自治系统AS中可以标识一台路由器:

如果路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小(不再比较Router ID),并优选Originator_ID最小的路由。缺省情况下,BGP在选择最优路由时在Cluster-List之后比较Originator-ID。配置 bestroute routerid-prior-clusterlist 命令后,BGP在选择最优路由时在Cluster-List之前比较Originator-ID。

12:对等体地址

多链路场景EBGP之间一般用loopback0接口作为更新源地址,也可以使用不同的接口地址作为更新源

负载分担:

配置BGP负载分担后,满足如下所有条件的多条BGP路由会成为等价路由,进行负载分担:

1:首选值(PrefVal)相同。

2:本地优先级(Local_Pref)相同。

3:都是聚合路由,或者都不是聚合路由。

4:AIGP值相同。

5:AS_Path属性完全相同。

6:Origin类型(IGP、EGP、Incomplete)相同。

7:MED(Multi_Exit Discriminator)值相同。

8:都是EBGP路由或都是IBGP路由。配置 maximum load-balancing eibgp 命令后,BGP在选择最优VPN路由时忽略该条比较。

AS内部IGP的Metric相同。配置 maximum load-balancing eibgp 命令后,BGP在选择最优VPN路由时忽略该条比较。

此外,需要特别指出的是,携带标签的BGP路由与不携带标签的BGP路由即使满足上述条件,也不能形成负载分担。

step1:在R4的BGP进程中network一条路由之后,R1的路由表中存在两条到达4.4.4.4/32的BGP路由,但是只会优选下一跳为R2作为自己的下一跳,因为router id小,此时查看路由表如下所示:

step2:在R1的BGP进程中使用maximum load-balancing ibgp 2命令(ebgp也可以)实现负载分担。

BGP选路由原则

BGP的选路由原则 13条

1、Weight 权重越大越优  思科私有

2、local-prefence 本地优先级默认100越大越优

3、本地优先 任何条目都没有本地优先

4、As-path越短越优,

5、origin 起源

6、med

7、ebgp优于ibgp

8、优选next-hop最近的路由

9、BGP负载均衡 //不做为选路原则

10、old bgp 关系越老越优

11、rid越小越优

12、cluster-list越短越优

13、neighbor的ip越小的越优

首先你要明白,什么时候需要选路,如果就有一条链路中更新过来的东西,还有必须选吗?当然没有必要,这是必须要先搞清楚的,当有多条线中更新过来有重复的条目时,就要进行选取最优条目,这13条原则,就是帮助/执行决策,然后放入路由的。


1 weight 权重值,越大越优

权重,本地设备有效,默认值为0,【cisco私有】

具体的配置思路要使用route-map进行调用

 

思路,既然只能设置本地有效,且只能是in方向,肯定是在有路由有基础之上才可以做

1  ACL/prefix-list抓取相应的条目

1 route-map 条目

2 给特定的邻居定义策略并指定应用方向

 

实验IBGP部份

 技术图片

 

 

 全网支持bgp,使用as100,建立IBGP关系,另外由R1和R3分别宣告两个条目,方式要相同。

 配置方面直接略过,直接 R2上查BGP表,

 技术图片

 

 

 这时你会发现 两个条目的weight都是0,如果不参照其它因素,肯定是无法进行比较的,

那怎么办呢?

好办,现在它优选的是R1更新过来的条目,我们通过配置策略,把这个优选改成R3的

R2(config)#access-list 1 per 10.0.0.0      //抓取路由前缀
R2(config)#route-map weight per 10     //明明weight的条目
R2(config-route-map)#ma ip add 1    //指定ACL列表序号
R2(config-route-map)#set weight 30    //设置权重值—30,<-65535>
R2(config-route-map)#exit
R2(config)#route-map weight per 20    //千万不要忘了,要放行其它条目,因为现实中不可能就你这一条
R2(config)#router bgp 100             ///进入BGP进程
R2(config-router)#nei 3.3.3.3 route-map weight in   //针对3.3.3.3调用策略应用在in 方向

再来查看一下是否生效了呢~

 技术图片

 

 

 有了,没问题

数值改了,best也过去了, 

如果是应用在out方向上会怎么样呢?之前说过,这个weight是本地设备有效,不可能去传递给其它设备,所以,只能配置在in 方向上,不信咱们可以试一下

加深一下印象而已嘛~

针对于1.1.1.1 应用out策略

 技术图片

 

 

 看到了吧,直接就报错,not supported,不支持这样操作。

这也充分验证了,weight属性是可选非传递的,设备不一定认识,而且也可以不传递,看来只有针对于本地才有效的。

 

实验EBGP部份

技术图片

 

 其实换汤不换药,还是一样的道理,只不过就是EBGP的配置与IBGP的配置不相同而已,策略部份全都一样的.

咱们直接应用策略

 技术图片

  可以看到ebgp环境下,weight同样默认是为0,还是那句话,这是本地,本设备有效的,不会传递给其它设备的,

我们来配置一下策略,让4.4.4.4 成为最优,那么就直接给4.4.4.4 这个peer设置route-map即可,set weight

R5(config)#do show ip access
Standard IP access list 1
    10 permit 100.0.0.0 (4 matches)
R5(config)#do show run | se route-
route-map weight permit 10
 match ip address 1
 set weight 10
route-map weight permit 20
R5(config)#router bgp 500 R5(config-router)#nei 4.4.4.4 route-map weight in

技术图片

  OK,no problem,不管你是ibgp,还是ebgp,只要是我在本地进行设置weight就可以对你这个条目生效。 

  


2 local-prefen 本地优先级

默认数据100,越大越优。

本地优先级,这里的本地指的是本AS内部,也就可以理解为在AS内部生效,在外部的话就是不生效的。也可以直接理解为在as内部不管是In/out 都应该生效,而对于EBGP只有IN是生效的

行不行的,咱们来测试一下,就知道了,用事实说话

惯例,先运行ibgp(之前的所有策略均已清除)

实验IBGP部份

 技术图片

 

 清除所有的策略

 技术图片

  现在系统选取的是1.1.1.1为最优,那我们通过对3.3.3.3的localpre进行修改,看看能不能将最优改过来

Standard IP access list 1
    10 permit 10.0.0.0 (2 matches)
R2(config)#route-map local per 10
R2(config-route-map)#ma ip add 1
R2(config-route-map)#set local-preference 200
R2(config-route-map)#exit
R2(config)#route-map local per 20
R2(config)#router bgp 100
R2(config-router)#nei 3.3.3.3 route-map local in

Clear ip bgp * soft 加快BGP的收敛速度,触发更新

 技术图片

  IBGP的IN方向没有任何的问题,数值也变了,BEST也变了,生效了

 

再来看一下IBGP的out方向是否可以

现在最优的是3.3.3.3,那我们再把1.1.1.1的条目加大local-pre,应用在out,上看能否生效

  

R1(config)#access-list 1 per 10.0.0.0    //抓取前缀
R1(config)#route-map local1 per 10   //定义名字为local1
R1(config-route-map)#ma ip add 1
R1(config-route-map)#set local 300   //配置local-pre为300
R1(config-route-map)#exit
R1(config)#route-map local1 per 20    //允许其它
R1(config-route-map)#exit
R1(config)#router bgp 100    //进入进程
R1(config-router)#nei 2.2.2.2 route-map local1 out  //在out方向对2.2.2.2 应用策略

 

看看是否会生效呢~

 技术图片 

OK ,同样是生效的,证明我们之前的推断是正确的。

 

实验EBGP部份

 技术图片

  首先先要明确一点,对于EBGP而言,更新到本地的路由,默认localpre是空的,空的,不是零,是空的,证明什么?LOCAL-pre是本地AS的优先级,和EBGP关系不大,你在AS内部就算再大,到了我EBGP的那里,也是空的。

 技术图片

  现在优选于4.4.4.4 的条目,我们通过对6.6.6进行策略部署,看能否生效,现在是in方向

 

R5(config)#do show ip access
Standard IP access list 1
    10 permit 100.0.0.0 (5 matches)
R5(config)#route-map local per 10
R5(config-route-map)#ma ip add 1
R5(config-route-map)#se local-preference 200  
R5(config-route-map)#exit     
R5(config)#route-map local per 20
R5(config-route-map)#exit
R5(config)#router bgp 500
R5(config-router)#nei 6.6.6.6 route-map local in

查看配置是否生效

 技术图片

  没问题,数值可以修改,且策略也生效,看来EBGP的IN方向是没有问题的

 

那么Out方向呢?在4.4.4.4 上做,配置out方向为300看会怎么样

R4(config)#access-list 1 per 100.0.0.0
R4(config)#route-map local per 10
R4(config-route-map)#ma ip add 1
R4(config-route-map)#set local 300
R4(config-route-map)#exit
R4(config)#route-map local per 20
R4(config)#router bgp 400
R4(config-router)#nei 5.5.5.5 route-map local out
R4(config-router)#end

哎呀,可以配置,没问题啊,生效吗?

 技术图片

  好像并不生效,

嘿嘿,没错,就是不生效,配置是一方面,但是策略能否生效,又是另一回事儿了,

记住,local-pre只在本AS内部进行传递,不会在update信息中包含这一属性到达别的AS中,所在EBGP关系中,local-pre只对in 生效,因为Local prefen不会被放到update信息中来进行更新到其它AS,所以就得到上了面的结果 

 


3本地优先 任何条目都没有本地优先

无论你是ebgp,还是ibgp,都不可能有我的本地network条目优先,是这为什么?

咱们可以看一下,

实验IBGP | EBGP 部份

 技术图片

 

 全网为IBGP邻居关系,R1和R3分别向BGP网络中宣告10.0.0.0/24条目,

R2上也宣告一个同样的BGP条目,看看效果会怎么样?

 技术图片

 

 如果在本设备上宣告同网段后,肯定会出现这样的现象,

1 next-hop 0.0.0.0 ,本地为下一跳地址,

2 weight 权重值,本地的为32768

如果你想要比这个还优的话,可以进行修改其它条目的weight,但是真的会管用吗?

行不行的咱们试一下就知道了

比如我们修改一个来自于R1的weight为32769(只要比32768大就可以了)

 技术图片

  OK ,可以改啊,之前也作过关于weight的配置,完全没有问题

但是会发现有些不对,条目的最前边,由原来的* 变成了r,

r的意思,是rib-failure,放入路由表失败,这个就有点儿意思了,

你是在BGP表里最优的,但是你不是路由表里最优的,

不要忘了,我本地可是有这个条目存在的。

所以根本就不会把你放到我的路由表中。

各种协议的AD值还记得吗?回忆一下?

     直连Connect AD=0

     静态 Static  AD=1

     RIP AD=120

     EIGRP AD=90/170

     OSPF AD=110

     IBGP=200  

     EBGP=20

 相同路由不同路径比协议,相同路由相同协议比度量值,稍微一比,BGP就被C甩了几条街。没有可比性。

 其实无论是EBGP,还是IBGP,修改比本地优先的办法就是去调整weight值,

然而,并没有什么用。

EBGP我们就不试验了,等于是重复操作。有兴趣的可以自己测试一下

 


4 As-path越短越优

AS-path,这一路径属性,之前提到过,现在再次重申,

AS-PATH有两个作用,   用于标记所经过的AS号

                        用于IBGP防环

                        其实对于EBGP同样奏效

 

这一路径属性,只针对于EBGP而定的,因为只有EBGP才会牵扯到经过AS

还记得我在最开始画下的那个图吗?

 技术图片

 

 

 如图中所求,R1有一个更新发往R4,请问哪条线路最好呢?

答案无可厚非,肯定是上面,

为什么?

因为上面只经过了两个AS就到了,

而下面要经过三个AS才可以,

再次重申,BGP协议看的不是经过的路由设备个数,而是经过的AS个数。

 所谓越短越优,就是经过的AS越少,则被BGP视为最优路径

 当然也可以通过set命令来进行修改,但是修改的时候有一个小技巧,咱们来看一下实验

 

实验EBGP  IN部份

 技术图片

 

 

 此时不做任何的配置,R4和R6发布相同路由前缀到EBGP中,在R5上看到的是有两条相同的条目

 技术图片

 

 

 这里比的是个数、数量,而不是序号的大小,请注意哦~

现在优选6.6.6.6 ,那我们可以对这个条目的6.6.6.6进行策略控制,让它经过的AS变多,从而使4.4.4.4发过来的条目变成best

怎么做呢? 

前文提过,AS-PATH为公认必遵的属性,那么任何一个update包中必须包含的,那么应该说无论是in 还是out,都应该是没问题的

配置思路

ACL抓取条目

定义route-map 关联条目

set as-path

允许其它条目经过

调整用策略(in/out方向)

 

 配置如下

R5(config)#route-map as per 10
R5(config-route-map)#ma ip add 1
R5(config-route-map)#set as-path prepend 600 600  //为了防止和其它AS冲突,使用自己本地的,当然可以多加几个      
R5(config-route-map)#exit
R5(config)#route-map as per 20
R5(config)#router bgp 500
R5(config-router)#nei 6.6.6.6 route-map as in

 再到R5上查看一下BGP表

 技术图片

 

 

 两点结果,

1 可以看到6.6.6.6的条目上,经过了3个600AS

2 best条目也已经变成了4.4.4.4

 至此证明IN方向部署策略是没有问题的。

 

实验EBGP  OUT部份

接上面的配置

我们在4.4.4.4的设备上进行配置,经过5个400,使6.6.6.6成为best

R4#show ip access
Standard IP access list 1
    10 permit 100.0.0.0 (4 matches)
R4(config)#route-map as per 10
R4(config-route-map)#ma ip add 1
R4(config-route-map)#set as-path prepend 400 400 400 400 400
R4(config-route-map)#exit
R4(config)#route-map as per 20
R4(config-route-map)#exit
R4(config)#router bgp 400
R4(config-router)#nei 5.5.5.5 route-map as out

再到R5上看一下

技术图片

 

 

 同样也是没问题的,

 OK ,看来,in/out都是OK的

 


5 origin 起源

起源属性,属于公认必遵,所有的BGP设备都必须要支持的,那么就很好理解了,对于策略的部署,可以使用out,也可以使用in了,因为update包是必须携带这个属性值的。

当然,除了通过配置策略来使它的类型变成incomplete,还有一种可能,就是在将路由宣告进 BGP时就是使用的重分布,这样直接 就是incomplete形式的,

 

起源的类型   

              i—IGP  BGP内部,这可不是IGP协议啊~你可以理解为internal

             e—egp  EGP,BGP的前身,现在已经被淘汰了

             ?—incomplete 重分布形式

 体的关键字提醒,,在show ip bgp 的时候可以很清楚的看到

 技术图片

 

 Origin 属性如果需要设置,需要和route-map进行关联 

配置思路

ACL抓取

Route-map定义

Set origin

 技术图片

 

 针对于邻居调用,因为是公认必遵属性,所以in/out都无所谓的,但要注意所在位置

 

实验IBGP部份

 技术图片

 

 此时在R2上看到的条目是这样的

 技术图片

 

现在我们要做的是将1.1.1.1这个条目的起源类型改成e,使用in 方向进行调用策略

Standard IP access list 1
    10 permit 10.0.0.0 (5 matches)
R2(config)#route-map origin per 10
R2(config-route-map)#ma ip add 1
R2(config-route-map)#set origin egp 500  //配置EGP时,要加上AS号
R2(config)#route-map origin per 20
R2(config)#router bgp 100
R2(config-router)#nei 1.1.1.1 route-map origin in

那么再到R2上查看一下BGP表,看会是什么样的

 技术图片

 

 发现1.1.1.1的条目,起源变成了e,那么i>e>?

此时我们在到R3上设置out方向的策略,将它改成incomplete,来看一下会发生什么.

 技术图片

 

 这时发现1.1.1.1的优先权又回来了,

 

R3(config)#access-list 1 per 10.0.0.0
R3(config)#route-map origin per 10
R3(config-route-map)#ma ip add 1
R3(config-route-map)#set ori incomplete
R3(config-route-map)#exit
R3(config)#route-map origin per 20
R3(config-route-map)#exit
R3(config)#router bgp 100
R3(config-router)#nei 2.2.2.2 route-map origin out

 

实验EBGP部份

 技术图片

 

 默认情况下不进行任何的属性修改,在R5上查看配置是这样儿的

 技术图片

 

 Standard IP access list 1
    10 permit 100.0.0.0 (9 matches)
R5(config)#route-map ori per 10
R5(config-route-map)#ma ip add 1
R5(config-route-map)#set ori egp 100  //配置EGP时也要加上AS号
R5(config-route-map)#exit
R5(config)#route-map ori per 20
R5(config)#router bgp 500
R5(config-router)#nei 6.6.6.6 route-map ori in

查看配置

技术图片

 

 对于ebgp而言,in方向测试成功

 再来测试一下out方向,我们再将4改成?

R4(config)#route-map ori per 10
R4(config-route-map)#ma ip add 1
R4(config-route-map)#set ori incomplete  //修改起源为重分布方式
R4(config-route-map)#exit
R4(config)#route-map ori per 20
R4(config-route-map)#exit
R4(config)#router bgp 400
R4(config-router)#nei 5.5.5.5 route-map ori out

 再到R5上看一下配置

 技术图片

 

 没有任何的问题

 总结:

可以再次的确认,这种公认必遵属性的好处就是无认你是in 还是out方向上部署策略,都很灵活. 

 


6、med(可选非传递)

Med,说白了就是BGP的metric值,如果是本地宣告的话,那么默认就是0,越小越优

但如果是由IGP学习到的条目再进行宣告,会继承IGP的metric

 如下图

 技术图片

 

 

此时,R2—R3运行eigrp和BGP,且关系为IBGP,

那么在R2上show ip route 可以看到3.3.3.0为D的条目

那么在R2上,进入BGP宣告这条路由,会是什么样的后果呢?

我们到R1上看一下BGP表

 技术图片

 

 409600,好眼熟的数字 ,我们到R2上查看一下EIGRP的路由表

 技术图片

 

 R2上看到的metric,IGP 条目 eigrp协议的metric就是409600

所以验证了我们刚才所说的,如果条目是从IGP学到的,再宣告到BGP中,那么MED会继承IGP的metric。无论你是 static, ospf eigrp rip,都是一样,因为他们都属于IGP协议。

 

还是一样的方式带着思考往下走,

可选非传递的路由属性,那么是否可以认为 out方向不可以呢?

 

实验IBGP部份

 技术图片

 

 R4-R5-R6同时运行BGP,关系为IBGP,

R4和R6同时宣告10.0.0.0/24条目,在R5上进行测试

先来看一下R5的BGP表

 技术图片

 

 都是本地始发的,也没有从其它的IGP协议中学习到,那么此时的metric默认就是0,

之前说过,默认为0 ,越小越优,

现在最优的为4.4.4.4,那么我们通过策略来给4.4.4.4发来的条目增加metric,看看会有什么样的后果。

 

配置思路

ACL抓取条目

Route-map定义

Set metric

进程调整用(in/out)

 

R5(config)#access-list 1 per 10.0.0.0
R5(config)#route-map med per 10
R5(config-route-map)#ma ip add 1
R5(config-route-map)#set metric 10   //加大MED值 
R5(config-route-map)#exit
R5(config)#route-map med per 20
R5(config)#router bgp 456
R5(config-router)#nei 4.4.4.4 route-map med in  

再来查看R5的BGP表,发现4.4.4.4条目的metric值 被修改了,变成了10,10比0大,那么0优先,所以6.6.6.6的条目更优先,至于前面的r,先不用管,是因为我在宣告eigrp的时候使用的是network 0.0.0.0,eigrp比ibgp更优。所以写入路由表失败了。但这不是我们现在要说的重点,请忽略。

 技术图片

 

 In 方向没有问题那么out方向呢?试一下,我们再把R6的metric改成20看一下

R6(config)#access-list 1 per 10.0.0.0
R6(config)#route-map med per 10
R6(config-route-map)#ma ip add 1
R6(config-route-map)#set metric 20
R6(config-route-map)#exit
R6(config)#route-map med per 20
R6(config-route-map)#exit
R6(config)#router bgp 456
R6(config-router)#nei 5.5.5.5 route-map med out

技术图片

 

 ,看起来同样的奏效,,对于IBGP而言,无论是in 还是out,都生效的,

 

实验EBGP部份

 技术图片

 

 EBGP的环境中去修改metric,看能不能是IBGP的效果

 

R2(config)#access-list 1 per 10.0.0.0
R2(config)#route-map med per 10
R2(config-route-map)#ma ip add 1
R2(config-route-map)#set metric 10
R2(config-route-map)#exit
R2(config)#route-map med per 20
R2(config-route-map)#exit
R2(config)#router bgp 200
R2(config-router)#nei 1.1.1.1 route-map med in

 照常一样的配置,那么会生效吗/

 技术图片

 

 可以看到,虽然metric值已经被修改过来了,但是你会发现,并没有对best条目进行干预,

为什么?

因为在ebgp的环境中,如果想要让metric起做用,还要有一条特殊的命令。

R2(config-router)#bgp always-compare-med    //总是比较med,这一点有点特殊,请记住

 输入完命令以后会怎么样呢?

 技术图片

 

 OK,没有问题,metric值也改变了,best条目也发生了变化

 看来ebgp的关系下,修改metric是需要特殊命令,但是也可以生效

 

再来看一下out方向

由于metric越小越优,那我们再把3.3.3.3的条目metric值加大到20

看下效果,always-compare-med肯定是要跟上的 

R3(config)#access-list 1 per 10.0.0.0
R3(config)#route-map med per 10
R3(config-route-map)#ma ip add 1
R3(config-route-map)#set me 20
R3(config-route-map)#exit
R3(config)#route-map med per 20
R3(config-route-map)#exit  
R3(config)#router bgp 300
R3(config-router)#nei 2.2.2.2 route-map med out //针对于邻居2.2.2.2应用out方向策略
R3(config-router)#bgp always-compare-med

R2上查看一下BGP表

 技术图片

 

 OK,妥妥的,没问题。

看来无认是IBGP,还是EBGP,对于bgp的med值(metric)来说,都是适用的,它是一个可选非传递的路径属性。 

 


7、ebgp优于ibgp

 技术图片

 

 

 如图所示,R7和R8R9都是ebgp邻居关系,

R8R9为IBGP关系,现在在R7上network一个条目,

R8R9都会收到,且会转给自己的IBGP邻居。

我们在R9上查看BGP表,看看会发生什么

 

实验EBGP+IBGP

R7(config-router)#network 100.1.1.0 mas 255.255.255.0

只在R7上宣告100.1.1.0网段,

此时R8 会将从EBGP学来的条目发给自己的IBGP邻居,R9,但是下一跳地址同样是R7,这个之前讲过,是IBGP的next-hop特性,

 技术图片 

我们还可以在R8上设置一个self,看看会有什么影响

 技术图片

 

 

 无论你改成什么,效果都是一样的,EBGP就是比IBGP更优。且会被放入到路由表中。

注意,此时比较的并不是管理距离,因为还没有到路由表那一步,

这是BGP在设计的时候就这么安排 的,因为BGP 的主要作用就是在AS之间传递。

  


8、优选next-hop最近的路由

这里说到的next-hop,其实指的是IGP协议的度量值 ,IGP的各协议参考依据是否还记得起来?

举例来说明 

 

 

 

 实验IBGP部份

 技术图片

 

 

 R4R5R6全部运行EIGRP协议,

然后由R4和R6分别宣告BGP条目,

R5上查看,

 技术图片

 

 

 此时优选走的是4.4.4.4

那么如何来查看哪边是到达next-hop的最近呢?

BGP中可以查看一下具体条目的明细 

Show ip bgp 10.0.0.0(具体条目的明细信息)

 

 

R5#show ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/24, version 7
Paths: (2 available, best #2, table Default-IP-Routing-Table, RIB-failure(17))
Flag: 0x4800
  Not advertised to any peer
  Local
6.6.6.6 (metric 409600) from 6.6.6.6 (6.6.6.6)
下一跳地址 metric值 来自6.6.6.6的更新RID为6.6.6.6
      Origin IGP, metric 0, localpref 100, valid, internal
     起源 IGP,i, med=0 本地优先级100 ,有效 ibgp
  Local
4.4.4.4 (metric 409600) from 4.4.4.4 (4.4.4.4)
来自4.4.4.4(RID4.4.4.4)的条目,下一跳为4.4.4.4
      Origin IGP, metric 0, localpref 100, valid, internal, best //最优,不是在这比出来的

 到这里你会发现,前面的都一样,到第8个选路原则的时候同样是比不出来的,

因为两条链路的metric是相同的,都是409600 

我们这样做,针对于eigrp协议,我们可以人为的干预其metric的数值,针对于接口修改bandwith 

现在最优的是4.4.4.4,那我们就把它这个接口的metric改大。

 技术图片

 

 

 图中所示,和R4相连的是f0/0口,

OK

R5(config)#inter f0/0
R5(config-if)#bandwidth 100  //不是修改的实际带宽,只是用做选路用

再来看一下BGP表,有没有其它的变化

 技术图片

 

 

 可以看到4.4.4.4 条目的metric值变大了,

eigrp中,参考的主要有带宽和延迟,metric越大,说明带宽越小,

带宽越小,在eigrp中才不会被优选,

所以EIGRP就会认为这是一个相对于R6而言较远的路径,

而对于BGP而言,next-hop也就更远,

谁近我就选择谁

 

实验EBGP部份

 技术图片

 

 

 

技术图片

 

 

 还是一样的情况,三个设备都运行了eigrp的底层协议,

然后,在其基础之上再运行ebgp,

可以看到在R2上查看BGP表,两个EBGP邻居发来的metric值 都是一样的.

 

其修改方式是一样的

就不在赘述了

 


9、BGP负载均衡

首先声明,这一条就不是用于做决策的,

当有两条全完一样的条目,(这里指的完全一样是有条件的),会将两个条目都放到路由表中,

实现负责均衡(当然,默认还是基于cef的负载均衡)

 

必须相同的路径属性包括   

   weight

   Local prefen

   As-path(不仅是长度相同,就连号码都要相同)

   Origin

   Med

   IGP distance  IGP的距离

 只有以上条件都一样时,才可以成为BGP 的负载均衡

当然还有一条比较废话的要求 ,

就是每条路由的next-hop不相同,//是不是很费话,一个人也不可能给我发两条同样的啊 

这里面的条件中包含了一个as-path,有了这个数据,就会很容易的想到,这是一个ebgp的关系,那IBGP会存在吗?当然会存在负载

 

实验EBGP部份 

技术图片

 

 

 R8和R9同时向R7宣告一个相同的网段,

看看会是什么样儿的,(其它的什么配置都不要做)

  技术图片

 

 

 

 这是正常情况下R7所收到的100.0.0.0的条目

我们可以对比一下之前所提到的值 ,

weight=0  localpre=空 as-path=89,号码相同,距离相同

origin code=i, med=0  IGP metric 都是 409600

条件满足,且不是一个next-hop地址

所以可以实现负载均衡 

但是功能默认是关闭的,需要我们手动的进行开启才OK 

R7(config-router)#maximum-paths 2    ///后面的2表示两条,最大可以有16条
在maximun-path后面还可以加ibgp关键字,如果不加默认只对EBGP有效

 

来看一下效果吧

 技术图片

 

 

  其它没有什么变化,

但是你会发现,在条目详细信息的最后面,出现了一个关键字,multipath,多路径

 查看一下路由表,看看传说中的负载均衡.

 技术图片

 

 

 出来了,出来了, 

可是,这里必须要加一个可是

 

有没有发现,即使是在路由表中出现了负责均衡,可是在BGP表中,只有一条被选为BEST,

那条没有被选中的条目,是不会传递给别人的.

 

实验IBGP部份

 技术图片 

对于IBGP的负责,和之前是一样的条件,

但唯独不同的就是最后的命令有些不同

R5(config-router)#maximum-paths ibgp 2

 技术图片

 

 

 No problem,妥妥的,出现了multipath关键字。

但由于IBGP的AD=200,eigrp=90,所以没能该条目放到路由表中。遗憾啊 

 


10、old bgp 关系越老越优

OLD 老的意思,越老越优先,越老交情越好,这里指的老,并不是设备老,而是建立BGP邻居的时间相对较老。 

注意,这一条原则,IBGP的环境是不支持的。 

不过通常我们是不让它选择这个的,因为不确认因素太多,

一般都是跳过,

只要咱们知道有这个事儿就行, 

配置让其跳过这个选项,直接进入下一个 

R5(config-router)#bgp bestpath compare-routerid
   BGP最优路径比较router-id (也就是第十一条)

 

  


11、rid越小越优

先声明一下在BGP中的router-id,其实和OSPF的一样一样的,

可以自动选举,也可以手动指定,通常我们都是手动指定的,用于标记设备用

 

那么当出现两条相同路径进行比较时,rid也是一项参考依据,RID越小的越优。

 技术图片

 

 

 技术图片

 

 

可以看目前优选的是4.4.4.4,具体是因为什么呢?

我们可以查看一下详细信息

 技术图片

 

 

 bgp表中的是下一跳地址(也就是所谓的更新源地址,因为我们使用的是loopback接口)

而在详细信息中显示的更加直接 ,()内的ID,是设备的RID。

 

那我们此时把4.4..4.4的rid改大,看会怎么样

R4(config)#router bgp 456
R4(config-router)#bgp rou 40.40.40.40

再到R5上来看看吧

 技术图片

 

 

 此时发现,修改过RID以后,就会出现神奇的一幕,

原来的best,变成了6.6.6.6

 


12、cluster-list越短越优

Cluster-list,即路由器射器所经过的ID数量 ,

cluster-list共生存在的还有一个属性,那就是orignitor,发起者。

我们先来了解一下什么是路由器射器

 

路由反射器的定义,

由于IBGP关系中存在防环机制(水平分割),也就是说一个BGP路由器从邻居处学习到的条目,不会发给它的IBGP邻居,

而路由反射器的出现,得以破解这个限制,

但是破解了,还要再加上自己的限制

1、 如果接收到条目中,会进行originator的地址,

如果和自己的想同,则拒收,

如果和自己的不同,则接收

2、cluster-list中显示的是每经过一个RR反射器就会加一个标记(用RID进行标记),和AS-PATH的方式一样,每经过一个都要加一个

  

通过一个实验来进行理解

说到这里也大概能知道了,这玩意儿,只出现在IBGP的环境中,因为EBGP根本就不存在反射器的必要。

路由反射器

 技术图片

 

 

 全网运行BGP

R4-R5为IBGP  R5—R6为IBGP,

那么如果此时R4有一个新的网段宣告进来,会怎么样?

R5上可不可以收到?  

R6上可不可以收到?

 

用事实说话

R4(config)#router bgp 456
R4(config-router)#network 4.4.4.0 mas 255.255.255.0

 可以看到4.4.4.0/24的这个条目,R5是没有问题的,

R6呢?

 技术图片 

连毛都没有,这就是IBGP水平分割的魔性,就是不给你.

 ,我们现在使用路由反射器

反射器共有两个角色   

   中转设备: 就是执行中转任务的设备

       客户端 : 中转设备的IBGP邻居

 

如上图所示,R5就成为了路由反射器,他需要将R4的更新过来的条目反射给R6

 

怎么操作呢?

其实很简单,就一条命令

R5(config)#router bgp 456
R5(config-router)#nei 4.4.4.4 route-reflector-client   //将4.4.4.4 设置为我的客户端

此时再到R6上查看一下BGP表

 技术图片

 

 

 有了,有了

 

但是别急,

这个条目可不一般哦~

来看一下它的详细信息

 技术图片

可以看到originator: 发起者为40.40.40.40,是R4,

cluster list 是5.5.5.5,经过的反射器只有5.5.5.5一台

 

那么问题来了

如果拓扑图是这样的,

 

实验1

 技术图片

 

 

 R1—R2直连,建立IBGP关系

R2—R3直连,建立IBGP关系

R1—R3非直连,建立 IBGP关系

R1宣告一个网段进来,R2做反射器,

R3会选择谁是最优路径 

 

R1(config-if)#router bgp 100
R1(config-router)#network 10.10.10.0 mas 255.255.255.0

 

R3上查看

技术图片

 

 

 看到了两条,有点一时间摸不到头脑有没有,

因为两个next-hop是一样的,

没关系,咱们进到详细信息里面看一下就知道了

 技术图片

 

 

 如果一个路径中携带了originator属性(始发者),那么就要用这条路径的originator值 和另一条路径的RID进行比较,,此时originator充当的是RID,

如果二者不相同,则遵循第十一条原则,RID小的优选

 

如果二者相同,则需要对比第十二项,cluster-list,

可以看到图中我进行了标记,

Cluster-list = 2.2.2.2,这说明两个问题,

 1 经过了反射器它的RID是2.2.2.2

 2 它只经过了这一个反射器

 

那么对比这个cluster-list后,不难发现,上面那条是经过反射学来的,

而下面这条根本就没有cluster-list的值 ,所以,被best了.当然会被优选.

 

 

实验2

 技术图片

 

 

 此图中R2为反射器,client---R1

       R3为反射器,clent---R1

       R4为反射器client---R3

 

R1更新条目,请问哪边为最优线路

 

R2(config-router)#nei 1.1.1.1 route-reflector-client 

R3(config-router)#nei 1.1.1.1 route-reflector-client 

R4(config-router)#nei 3.3.3.3 route-reflector-client

BGP表中啥也看不出来,我们必须要看详细列表

 技术图片

 

 

 技术图片

 

 

 这里就是所提到的,每经过一个cluster-list,就会有一个标记,其实学到这里,越来越觉得bgp是根据RIP来开发的,(开个玩笑) 

 


13、neighbor的ip越小的越优

 实验1

 技术图片

 

 

 

R2和R1,R3互为IBGP邻居,

此时,假设前面12条都比不出来,那么就要比较谁的IP小了

这时的IP,有些特殊,是在配置bgp时,neighbor指定的那个IP,

我们先把RID去掉,以确保能够达成实验效果

 技术图片

 

 

 为什么会是1呢?

咱们逐一来看,

因为之前并没有配置过任何的策略,

那我们也要从头到尾的看一下,

1weight ,都是0

2local pre 都是100

3本地优先,此时没有本地条目

4as-path,这是IBGP的环境不存在as-path

5origin 都是i的,

6med,没动过都是0

7ebgp优于ibgp,现在的环境没有EBGP

8next-hop最近的优选,此时并没有配置修改过metric,两端也是相同的

9BGP负载均衡,跳过,咱们都没有配置

10old bgp,这条咱们越过了

11 rid越小越优, ///唉,可以看一下RID,因为之前的RID,被我取消了,那么RID是可以自己选举出来的,看一下吧

 会发现,两台设备过来的RID都是10.10.10.10,咋整,继续往下比,

技术图片

 

 

 12cluster-list 此环境中不存在反射器

到了最后一条

13,neighbor的IP越小越优

技术图片

 

 

 来看一下我们是怎么指的neighbor

  ,终于找到了,在这儿呢~ 1.1.1.1<3.3.3.3,所以它被优先了,

实验2

技术图片

 

 不指定更新源,不配置lo 接口,,全部用直连建立 IBGP关系

R1和R3宣告网段,看R2上看到底是谁优选

 技术图片

 

 BGP表中,可以看到是12.0.0.1 被选为最优,

再来看看详细的信息

 技术图片

 

 最后再看的话,只能是看配置了,不防再多看一眼吧

 技术图片

 

 可以看到在建立邻居的时候,12.0.0.1就已经比23.0.0.3小了。所以才会优选它为最优

 

实验3

 技术图片

 

 使用 45.0.0.4 ----45.0.0.5

     54.0.0.4 ----54.0.0.5 进行直连,然后建立IBGP邻居

技术图片

 

  完全是遵照着我们的意思在前进,哈哈哈哈哈哈!!!


总结

13条选路原则,不是要你死记硬背,而是要熟练的掌握里面的奥妙,

而且它们是从上至下的顺序,如果说你要进行策略修改的话,最好是先从公认必遵的属性开始,这是个人的一个看法.因为相对要灵活一些,无论是in 还是out,都是OK 的.

 

 

--------------------------------------

CCIE成长之路 --- 梅利

 

以上是关于BGP的路由优选规则和负载分担的主要内容,如果未能解决你的问题,请参考以下文章

HCNA——负载分担路由备份

配置OSPF负载分担示例

静态路由实现路由负载分担

华为S5700系列交换机AR配置静态IP双链路负载分担

玩转华为ENSP模拟器系列 | IPSec网关负载分担双机热备,上下行连接路由器

2021-10-10