属性分类:
BGP的路径属性是对BGP路由特定的描述,是每个BGP Update数据包的一部分 ,描述了相关前缀的路径信息。BGP决策进程将属性及所描述的前缀结合在一起,对所有可以到达的目标网络的路径进行比较,选出最优的那一个。路径属性提供了基本路由功能必需的信息,例如该路由的Next_ Hop、 AS_ PATH等。BGP常用的路径属性有10个,可分成4类。如下图所示:
- 公认必遵( Well known Mandatory):所有BGP设备都可以识别此类属性,且必须存在于Update 报文中。如果收到的更新报文中缺少这类属性,BGP邻居关系会被重置。目前公认必遵的属性只有3个。
- 公认任意(Well-known Discretionary):所有BGP设备都可以识别此类属性,但不要求更新中必须携带该属性。即使缺少这类属性,邻居关系也不受影响,设备厂商可以*决定此种属性要否实现。
- 可选过渡(Optional Transitive):BGP设备可以不识别此类属性。如果BGP设备识别该属性,则转发该属性的更新。如果BGP设备不识别该属性,则查看该属性是否已设置了过渡标记,如设置了该标记则路由把该属性转发并通告给下游设备。
- 可选非过渡(Optional Non-transitive):BGP设备可以不识别此类属性。如果BGP设备不识别此类属性,且过渡标记没有被设置的情况下,则更新中不通告该属性,路由继续通告给其他对等体。
注意:
- BGP协议的属性众多,不同的属性所起的作用均不同,IETF定义不同的属性分类的目的是为了统一不同厂商BGP设备对属性的处理。
- 常用的可选属性中,MED、Originator_ID、 Cluster_list是非过渡属性,但目前几乎没有厂商不识别该属性,所以所有BGP设备都传递该属性给邻居。
常用的BGP属性共有10个,其属性类型及数值参考下表:
Origin属性:
Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:
- IGP:具有最高的优先级。通过路由始发AS的IGP得到的路由信息,比如通过network命令注入到BGP路由表的路由,其Origin属性为IGP。
- EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。(注意是EGP协议,不是eBGP)
- Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。
说明:
-
在BGP路由表中,i表示由IGP学到的路由。e表示该标识只能手工地调整。由于EGP协议几乎没有使用,因此很难看到该标识。?表示由外部引入到BGP的路由。例如:100.1.1.0/24位network引入,200.1.1.0为import引入。
-
当有多条来源不同的范围相同的路由时,按照IGP>EGP>incomplete,顺序选择。
-
聚合路由的起源属性可以是IGP,也可能是incomplete,这依赖于聚合路由的成员路由的起源属性。如果成员路由的origin 属性都是IGP,则聚合路由的起源属性为IGP。如果成员路由的origin 属性是incomplete,则聚合路由的起源属性为incomplete。 而如果有些成员路由是IGP, 而有些成员路由的属性是incomplete, 则生成的聚合路由的起源属性是incomplete。
-
当一条路由条目产生了,那么除非人为进行修改,否则起源是不会变化的(例如?不会因为BGP邻居关系传递变为i)。
AS-Path属性:
AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。当BGP路由器从EBGP对等体接收路由时,如果发现AS_Path列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。当BGP Speaker本地通告一条路由时:
- 当BGP Speaker将这条路由通告到其他AS时,便会将本地AS号添加在AS_Path列表中,并通过Update消息通告给邻居路由器。
- 当BGP Speaker将这条路由通告到本地AS时,便会在Update消息中创建一个空的AS_Path列表(因为必须带有此属性)。
当BGP Speaker传播从其他BGP Speaker的Update消息中学习到的路由时:
- 当BGP Speaker将这条路由通告到其他AS时,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。收到此路由的BGP路由器根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
- 当BGP Speaker将这条路由通告到本地AS时,不会改变这条路由相关的AS_Path属性。
因此,在上图中,当R4将网段10.0.0.0/24通告给AS400和AS100时,会在AS_PATH中添加自己的AS号。当R5将网段10.0.0.0/24通告给AS100时,也会添加自己的AS号。当AS100内的R1、R3和R2之间将网段10.0.0.0/24相互通告时,AS_PATH属性不会改变,在其他BGP选路条件相同的前提下,BGP会选择AS_PATH路径最短的,即选择通过R3直达R4的路由。另外AS_Path还有防环的作用,接收到相同AS号的条目标记为无效。
AS_ PATH除了能够防环外,还可以根据AS_PATH的长度决定选择最优路由BGP的AS_ PATH属性内容是由segment 构成的,有4种segment类型,分别是AS_ SET、AS_ SEQUENCE、 AS_CONFED_SET、AS_ CONFED_ SEQUENCE。后两种segment类型仅出现在BGP联盟中,每种segment类型在AS_ PATH 属性中仅能出现一次。AS_ PATH属性见下表:
注意点:
- 一般不建议对AS_ PATH做任何删/改行为,这易于导致路由环路。但管理员可根据需要添加重复的AS号到AS_ PATH中以增加AS_ PATH的长度,继而影响远端设备选路。
- 使用命令peer [ ipv4-address] public-as-only发送eBGP报文时,仅携带公有AS号。
- 在互联网中只有公有AS号可以直接在Internet.上使用,私有AS号直接发布到Internet.上可能造成环路现象。为了解决上述情况,可以在把路由发布到Internet前,配置发送eBGP更新报文时,AS_ PATH 属性中仅携带公有AS号。
- 通常情况下,一个设备只支持一个BGP进程,即只支持一个AS号。但是在某些特殊情况下,例如网络迁移更换AS号的时候为了保证网络切换的顺利进行,可以为指定对等体设置一个伪AS号,对方将会使用该伪造AS号与之建立邻居,同样可以起到隐藏自身真实AS的作用。使用命令peer [ipv4-address] fake-as fake-as-number配置eBGP对等体的伪AS号。例如:原BGP进程为200,使用命令peer 2.2.2.2 fake-as 100,将会与对等体2.2.2.2使用伪造的AS 100来建立邻居。
- 如果在路由进程中配置了AS_ PATH_limit命令,接收路由时会检查AS_ PATH属性长度是否超限,如果超出则丢弃掉路由。缺省情况下AS_ PATH长度为255,最大限制值可以调整为2000。
Next_Hop属性:
Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则:
- BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
- BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
- BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。
实验:
目的:
R1和R4的AS号为1,R2的AS号为2,R3的AS号为3,直连路由器建立EBGP或者IBGP邻居关系,并且创建对应的回环口并通告进入BGP中。现在检查EBGP和IBGP对等体交互后nexthop属性的变化过程。
过程:
R4发送给R2的报文:当R4自己产生的时候,下一跳为:0.0.0.0,表示为本地产生的路由条目。
当发送给R2的时候,下一跳改变为了自己:
当R2发送给EBGP对等体的时候,下一跳会改成自己的IP地址:
当然,在R2将R1的路由条目发送给R4的时候,下一跳是不会改变的,IBGP邻居之间改变下一跳除了使用对应的命令,否则就是自己通告的路由0.0.0.0修改为下一跳的自己与对方建立邻居关系的IP地址了。如下是R4发送给R2的路由信息:
从R1和R3收到的路由条目的下一跳都没有改变为自己。修改下一跳的时候是自己设备上进行相应属性的修改。
为什么IBGP邻居的下一跳一般不改变,而EBGP邻居之间的要改变呢?一般是如果EBGP邻居之间下一跳不设置为自己,对方收到条目后没有对应下一跳的IP地址,然后就会认为此条目无效,丢弃。而IBGP之间一般是在一个AS中,一般路由器都有这个AS中的所有路由(通过IGP计算)所以直接通过迭代计算BGP条目即可,不用每次发送的时候修改,当然有些情况下也有可能没有下一跳的路由条目,例如这个条目是从EBGP邻居发送来到,再通过IBGP邻居发送给内部设备,这时候就需要在AS的边缘BGP路由器上配置:
[R2-bgp]peer 10.1.24.4 next-hop-local //以R2传递给R4为例子
关于nexthop属性所带来的问题:
-
路由黑洞问题:
从数据平面分析,如果数据流访问目标BGP网络,R5根据下一跳,发给R2,但中间IGP路由器R3和R4没有对应的BGP路由,所以会出现路由黑洞。
解决路由黑洞问题的办法如下:
方法1:在R2和R5间为下一跳地址所对应的路由创建LSP隧道,保证所有发往下一跳地址的数据包经中间网络时执行标签转发,此种方法要求开启MPLS标签交换。
方法2:在AS200中,把R3和R4也配置为BGP路由器,此时可不再需要IGP协议。此种实现在运营商网络中使用较多。
方法3:重新设计网络拓朴,把R2和R5直连,使拓扑变为下图所示,这样AS间的数据访问流量将不需要经过IGP路由器,完全使用BGP骨干路由器访问,越过IGP:
方法4:在R2.上将BGP路由引入IGP,保证路由全网可达。此种方法不建议使用,过量的BGP路由会加重IGP路由器的负荷,同时IGP路由也不适合承担过大的AS间数据访问流量。可以根据需要引入少量路由或对引入的路由做必要的汇总。 -
负载分担问题
BGP也提供类似IGP的负载分担技术,但默认BGP路由仅能出现–条路由在IP路.由表里。如果IGP是负载分担的路径,则可以保证数据从R5到R2经过多路径到达R2。
Loacl_Pref属性:
- 该属性仅在IBGP对等体之间有效,不通告给其他AS(EBGP邻居之间不会传递)。它表明路由器的BGP优先级。
- 该属性用于判断流量离开AS时的最佳路由。当BGP路由器通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。
- 默认是100,不存在时按照100进行处理。什么时候不存在:自己引入的条目和EBGP邻居发送来的时候,IBGP邻居发送来接收后默认为100。数值范围是0~2^32-1,数值越大,该路由越好。
- 例如在如上拓扑中控制路由R1去往R6的路由一般是在R2,R3上进行修改,出栈时一般使用本地优先级,也比较方便。
在上图中:AS100内,R1,R2和R3之间分别两两建立IBGP对等体关系,而R2和R3分别和位于AS200和AS300的路由器建立EBGP对等体关系。这样路由器R2和R3都会从自己的EBGP对等体收到10.0.0.0/24这条路由,为了让AS100内的三台路由器优选R2作为10.0.0.0/24这条路由在本AS的出口,我们只需要在R2和R3上适当的对该路由的Local Pref属性进行修改,R2上路由优先级高于R3,发送给R1后,R1会选择R2发送来的路由,就可以达到目的。
实验:
目的:
R1和R4的AS号为1,R2的AS号为2,R3的AS号为3,直连路由器建立EBGP或者IBGP邻居关系,并且创建对应的回环口并通告进入BGP中,现在验证哪些条目没有本地优先级。
过程:
R1上所有条目都不存在本地优先级,因为没有IBGP邻居产生的条目:
在R4上应该只有4.4.4.4没有本地优先级(自己产生的),其他条目都有本地优先级,因为是IBGP对等体产生的:
MED属性:
MED (Multi Exit Discriminator)多出口区分符,属于可选非过渡属性,也被称为外部度量,与IGP的cost值类似, MED是一个4个Byte的数,数值范围为0-4294967295。多用于判断流量进入AS时的最佳路由,在其它条件相同的情况下,MED值越小,路由的优先级越高。
MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。如果没有手工配置,什么时候MED值会存在?也就是条目时自己引入或者MED值通过EBGP邻居关系传递给的第一个AS区域时会带有,但不会传递给第三个AS中。
上图中R1和R2将网段10.0.0.0/24传递给各自的EBGP邻居R3和R4,R3和R4在其他条件相同的情况下,优先选择MED值较低的路径,即均选择经由R1访问网络10.0.0.0/24。
注意:
路由器默认只对相同的AS传递过来的路由进行MED的比较,不会比较不同AS传递的路由,华为设备可以使用命令compare-diferent-as-med来使其比较不同AS传递的路由。
实验:
目的:
R1和R4的AS号为1,R2的AS号为2,R3的AS号为3,直连路由器建立EBGP或者IBGP邻居关系,并且创建对应的回环口并通告进入BGP中,现在验证哪些路由带有MED,哪些没有带有。
过程:
R4上查看,MED值应该是有所有条目都带有,默认为0,因为4.4.4.4时本地产生的、其他三个回还口路由时从EBGP邻居学习而来的。
再R1上查看发送通告给R2的路由条目(MED值):
可以看到只有发送的自己产生的条目1.1.1.1有MED值,为0,从其他AS接收的路由再发送时都不会带有MED值(MED值传递不能跨多个AS传递)。
团体属性:
Community团体为可选过渡属性,用于标识具有相同特征的BGP路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。一个目标地址作为一个目的地团体的成员,这些目的地共享着一个或者多个特性,Community 属性有4个Byte,可自定义其中的数值,RFC1997中定义了前面2个Byte为自治系统号,后面2个Byte是管理.上的表示符,格式为AA:NN,可以用十进制和十六进制来表示该属性。在团体属性值当中,0(00000000) ~65535 (0x000FFFF) 和从4294901760 (0FxFF0000) ~ 4294967295(0xFFFFFF)是被保留的,在此预留之外定义了几种公认团体属性。见表所示:
除了公认的团体属性以外,还可以定义私有的团体属性,用于特殊用途。RFC1998做了定义,这份RFC描述了在服务提供商网络中,利用团体属性操控BGP路径选择。控制BGP路由时,可以利用团体属性的前两个字节作为AS号,用后面的2个Byte定义与该AS相关的数值,比如服务提供商的AS号为100,这个提供商可以用100:1 来表示,100表示该团体的特点服务提供商,而1表示一组对等路由器的地址。多条路由可以拥有相同的团体属性,路由器需要对这些路由实施策略时可以对该团体属性进行匹配,实际上就是对拥有该团体属性的路由进行策略修改。-条路由也可以拥有多个团体属性,如果发现携带了多个团体属性的路由,BGP路由器可以根据其中的一部分或者全部属性采取相应的策略动作,传递给其他对等体的时候,BGP也可以添加或者修改团体属性。
拓展团体属性:
扩展团体属性是对BGP团体属性的扩展,主要区别如下。长度为8Byte, 并不像标准的团体属性仅代表数值,扩展团体属性由类型字域和数值部分构成; 1~2Byte 的类型字域,剩余部分是数值部分,如下图所示。
例: Route Target,前面2Byte代表类型,后面6Byte代表数值。扩展团体属性主要在MPLS VPN部分多有涉及,此处不过多介绍。
Originator_ ID属性和Cluster_ List 属性:
Originator_ ID 和Cluster_ List 为可选非过渡属性,由路由反射器( route-reflector)使用,路由反射器也简称RR,RR将在后面章节进行详细描述,这两个属性是专为RR开发的,用来在AS内防止环路。
Originator_ ID属性值是AS内第一台通告该路由的BGP路由器的Router_ ID, 该值由RR添加到路由更新中,并随路由在AS内传递,直至离开AS时被剥离掉。Originator_ ID属性用来在Cluster (集群)内防环,如果路由器看到接收到的路由中的Originator_ ID 等于自己的BGP Router_ ID, 就说明存在环路,该路由将会被丢弃掉。
Cluster_ List是路由经过RR反射时由RR添加的一个群列表,记录路由经过的Cluster_ ID (集群ID)。如果路由反射器在接收到路由的Cluster_ list 中发现了自己的集群ID,就说明存在环路,将路由丢弃,Cluster_ List 属性用于集群间防止路由环路。
PrefVal属性:
PrefVal是Preferred-Value的简写,区别于前面介绍的其他属性,首选权值是华为设备内部分配给路由的权值,它并不是在路由更新中可传递的BGP标准属性。
任何出现在华为BGP表中的路由都会被分配PrefVal,它只在一台路由器内部使用,不会传递给其他的路由器,这个值为0~65535范围的一个数,值越大越优先,缺省情况下所有路由的首选权值为0。可以为独立的路由或从一个特定的邻居学习到的路由设置该值,用来影响路由器的选路。该属性在本地有意义,作用效果也仅影响本路由器的选路,无法影响其他路由器的选路。
Aggregator和Atomic Aggregate属性:
Atomic-Aggregate属性:属于公认任意属性,主要用于路由聚合时,如果聚合路由将所有明细路由抑制了,就会为聚合路由生成该属性。使用该属性也有一种警告作用,用于告知对等体,原始的明细路由AS_ PATH 出现了丢失。
Aggregator属性:属于可选过渡属性,该属性作为Atomic-Aggregate 的补充,指明路由信息是在何处出现了丢失,该属性包含发起聚合路由的AS号及生成聚合路由的BGP通告者的RouterID ( 又称为Aggregator ID)。
参考资料:华为hedex文档、《HCIE路由交换学习指南》