HCNP Routing&Switching之BGP路由属性和优选规则
前文我们了解了BGP防环机制和路由聚合相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15458110.html;今天我们来聊一聊BGP路由属性和选路规则相关话题;
BGP路由属性
先来看一看BGP路由表
提示:BGP路由表主要显示了BGP路由,其中主要由路由状态代码,目标网络地址,下一跳,med属性值,本地优先级,路由首选值,以及路由的AS_path和起源属性组成;状态代码中,星号(*)表示该路由可用,如果没有星号,表示该路由不可用,一般情况不可用的BGP主要有下一跳地址不可达,即没有去往下一跳的路由;其次还有可能是对应路由已经在IGP路由里学习到了,因为IGP路由的优先级要比BGP高,所以在ip路由表里存在的就是IGP路由,而对于BGP来说,就不可用(因为有IGP路由更优);大于号(>)表示最优路由,即当一个网络有多个下一跳时,首选的路由;d表示,抑制,惩罚;即对应路由有惩罚机制;BGP路由是有惩罚机制的,如果一条路由不稳定,一会好,一会不好,此时对应路由就可能被惩罚(如果开启了惩罚机制);即惩罚一段时间不可用,等惩罚时间过去以后,对应路由才会从抑制状态变为可用;s表示抑制,即该路由不被通告给其他邻居;只存在本地bgp路由表中;起源属性(Origin),i表示本地宣告,即network宣告的路由;?表示导入外部路由,即引入宣告的路由;e表示从egp学习到的(BGP前身,目前已被淘汰);起源属性优先级是本地宣告大于引入 宣告;
BGP路由属性分类
提示:BGP路由属性主要从公认属性和可选属性分类,其中公认属性中又分必选和可选;可选属性中有分可过渡和非过渡;公认必遵表示所有BGP都可以识别的属性,并且是必须存在Update消息中的;比如起源属性,as_path,下一跳这些属性就是所有BGP路由器在更新消息中必须要有的属性;换句话说这些属性是不可省略,必须存在;公认任意就是指所有bgp路由器都可以识别,当不要求必须存在update消息中,即这些属性可以存在,也可以不存在,取决对应路由的需求,不是必须强制要求存在update消息中;比如本地优先级,自动聚合;可选过渡是指不被所有BGP路由器识别,如果无法识别,对应属性是可以正常传递给邻居的;比如手动聚合,团体属性;可选非过渡是指不能被所有BGP路由器识别,如果不能识别,则对应属性丢弃(只是对应路由的对应属性丢弃,并不是对应路由被丢弃);比如med,med就类似ospf里的开销,这个属性在bgp里是私有属性,所以不是被所有BGP路由器识别(华为是med,思科是metric,但两者作用都是一样的);
BGP路由属性图解
1、PrefVal:优选值,数字越大越优先;默认0;私有属性,主要作用是定义本地路由的优先级,作用范围只限于本地有限,不传递给邻居;
提示:当去往同一网络有多个下一跳时,我们可以通过调整很优选值来影响去往对应网络的路由;如上所示,我们希望RTA去往RTD经过RTC,那么我们可以将RTA去往RTC的首选值调大;
2、Origin:起源属性,主要用来描述对应BGP路由的产生方式;
提示:起源属性优先级顺序是,本地通过network宣告的路由,要优于引入宣告的路由;
3、AS_Path:AS路径,主要用来描述BGP路由在传输的路径中所经历的AS的列表;该属性会在EBGP传递时更新(即传递给EBGP邻居时,会在对应路由更新中加上自己所在AS的号码),同时AS_Path这个属性也是EBGP防环的一个属性,即丢弃AS_Path属性中包含本端as号的路由;该属性是数量越少越优先(一个as我们可以理解为RIP里的跳数,经过多跳数越小,对应路由就越优);as_path除了能够防止as间环路,同时它也可以用作路由过滤,比如as_path filter;
提示:如上图所示,针对as100去往RTA,如果从RTA--->RTB--->RTD--->AS100,那么对于AS100收到的路由更新中对应AS_path的值为65201,65223,65101;如果从RTA--->---RTC--->AS100,对应as100收到RTA的路由更新中as_path的值为65330,65101,相对于上面的路由,对应AS_Path的长度要略小,所以as100去往RTA会经过RTC到达RTA,而不会走经过RTD,RTB在到达RTA;
4、Next Hop下一跳,主要用来描述对应去往目标网络的下一跳属性 ,即发出路由更新的路由器(更新源);
提示:如上所示,RTD发布路由更新,对应下一跳就会是本地出接口ip地址(如果是物理口建立邻居),而对应IBGP类型邻居,默认更新不会更改更新源,即RTC收到RTD的路由更新,对应下一跳还是RTD,即RTC向EBGP发送对应路由更新,其下一跳不会更改为RTC,而还是RTD;对于RTB收到RTC的路由更新,因为RTB和RTA是EBGP邻居,所以RTB收到RTC的路由更新以后,会把对应的下一跳修改为自己,然后再传递出去;同样的道理,RTA收到RTB的路由更新,因为RTA和RTF或RTE是IBGP邻居,所以RTA收到RTB的路由更新以后,向邻居传播时,它不会更改更新源,即下一跳地址还是会是RTB;所以我们在RTF看到去往8.0.0.0/24的路由里,对应下一跳属性会是RTB的接口地址;
5、Local-Preference:本地优先级,该属性值在IBGP邻居传递,数字越大越优先,默认是100;主要用于控制流量怎样流出AS,即对出站路由的控制;
提示:如上图所示,对于RTD要想去往RTA的路由,我们可以在RTC或RTB上更改本地优先级属性来影响RTD去往RTA的路由路径;如果我们想要让RTD的流量经过RTC到达RTA,那么我可以在RTC上将对应本地优先级属性调大,从而达到影响as65101的出站路由;
6、MED:Multi-Exit-DISC,该属性类似IGP里的度量值(cost),主要用于区别到达同一邻居AS的多条入口链路;数字越小越优先;该属性仅在相邻的两个AS之间传递,收到此属性的AS不会在通告给任何其他第三方AS;该属性常用语控制流量怎样进入AS,即控制AS入站路由;
提示:如上图所示,我们想要控制AS65330的入站路由,我们可以在RTB和RTC上修改med的值,如果我们希望AS65101和AS65330之间的流量走RTB,我们可以将RTC的med调大,或者降低RTB的med值,从而让RTA学习到的路由对应下一跳为RTB;默认情况下,不允许对比来自不同AS邻居的路由信息中的med值,除非能够确认不同AS采用了同样的IGP路由选择方式,我们可以使用命令compare-different-as-med来比较不同AS邻居的MED值;如下所示
提示:针对192.10.0.0/16这个网络来说,它从as500和as600发送的MED不会被as700作为选路对比条件;因为med只会被来自同一AS到达多个相邻邻居入站路由对比条件;像这种不同AS是不被采用;当然如果能够确定AS500和as600都是使用相同的IGP路由协议(比如都是用ospf作为IGP路由协议)和路由选择方式(路由策略等),那么我们也可以使用命令compare-different-as-med来对比来自不同AS中med的值;
BGP路由优选规则
BGP选路规则分三种情况
1、如果该路由到达目的地的路由是唯一的,则直接优选;
2、如果达到同一目的地的多条路由,优选优先级最高的,即比较优先级,优先级最高被优选;
3、如果达到统一目的地的且具有相同优先级的多条路由时,则使用如下更细的原则比较
提示:BGP路由优选的首要条件是对应路由的下一跳必须可达,即只会在BGP路由表中对应路由有星号的路由上进行优选;满足下一跳可达的前提下,首先优选首选值(Preference_Value)最高的路由(该属性为私有属性,仅在本地有效,一般不常修改来影响路由选路);如果首选值一样,则对比本地优先级(Local_Preference),本地优先级最高的路由被优选;如果本地优先级一样,则比较聚合方式,聚合方式是手动聚合大于自动聚合,大于本地network宣告,大于引入宣告,大于从邻居学习到的路由;如果聚合方式一样,则比较AS_Path长度,AS_Path最短的路由被优选(这里的AS_Path最短是指经过的as数量最少,并非as号码长度);如果AS_Path长度一样,则比较起源属性,起源属性优先级是本地宣告大于引入宣告;如果起源属性也一样,则比较来自同一AS的路由,优选MED最小的路由;如果MED也一样,则比对邻居类型,邻居类型优选顺序是EBGP类型邻居大于IBGP类型邻居;如果邻居类型也一样,则优选AS内部IGP的开销最小的路由;即比较去往对应下一跳的开销;去往对应下一跳开销小的路由被优选;如果去往对应下一跳的开销一样,则比较cluster_list,优选cluster_list最短的路由,如果cluster_list长度一样,则优选orginator_Id最小的路由;cluster_list和orginator_id这个是路由反射器中的属性,目前不特别介绍;如果上述属性都一样,则比较router-id,优选router-id最小的路由器发布的路由;如果router-id也一样,则优选ip地址最小的邻居学习到的路由;
从上面的BGP路由优选规则来说,BGP不管怎样它都会选出一条最优的路由来,在BGP里没有等价路由;默认情况下BGP是不允许有负载分担的,即负载分担的功能是关闭的;当然如果在满足上述前9条规则的前提下,且AS_Path是一模一样(当然AS_Path不一样,我们也可以使用命令忽略AS_Path不一样的情况,强制开启负载分担;在bgp进程模式下使用load-balancing as-path-ignore来忽略as_path不一样的情况;),我们可以视为对应路由为等价路由;可以使用命令开启BGP负载分担功能(在bgp进程下使用maximum load-balancing 2开启负载分担,默认只允许1路负载,最大支持8路负载);
BGP聚合方式对选路的影响
提示:默认情况下,如果手动聚合和自动聚合开启了,对同一网络路由的聚合如果不是一样,则手动聚合和自动聚合不冲突;如果自动聚合和手动聚合,聚合后的路由一模一样,则手动聚合优先级高于自动聚合;如上图所示在RTB上开启了自动聚合,同时也手动聚合200.0.0.0/24;此时手动聚合和自动聚合后的路由一模一样,则优先通告手动聚合后的路由,对于自动聚合的路由不会通告给任何邻居;
邻居类型对BGP选路的影响
提示:如上图所示,对于RTA来说,它从RTC通过EBGP学习到达200.0.0.0/24网络,同时也从RTB通过IBGP学习到达200.0.0.0/24的路由;此时RTA会优选通过EBGP邻居类型学习到的200.0.0.0/24的路由;原因很简单,因为RTB和RTA是IBGP邻居;即在同一AS内;那么对于同一AS内的路由器来说,路由更新只传递一跳,如果RTB从内部其他路由器学习到200.0.0.0/24的路由,此时是不会发送给RTA的;所以RTB能够学习到达200.0.0.0/24网络的路由,肯定是从其他AS学习过来的;这样一来,RTA从其他as直接学习到达200.0.0.0/24网络的路由,肯定优于RTB从其他AS学习到达200.0.0.0/24网络路由后,再次传递给RTA;所以BGP选路原则中对于同一目标网络来说,从EBGP邻居学习到的路由要优于从IBGP邻居学习到的路由;
AS内部IGP开销对BGP选路的影响
提示:如上图所示,针对200.0.0.0/24网络来说,RTA通过BGP能够学习到达200.0.0.0/24网络的下一跳有两个;在其他条件都一样的情况下,此时内部asIGP的开销是可以作为BGP选路的一个评判标准;如图RTA如果走RTB,则对应链锯的带宽为50M,而走RTC则对应链路带宽为100M;很明显走RTC的链路更优;所以在其他条件都一样的情况下,对比去往对应下一跳的开销就作为选路的标准;即as内部IGP开销越小,对应链锯就更优,对应的BGP路由也就更优;
Router-ID与IP地址对BGP选路的影响
提示:如上图所示,如果在优选值,本地优先级,聚合方式,as_path,起源属性,med以及内部IGP开销对比都一样的情况下;此时会对比对应路由的router-id;即发送对应路由的路由更新路由器id,router-id最小被优选;如图,对于RTA去往200.0.0.0/24的路由来说,在RTA的BGP路由表中会有三个下一跳,一个是RTC,两个为RTB(RTB和RTA建立两个邻居,所以对应下一跳也会有两个);首先在三个下一跳中对比router-id,router-id小者被优选;所以RTC不会被优选(router-id大于RTB);但对于RTA来说,下一跳为12网段和21网段的router-id都是同一路由器,所以router-id一样;此时比较ip地址,ip地址最小的被优选;所以对于RTA去往200.0.0.0/24网络的的最优路由是下一跳为10.1.12.2,而非10.1.21.2;原因就是10.1.12.2小于10.1.21.2;