在学习BGP的选路原则前,我们需要先了解下BGP的属性
BGP属性
公认属性:所有BGP路由器都必须识别用支持的属性
公认必遵属性:BGP的Update消息中必须包含的属性
公认任意属性:不必存在于BGP的update消息中,可以根据需求自由选择的属性
可选属性:不要求所有BGP路由器都能识别的属性
可选过渡属性:BGP不能识别该属性,但是可以接受该属性并将其发布给其他邻居的属性
可选非过渡属性:BGP可以忽略包含该属性的消息并且不向它的邻居发布。
BGP的选路原则(优选原则)
BGP路由器将路由通告给邻居后,每个BGP邻居都会进行路由优选,路由选择有三种情况:
1.该路由是到达目的地的唯一路由,直接优选。
2.对到达同一目的地的多条路由,优选优先级最高的。
3.对到达同一目的地且具有相同优先级的多条路由,必须用更细的原则去选择一条最优的。
一般来说,BGP计算路由优先级的规则如下:
1.丢弃下一跳不可达的路由。
2.优选Preference_Value值最高的路由(私有属性,仅本地有效)。
3.优选本地优先级(Local_Preference)最高的路由。
4.优选手动聚合>自动聚合>network>import>从对等体学到的。
5.优选AS_Path短的路由。
6.起源类型IGP>EGP>Incomplete。
7.对于来自同一AS的路由,优选MED值小的。
8.优选从EBGP学来的路由(EBGP>IBGP)。
9.优选AS内部IGP的Metric最小的路由。
10.优选Cluster_List最短的路由。
11.优选Orginator_ID最小的路由。
12.优选Router_ID最小的路由器发布的路由。
13.优选具有较小IP地址的邻居学来的路由。
从上到下依次选择,匹配后就停止选择。
1.next-hop属性,下一跳属性
这是公认必遵属性,BGP本身不产生路由,它只是路由的搬用工,所以BGP路由在传递的时候,需要携带下一跳地址,同时并根据实际情况修改下一跳地址。
从EBGP邻居收到的路由传到IBGP邻居时,下一跳不变,需要手动peer x.x.x.x next-hop-local来修改下下一跳
从EBGP邻居收到的路由传到EBGP邻居时,自动修改下一跳
从IBGP邻居收到的路由传递到EBGP邻居时,自动修改下一跳
从自身始发的路由传递给所有BGP邻居时都会自动修改下一跳地址
下一跳的取值:为本设备与邻居建立BGP邻居的peer ip的地址。
2.Preference_Value
这是协议首选值,华为的私有属性,只具有本地意义(本台路由器有效),缺省值是0,取值范围在0-65535,数值越大越优先。
针对发送给BGP邻居的路由,无法修改这个属性,因为只对本地有效,该属性不会在update报文中传递
针对接收的BGP邻居的路由是可以修改该属性
做个实验
现在去往192.168.1.0的路由可以有2条路12.1.1.1和4.4.4.4 现在优选的是12.1.1.1 那么现在我们修改下协议优选值来改变这个路径。
R2上修改从4.4传来的192.168.1.0的pre优选值就可以改变R2的选路路径
我们在R2上可以看到pre的值已经改成1000 并且选路也选择了4.4的路径。
但是从R4上看到从2.2传来的192.168.1.0的路由pre首选值还是0,没有修改.
3.local-preference本地优先级
这个本地指的是本AS自治区域内。
这是公认任意属性,该属性只能在一个AS内部传递,跨AS无效。缺省值是100,数值越大越优,取值范围是0-42.94亿(4字节)
从EBGP邻居收到的路由该属性默认是空,按照100对待。
做个实验
R1:
route-policy 1 permit node 10
if-match ip-prefix 192.168.1.0
apply local-preference 1000
#
route-policy 1 permit node 20
ip ip-prefix 192.168.1.0 permit 192.168.1.0 24
[AR1-bgp]peer 12.1.1.2 route-policy 1 export
//发送给12.1.1.2邻居的路由通过route-policy进行过滤
通过抓包发现,即使修改了路由条目的本地优先级数值,但是在跨越 AS传递时也不会携带这个属性,因此跨AS无效。
在R2上进行过滤
R2:
route-policy 1 permit node 10
if-match ip-prefix 192.168.1.0
apply local-preference 3000
#
route-policy 1 permit node 20
[AR2-bgp]peer 4.4.4.4 route-policy 1 export //发给4.4.4.4的路由条目进行过滤
可以看到R4中的2.2传来的路由就改成了30000,所以在IBGP中传递update报文时候,可以写到本地优先级的属性。
4.本地始发的路由优于邻居传来的路由
R1上把静态宣告进bgp,然后在R2上也宣告进去一个相同的静态。
那么在R2中可以看到,0.0的是本地始发的优于邻居传来的路由
那么如果很多条都是本地始发的怎么办?
多条本地始发的路由,要遵循 手动聚合>自动聚合>network>import-route
自动聚合:只能自动聚合import-route进来的路由,并且这个明细路由必须是best路由。
自动聚合:summary automatic
手动聚合:aggregate 聚合后地址
5.AS_Path短的优先
这是一个公认必遵属性
作用:1.用来记录每条BGP经过的AS,在选路的时候优选个数最少的。
2.还可以用来防环。当路由器接受到BGP路由时候,会检查as-path的属性中是否携带了本AS,若携带则认为环路拒收。
在R5上可以看到192.168.1.0经过了AS1--AS234
针对IBGP邻居发出和发来的路由都可以进行修改,针对EBGP邻居发来和发出的路由都可以进行修改。
来做个实验
在AS1后面再添加一个AS8
[AR2]ip ip-prefix 1 permit 192.168.1.0 24
[AR2]route-policy as-path permit node 10
[AR2-route-policy]if-match ip-prefix 1
[AR2-route-policy]apply as-path 5 5 5 5
^
Error:Incomplete command found at '^' position.
[AR2-route-policy]apply as-path 5 5 5 5 ?
INTEGER<1-65535> AS Number to be appended or replaced
STRING<3-11> <1-65535>.<0-65535>
additive Append to original As Number \\增加
overwrite Overwrite original As Number \\覆盖
[AR2-route-policy]apply as-path 5 5 5 5 additive
[AR2-bgp]peer 4.4.4.4 route-policy as-path import
所以我们在使用as-path属性选路的时候,会在EBGP邻居接受和发送的时候进行修改,并且修改的as号必须要用本AS号,避免该路由条目在传递过程中被防环机制拒绝。
apply as-path none overwrite //代表将这条路由的as-path属性清空
apply as-path 5 5 5 5 additive //代表在原有as-path属性的基础上,在左侧新增as号
apply as-path 4 4 4 4 overwrite //代表使用新增加的as号覆盖原有的as号
peer 45.1.1.5 allow-as-loop 1 //从该peer收到的路由条目中,as-path属性可以允许存在一个本地as
bestroute as-path-ignore //忽略as-path优选条件,继续向下进行比较
6.Origin起源属性
这个也是个公认必遵属性
用来描述BGP路由时如何进入BGP的
network import-route 手动聚合 自动聚合
i:network
?:import-route 聚合
e:从EGP引入来的(自然情况下见不到了)
规则:i>e>?
7.同一AS的路由,优选MED值小
MED值可以理解为bgp的cost值或者是度量值
取值范围是0~42亿 越小越优
8.EBGP>IBGP
从EBGP邻居发来的路由优于从IBGP邻居发来的路由。