BGPv4特性探究-3@MED和AIGP路由属性-RFC4451/RFC7311
个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
- 关于BGP version4相关内容,可参考2006年发布的RFC4271-A Border Gateway Protocol 4;
- 关于BGP Route-Reflect相关内容,可参考2006年发布的RFC4456-BGP Route Reflection:An Alternative to Full Mesh Internal BGP;
- 关于BGP Confederations相关内容,可参考2007年发布的RFC5065-Autonomous System Confederations for BGP;
- 关于BGP可通告Capability相关内容,可参考2009年发布的RFC5492-Capabilities Advertisement with BGP-4;
- 关于4字节AS Number相关内容,可参考2012年发布的RFC6793-BGP Support for Four-Octet Autonomous System Number Space;
自动换行
其他相关资料:
- 关于BGP的Capability Codes详细参数,可参考IANA发布的Capability Codes;
- 关于BGP的其他参数字段的详细内容,可参考IANA发布的Border Gateway Protocol (BGP) Parameters;
- 关于BGP的AFI相关参数,可参考IANA发布的Address Family Numbers;
- 关于BGP的SAFI相关参数,可参考IANA发布的Subsequent Address Family Identifiers (SAFI) Parameters;
- 关于BGP Extended Community Sub-Types,可参考IANA发布的Border Gateway Protocol Extended Communities;
- 关于常用TCP/UDP知名端口的定义,可参考IANA发布的Service Name and Transport Protocol Port Number Registry。
......
Border Gateway Protocol自1989年定义以来已经历过4个版本:1989年RFC1105的Version1,1990年RFC1163的Version2,1991年RFC1267的Version3,1994年RFC1654的Version4。而V4又历经了几次迭代,到目前比较全面完整的是2006年发布的RFC4271。
本文档旨在介绍相关原理,对于不同设备及厂家的实现上不做深究。有意者建议阅读相关资料。个人能力有限,如有疑问欢迎留言指导~
目录
1.相关术语和概念
BGP(Border Gateway Protocol,边界网关协议) 是一个 AS(Autonomous System,自治系统) 间的路由协议。BGP 的主要功能是与其他 BGP 系统交换网络可达性信息。
为便于介绍,在此先介绍一些关于BGP的相关术语:
Autonomous System自治系统
单个路由协议管理下的一组路由器,使用内部网关协议(IGP)和通用度量来确定如何在AS内路由数据包。如果一个AS内运行了多个IGP协议,对于其他AS来说也认为其执行了内部一致的路由规则。
三张处理表/库
1@--Adj-RIB-In:邻居入方向的路由信息表/库。用于描述对等体向自己传输的完整路由信息。该路由表未进行入方向的路由策略。
2@--Adj-RIB-Out:邻居出方向的路由信息表/库。用于描述自己向对等体描述的路由信息,或者放置于Update消息报文中的路由信息。该路由表已进行出方向的路由策略。
3@--Loc-RIB:放置已被本地BGP以便进行选择的路由。该路由表已进行入方向的路由策略。
因此有如下的路由处理过程:
简单来说Adj-RIB-In和Adj-RIB-Out是放置于Update报文中的路由信息。
NLRI
Network Layer Reachability Information,网络层可达信息。放置于Update报文中,主要描述了路由信息或路由的相关属性。
IBGP/EBGP
Internal和External BGP,简单来说为相同AS的对等体关系为IBGP邻居,相反为EBGP。
相关概念:
1@:BGP 使用 TCP 的 179 端口进行相关协议报文的发送和监听。
2@:在建立了完整的 BGP 对等体关系后,BGP 只发送增量更新。而非周期性泛洪或刷新路由表。
因此 BGP 为了使路由有正确的结果需要 TCP 周期保活或使用Route-Refrsh路由刷新。
BGP 提供了如下三种机制进行路由更改:
1@:发送withdraw类型的Update报文,将该路由进行撤销
2@:发送具有相同NLRI的Update报文,进行更新。通过此种方式可以更改路由的属性。
3@:中断BGP连接。
关于 BGP 基本原理的相关内容,可参考博客-BGPv4-原理介绍+报文分析+配置示例。
2.MED-RFC4451和AIGP-RFC7311
在《RFC4451-BGP MULTI_EXIT_DISC Considerations》中定义了一种新的 BGP Path Attributes Code 4 = MULTI_EXIT_DISC(MED,多出口鉴别符)。这种属性用于将路由传递给向相邻 AS 时标识到达本 AS 的最佳入口节点。
同时,在《RFC7311-The Accumulated IGP Metric Attribute for BGP》中定义了一种新的 BGP Path Attributes Code 26 = AIGP(Accumulated IGP,累积 IGP Metric)。这种属性用于允许 BGP 根据 IGP 指标做出路由决策。
接下来介绍这两种属性的使用及其区别。
2.1.基本原理
2.1.1.MULTI_EXIT_DISC属性
BGP Path Attributes Code 4 = MULTI_EXIT_DISC(MED,多出口鉴别符) 是一种 optional non-transitive 可选非传递的属性。这种属性可以用在 AS 链路之间用于选择通往相邻 AS 的多个出口或入口点。
在《RFC4451-BGP MULTI_EXIT_DISC Considerations》中 MED 属性被定义了如下原则:
1@:MED 属性是一个 4 字节无符号整数。
2@:所有其他因素相同的情况下,应优先选择度量值较低的出口。
3@:从 eBGP 邻居接收的 MED 属性可以传递给其他 iBGP 邻居。
4@:从相邻 AS 接收的 MED 属性不得传播到其他相邻 AS。也即可以理解为从 BGP 邻居接收的 MED 属性不可以传递给其他 eBGP 邻居。这里也需将 iBGP 邻居考虑在内。
5@:当 BGP Speaker 决定将 MED 属性删除或修改时,这一动作必须在 Decision Process 的前两个阶段之前进行。也即应在确定路由的优先级和确定路由选择之前进行。
《RFC4271-A Border Gateway Protocol 4的section-9.1.Decision Process》将 Update 消息的处理过程分成了 3 个阶段:
Phase 1--Calculation of Degree of Preference:主要基于LOCAL_PREF属性或路由策略对IBGP路由进行确定。
Phase 2--Route Selection:主要考虑Adj-RIBs-in中符合条件的所有可用路由进行路由选择。这里的不可用包括NEXT_HOP不可用,AS_PATH包含循环AS路径等。《RFC4271-A Border Gateway Protocol 4》对路由竞选做出了相关建议,同时说明BGP可以使用任何产生与此结果相同的实现算法。由于RFC更新调整及各厂家实现上的区别,其他比较原则不在此处做更新。
Phase 3--Route Dissemination:主要基于配置的策略,将Loc RIB中的所有路由处理为Adj-RIB-Out。
6@:对于路由的 Breaking Ties 最终竞选原则,在《RFC4271-A Border Gateway Protocol 4的section-9.1.2.2.Breaking Ties (Phase 2)》以及《RFC4451-BGP MED Considerations的section-2.1.About the MED Attribute》中对 MED 属性的处理都进行了完全相同的定义。
其路由竞选详细行为如下:
1@:比较 MED 属性的行为仅在从相同 neighborAS 收到的路由。相同 neighborAS 由路由中的 BGP Path Attributes Code 2 = AS_PATH 属性来确定。
2@:不携带 MED 属性的路由被视为具有最低 MED 值的路由。
3@:需要说明的是 neighborAS 是一个函数用于反应路由来源的邻居 AS。如果从 iBGP 邻居接收了其自己产生或其以聚合等方式方式并携带 AS_SET 属性,则认为该路由只具有 local AS 标记而不具有 neighborAS 标记。
4@:对于 IBGP 学习的路由,在 Decision Process 中到达此步骤时,必须在路由比较中使用 MED 属性。
自动换行
在《RFC4271-A Border Gateway Protocol 4》中未详细定义 BGP 的选路规则,这里提供 HW 设备选路规则以供参考。
7@:不携带 MED 属性的路由在本文档中被视为具有最低 MED 值的路由,而在某些文档中有可能将其视为最高 MED 值。同时,最高 MED 值也有可能被其他文档视为具有 infinity 值。
bestroute med-none-as-maximum 命令用于将不携带 MED 属性的路由视为携带最大 MED 值的路由进行路由竞选。选路结束后,MED 值恢复为原始值。
8@:MED 属性主要在 eBGP 链路之间判断进入同一个 AS 时的最佳路由。因此默认不比较来自于不同的 AS 的路由。但是,现在大量 MED 应用程序使用 MED 来确定从不同 AS 接收路由进行竞选。这样虽然对《RFC3345-BGP Persistent Route Oscillation Condition》中所描述的场景有帮助,但也可能引起环路。
compare-different-as-med 命令用于总是比较路由的 MED 值而不考虑其 AS_PATH。
9@:在 Route Reflection 和 AS Confederations 场景下有可能会产生环路。不比较从不同相邻 AS 学习到路由的 MED 可以显著降低这一行为。
执行 bestroute med-confederation 命令后要求当 AS-Path 中不包含外部AS号(不属于联盟的子AS),且 AS_CONFED_SEQUENCE 的第一个 AS 号相同时,才能比较MED值的大小。
10@:MED 属性的使用有可能会导致路由震荡。例如,MED 通常从 IGP metric 或与给定 BGP NEXT_HOP的 IGP metric 相关的 metric 动态派生。当 AS 内发生大量网络波动时可能造成 MED 值的频繁变化。
11@:当 MED 派生自与聚合路由关联的 IGP metric 时,通告给对等体的 MED 值可能会导致非常不理想的路由。
12@:在 BGP 的选路过程中实际上还受路由接收顺序的影响。
假如,某一时刻存在如下三条路由。
- Route-1:AS_Path { 65001 200 }, med 100, igp cost 13, internal, Router id 4.4.4.4
- Route-2:AS_Path { 65001 100 }, med 150, igp cost 11, internal, Router id 5.5.5.5
- Route-3:AS_Path { 65002 300 }, med 0, igp cost 12, internal, Router id 6.6.6.6
情形1@如果先收到 Route-1 和 Route-2 路由后收到 Route-3 路由:此时就先比较 Route-1 和 Route-2 路由,随后将两者的最优路由与后收到 Route-3 路由进行比较。最终由到 Next-Hop 的 IGP cost 决定最优路由为 Route-2。
情形2@如果先收到 Route-2 和 Route-3 路由后收到 Route-1 路由:此时就先比较 Route-2 和 Route-3 路由,随后将两者的最优路由与后收到 Route-1 路由进行比较。最终由 MED 决定最优路由为 Route-1。
自动换行
deterministic-med 命令可以用于消除路由接收的顺序的影响。其原理为先按路由 AS_Path 最左边的 AS 号进行分组。在组内进行比较后,再用组中的优选路由和其他组中的优选路由进行比较。对于上述描述的场景,最终的选举结果与情形 1 类似。
2.1.2.Accumulated IGP属性
与 IGP 不同,BGP 通常不根据指标做出路径选择决策。这是因为在网络设计中仅具有局部意义的变化不能具有全局影响。此外,不同的 AS 管理域可以有自己的策略,而不必透露给其他域或得到其他域的同意。但是在某些网络部署中,单个关联网络可能包含多个 AS 管理域。此时,如果允许 BGP 根据 IGP metric 做出路由决策可以使 BGP可以选择两个节点之间的最短路径。
先前介绍的 MULTI_EXIT_DISC(MED) 属性可以标识路由的 IGP metric。但是,该属性并不能真正提供类似 IGP 的最短路径标识。因此 AIGP(Accumulated IGP) 属性被定义出来。
BGP Path Attributes Code 26 = AIGP(Accumulated IGP,累积 IGP Metric) 同样是一种 optional non-transitive 可选非传递的属性。该属性可以确保路由 metric 从目标开始的路径上累积。
在《RFC7311-The Accumulated IGP Metric Attribute for BGP》中 AIGP 属性被定义了如下原则:
1@:AIGP 属性应当只包含一个 AIGP TLV。如果包含多个 AIGP TLV 则应仅使用第一个 AIGP TLV,且其他 AIGP TLV 不得被修改。
2@:当收到错误格式的 AIGP 属性时,必须将该属性完全视为无法识别的不可传递属性。此时应静默丢弃该属性,不得传递给 BGP peer。
错误格式 AIGP 属性的判断有如下原则:
1@:不得将包含多个 AIGP TLV 或未知 TLV 的 AIGP 属性视为错误格式。
2@:如果 AIGP 属性被标记为可传递,则应当将将其视为错误格式。
3@:如果第一个 AIGP TLV 的 Value 字段被填充为最大值 0xffffffffffffffff,则应将 AIGP 属性视为错误格式。
3@:必须支持基于 session 的 AIGP 属性处理。iBGP session 应默认支持,eBGP session 应默认不支持。不应在不支持的 session 上发送 AIGP 属性。在不支持的 session 上接收 AIGP 属性时,应静默丢弃该属性,不得传递给 BGP peer。
4@:BGP Speaker 不得将 AIGP 属性添加到路径通向 BGP Speaker 所属的 AIGP 管理域之外的任何路由上。因为 IGP 的变化可能导致路由抖动。
当满足如下条件之一时可以将 AIGP 属性添加到路由中:
1@:被重分布进 BGP 中的静态路由。该路由不通向 AIGP 管理域之外。
2@:被重分布进 BGP 中的 IGP 路由。该路由不通向 AIGP 管理域之外。
3@:从 iBGP 学习而来的路由,但要求其 AS-PATH 为空。
4@:从 eBGP 学习而来的路由,但要求其 AS-PATH 仅包含邻居的 AS。此外,如果 BGP speaker 不把自身加入到路由的 next hop 时,则也不可以将 AIGP 属性加入到路由中。
5@:协议允许为前缀分配如下 AIGP TLV 值。
- 当该路由是被重分布进 BGP 中的 IGP 路由时,可指定 BGP Speaker 到前缀的 Distance 作为 AIGP TLV 值。
- 当该路由是被重分布进 BGP 中的静态路由时,如果指定了 BGP Speaker 到前缀的 Distance,可使用此值作为 AIGP TLV 值。
- 当该路由是从 BGP 学习而来且有到该路由 Next-Hop 的 IGP 路由时,可使用此值作为 AIGP TLV 值。
- 当该路由是从 BGP 学习而来且有到该路由 Next-Hop 的 BGP 路由且已计算了到该下一跳的 AIGP TLV 值时,可使用此值作为 AIGP TLV 值。
6@:当产生 AIGP 属性的 BGP Speaker 到前缀的 Distance 发生变化,则 BGP Speaker 应产生包含新 AIGP TLV 值的新 BGP Update。但是,如果新 Distance 与 AIGP TLV 中公布的 Distance 之间的差异小于可配置的阈值,则可能会抑制更新。
7@:AIGP 属性的最大值为 0xffffffffffffffff,并且该值的增加不会导致 AIGP 值重新开始计算。
8@:BGP Speaker 将收到的路由通告给其 peer 时,如果不修改路由的 Next-hop 字段则不得修改 AIGP 属性。
9@:BGP Speaker 将收到的路由通告给其 peer 并将原始 Next-hop 修改为自己时,如果到原始 Next-hop 的路由由 IGP 或不需要递归的静态路由学习而来,则可以将原本的 AIGP 值增加一个原始 Next-hop 的 Distance 或由某种策略确定的值。但增加的值必须非 0。
10@:BGP Speaker 将收到的路由通告给其 peer 并将原始 Next-hop 修改为自己时,如果到原始 Next-hop 的路由由 BGP 或需要递归的静态路由学习而来,则在增加原本的 AIGP 值时需遵循如下原则:
- 如果到原始 Next-hop 的路由是没有 AIGP 属性的 BGP 路由,则不要传递任何 AIGP 属性。
- 如果到原始 Next-hop 的路由是有 AIGP 属性但没有 AIGP TLV 的 BGP 路由,则传递原始 AIGP 属性。
- 如果到原始 Next-hop 的路由是有 AIGP 属性并且有 AIGP TLV 的 BGP 路由,则传递原始 AIGP 属性时叠加对应的 AIGP TLV 值。此时继续递归查找下一跳路由,直到无法查找递归 Next-hop 的 Distance 时叠加该值(超过阈值时不叠加)。也即将原本的 AIGP 值不断叠加所有依赖路由的 Metric。
11@:对于路由的 Breaking Ties 最终竞选原则,在《RFC7311-The Accumulated IGP Metric Attribute for BGP的section4-Decision Process》中给出了最新的原则。
- 不考虑没有可解析 Next-hop 等明显不具有竞选资格的路由。
- 不考虑没有 AIGP 属性或携带 AIGP 属性但没有 AIGP TLV 的路由。
- 当比较路由的 AIGP 值时,应将路由中 AIGP TLV 值与路由器自己到路由 Next-hop 字段的 Distance 之和作为计算比较的标准。选择具有最小值的路由。
在《RFC7311-The Accumulated IGP Metric Attribute for BGP》文档中并未严格定义 AIGP 属性在 BGP 路由竞选中的比较顺序。这里选择 HW 设备进行介绍。
AIGP 属性位于 AS_PATH 长度之前进行比较。
2.2.编码格式
此处简单介绍下 MULTI_EXIT_DISC 属性和 Accumulated IGP 属性的编码格式。
MULTI_EXIT_DISC 属性:
在《RFC4451-BGP MULTI_EXIT_DISC Considerations》中并未给出 MED 属性的编码示例,而仅说明其是是一个 4 字节无符号整数。并且该属性是 optional non-transitive 可选非传递的。
在《RFC4271-A Border Gateway Protocol 4》中给出了 Path attrubutes 的编码格式。其中定义 Path Attributes 由 <Attribute type, Attribute length, Attribute value> 三种元素组成。
1@Attribute type:由 Attribute Flags(1 字节) 和 Attribute Type Code(1 字节) 两部分组成。
Attribute Flags 的 high-order bit:用于指示 Path Attributes 是 optional(置位 1) 还是 well-known(置位 0)。
Attribute Flags 的 second high-order bit:用于指示 optional Path Attributes 是 transitive(置位 1) 还是 non-transitive(置位 0)。
如果是 well-known Path Attributes 则此 bit 必须置位 1。
Attribute Flags 的 third high-order bit:用于指示 optional transitive Path Attributes 是 partial(置位 1) 还是 complete(置位 0)。
如果是 well-known Path Attributes 或 optional non-transitive Path Attributes,则此 bit 必须置位 0。此 bit 可以用于标识在 Path Attributes 传递过程中是否有 BGP Speaker 不识别该 optional transitive Path Attributes,也可以用于标识该 optional transitive Path Attributes 是由产生该路由的非原始 BGP Speaker 在传递过程中添加。
Attribute Flags 的 fourth high-order bit:用于指示 Path Attributes 是 2 字节(置位 1) 还是 1 字节(置位 0)。
Attribute Flags 的 lower-order four bits:必须置 0 并在接收时忽略。
自动换行
Attribute Type Code:1 字节用于标识 Attribute Type 的具体类型。
2@Attribute length:取决于 Attribute Flags 的 fourth high-order bit 是否置位。如果置位,则该字段长 2 字节。反之则长 1 字节。用于标识 Attribute value 字段的长度。
3@Attribute value:不定长,用于具体携带 Path Attribute 信息。
MED 属性示例,Attribute Flags 字段表明 MED 属性为 Optional non-Transitive 可选非传递属性。
Accumulated IGP 属性:
在《RFC7311-The Accumulated IGP Metric Attribute for BGP》中给出了 AIGP 属性所包含 AIGP TLV 的编码示例。
1@Type:1 字节,用于标识 AIGP TLV 的类型。目前仅定义了 type 1 = AIGP TLV。
2@Length:2 字节,用于标识整个 TLV 的长度。目前仅定义了 type 1 = AIGP TLV,该字段固定取值为 11。
3@Value:8 字节,用于具体携带 AIGP TLV 的值。
AIGP 属性示例。
2.3.配置示例
添加 MED 属性配置示例:
由于 HW 设备发送路由时默认添加 MED 属性(无特殊修改取 0),可通过如下几种方式得到非 0 MED 属性的路由。
1@:重分布引入路由发布给 eBGP peer 时,默认将路由的 IGP Cost 作为 MED 属性值发送给 peer。
2@:修改默认 MED 属性值。此时重分布引入路由时不再将路由的 IGP cost 作为 MED 属性值,而是将修改后的值作为 MED 属性值发送给 peer。
default med 命令用于将重分布引入路由和BGP的聚合路由发布给 eBGP peer 时修改默认 MED 属性值。
3@:使用路由策略方式修改 MED 属性值。此种方式优先级最高。
apply cost 命令用于直接修改向任意 BGP 邻居发布的任意路由设置 MED,并且可以为不同的路由设置不同的 MED。
自动换行
apply cost-type internal 命令可以将 MED 值设置为该路由的下一跳的 IGP cost,仅对 eBGP 邻居生效。
因此实际效果和默认行为类似,但该命令优先 default med 命令生效弱于 apply cost 命令。
自动换行
apply cost-type internal-inc-ibgp 命令可以将 MED 值设置为该路由的下一跳的 IGP cost,对 iBGP/eBGP 邻居生效。
因此实际效果和默认行为类似,但该命令优先 default med 命令生效弱于 apply cost 命令。
自动换行
apply cost-type med-plus-igp 命令可以将 MED 值设置为该路由的原始 MED 与下一跳的 IGP cost 之和,对 iBGP/eBGP 邻居生效。
自动换行
apply cost-type med-inherit-aigp命令可以将 MED 值设置为继承该路由的原始 AIGP 值,对 iBGP/eBGP 邻居生效但仅对私网BGP生效。
自动换行
添加 AIGP 属性配置示例:
由于 HW 设备发送路由时默认不添加 AIGP 属性,因此只能通过路由策略添加。
bgp 100
router-id 1.1.1.1
peer 10.1.2.2 as-number 100
#
ipv4-family unicast
undo synchronization
import-route ospf route-policy test
peer 10.1.2.2 enable
peer 10.1.2.2 aigp
#
route-policy test permit node 10
apply aigp 10
#
apply aigp 命令用来设置 BGP 路由的 AIGP 值。
apply aigp inherit-cost 命令用于使 AIGP 继承于所依赖路由的开销值。
需要说明的是根据协议规定,BGP 在传递携带 AIGP 属性的路由时,如果没有修改路由的下一跳为自身,则不能修改路由的 AIGP 属性。
更新
本文来自博客园,作者:m风行者,转载请注明原文链接:https://www.cnblogs.com/FengXingZhe008/p/18869790