本章解答以下问题:
- ASN,团体(community),属性(attribute),最佳路径这些BGP术语是什么疑似?
- 在数据中心中应该使用eBGP还是iBGP?
- 在数据中心使用BGP时,应采用什么ASN编号方案?
- 在数据中心使用BGP时,应如何修改BGP的计时器?
BGP 基本概念
BGP协议概述
BGP 是一种路径矢量路由协议。“矢量”是一个数组或列表。因此,路径矢量路由协议是一种构建并分发对象数组的协议,数组中的每个对象定义了从一个网络地址(通常为IP地址)到另一地址的路径。这里用的是“对象”而不是“路由器”,因为对象是一种称为 AS 的东西。
撰写本书时,BGP的当前版本号为4,也称为 BGP-4。BGP-4 的主要定义于RFC4271 中,但该文档中的某些规范已被后面的一些 RFC (例如能力通告相关的 RFC)所覆盖。
BGP基于TCP之上运行,因此BGP 可以忽略例如分片、组装、消息确认、重传及其他一些在别的路由协议中通常需要处理的问题。实际上 BGP 是唯一一种基于 TCP的路由协议。其他常见的路由协议要么基于 IP,要么甚至使用更原始的 L2 数据包。BGP在TCP端口 179 上接收新的连接或者发起连接请求。
BGP 众所周知的复杂性源于其协议的通用性。BGP 支持交换多种网络类型的路由信息,包括IPv4和IPv6,还支持网络虚拟化技术如 MPLS 和VXLAN,因此BGP被称为多协议路由协议。除此以外,由于 BGP 用于在多个管理域之间交换路由信息因此还支持应用复杂的路由策略,这些策略可以控制 BGP 多方面的行为,例如计算到达目的地的最佳路径,需要通告的路由,以及通告路由的哪些属性。BGP 还支持第5章中介绍的 ECMP以及 UCMP (Unequal-Cost Multipath,非平衡多路径),并不是所有的 BGP 实现都支持了 UCMP。
在不同的管理域(或按照 BGP 术语称为自治系统)之间交换路由信息的 BGP称为eBGP (external BGP,外部 BGP)。
在管理域内 (或在同一自治系统内)交换路由信息的 BGP称为iBGP (internal BGP,内部BGP)。
BGP 对于eBGP和iBGP的路由信息交换有着不同的规则。
BGP 是一种可扩展性很强的协议,人们一直在为 BGP 提出各种新的想法。在很多方面来说,BGP就像是路由开发者的 HTTP 协议。它被用于在路由器之间传送各种信息,这些信息可能与路由完全无关,或者不是 BGP 最初设计用的目的。BGP的可扩展性使其适应性很广并且功能强大,但是如果你尝试使用它提供的所有功能,也将很难理解。因此这一点至关重要:应该尽量简化对 BGP 的使用,不要仅仅因为可以就使用 BGP的某些特性。
BGP 对等连接
BGP 对等连接之间不是客户端- 服务器关系,而是相互平等的对等关系。图 14-1 展示了BGP 对等会话生命周期中的时间线序列。
在进行对等连接时,BGP 两端的任何一方都可以发起 TCP 连接。通常两端发起的连接都会成功,这样会导致 BGP两侧有两个单独的 TCP 连接在进行相互通信。这种情况在 BGP 标准中被称为连接冲突。BGP 提供了办法来解决冲突,以将两个 TCP连接减少为单个 TCP连接。BGP 发言者有一个唯一标识符 router-id
,这是一个32位的无符号数字。在发生连接冲突时,具有较大 router-id
的发言者发起的连接会被选中获胜。与某些其他协议不同的是,BGP 在会话初始化期间未定义优先级字段,因为选用哪一方发起的连接是一个无关紧要的细节,不会影响BGP做出的任何决策。
BGP标淮还定义了“被动”连接的方式,即 BGP对等方的其中一方并不主动发起TCP连接,只在对方节点请求连接时做出响应。当运行 Kube-router 或其他此类解决方案的节点与运行在路由器上的 BGP 进行对等连接时,就采用了被动连接。
BGP 状态机
BGP的状态机非常简单,只包括三个主要阶段:
- TCP 连接建立
- 解决连接冲突和能力交换
- 路由交换
这些阶段中包含一些更具体的状态,如图 14-2 所示。图中的虚线表示出现错误时的状态转换,实线则表示正常情况下的状态转换。
自治系统编号
每个BGP发言者都有一个ASN(Autonomous System Number,自治系统编号),该ASN标识了该发言者代表的组织。在BGP的上下文中,组织被定义为由单个实体控制并具有确定路由策略的一个网络。通常会为一个服务提供商(例如Verizon、AT&T和T-Mobile)分配一个唯一的ASN,而一个大型企业(例如埃克森美孚和亚马逊)也会分配一个唯一的ASN。在某些情况下,一个组织可能有多个ASN,这可能由于企业并购等原因导致。例如,苹果有3个ASN,而亚马逊有14个。
网络地址的路径矢量是该地址经过的ASN列表。ASN列表被用于识别路由环路、确定到某一网络前缀的最佳路径,以及对网络应用路由策略。在Internet上,每个ASN都只对特定的IP前缀具有权威性。
ASN有两种格式:两字节和四字节。两字节的格式更为流行,因为这种格式出现的时间更长,并且也更易于阅读(例如,与一个四字节的ASN 4200000000相比,两字节ASN 64000在视觉上更容易接受)。如今,大多数路由协议套件都同时支持这两种格式的ASN。
ASN有供内部网络使用的私有号码空间,这些私有ASN号码对Internet而言不可见。数据中心通常在其内部使用私有ASN。
BGP 能力
作为一种不断发展的协议,BGP 允许在每个对等会话中协商支持的能力,以确保只交换双方都支持的信息。能力协商在 RFC 5492 定义。在 BGP Open 消息中进行能力协商,能力类型包括每一方支持哪些地址族等内容
BGP 属性,团体和扩展团体
BGP 有各种类型的属性,具有不同的用途和语义。BGP 属性使用类型,长度和值(TLV) 的模型进行编码.
基本的 BGP-4 RFC定义了每个BGP 兼容实现都必须支持的七个路径属性。这些属性用于 BGP 的最佳路径计算。例如,其中的一个属性 AS_PATH
用于携带一条路由关联的路径矢量。
BGP的一些属性是强制性的。也就是说,这些属性必须始终在消息中传输,而其他属性可能并不总是出现在消息中。消息接收者必须能够处理 BGP-4 RFC 中定义的七个基本路径属性。在该 RFC 之外定义的其他属性称为可选属性,并非所有的实现都支持这些可选属性。例如MP_RBACH_NLRI
属性用于通告 MPLS 标签,但并非所有实现都支持该标签。对接收者的唯一要求是必须转发被标识为可传递的属性,即使在不理解该属性的情况下也是如此。
BGP还允许通过称为团体 (community) 的属性定义用户扩展的路由分组。 community 是一种可传递的可选属性。运营商使用 community 将一些路由组合在一起,以对这些路由应用路由策略。路由策略会影响这些路由的 BGP 更新消息处理和最佳路径计算。运营商可以使用其路由协议栈的特定配置命令为路由打上community 标记,并通过community 的值来影响BGP的行为。一条更新消息可以携带多个community。
community 的值不是一个任意文本字符串,而具有四字节的固定长度。前两个字节是发起这个 community的 BGP 发言者的ASN,后两个字节则留给网络运营商使用。和BGP的大部分内容一样,community 也是在Internet 刚出现时设计的。随着4字节ASN的出现以及对2字节以上的操作填充需求,我们现在有了扩展团体 (extended community,使用8字节代替原先的4 字节)和大型团体 (large community,使用12 字节) 。采用两字节ASN 编号的网络虚拟化路由信息使用扩展团体属性,而具有四字节 ASN 的路由信息则使用大型团体属性。
BGP 最佳路径计算
BGP路由器会为每个通告的路由计算从其自身出发的最佳路径。当从一个或多个对等方收到新的 UPDATE 消息时,将触发 BGP 的最佳路径计算。BGP 实现可以选择对这些消息进行缓冲,以便通过一次计算处理所有更新,而不至于由于频繁的路径计算触发过快的路由更新。只有当计算结果改变了 (添加,删除或更新)到某一网络的最佳路径时,BGP 才会对外进行路由通告。
OSPF,IS-IS 和其他一些路由协议采用一个简单的度量标准来决定采用哪条路径,而BGP有八个度量标准。
你可以使用这个精妙的句子来帮助记住 BGP 在计算最佳路径时采用的这些度量的优先级:
Wise Lip Lovers Apply Oral Medication Every Night.(明智的恋人每晚都要口服药物。)
表 14-1 说明了助记符和实际度量指标之间的对应关系。最佳路径是按优先顺序的度量指标的值 (有关最佳路径计算的详细信息,请参阅 RFC 4271 的9.1 节)。如一个更新和现有最佳路径之间的某一个度量标准的值相同,则会按此顺序比较下一个度量指标,直到打破平局。
Table 14-1. BGP best-path metrics
Mnemonic | BGP metric name |
---|---|
Wise | Weight |
Lip | LOCAL_PREFERENCE |
Lovers | Locally originated |
Apply | AS_PATH |
Oral | ORIGIN |
Medication | MED |
Every | eBGP over iBGP |
Night | Nexthop IGP Cost |
BGP在数据中心中只使用了 Locally originated
和AS_PATH
这两个指标来计算最佳路径。 换句话说,节点本地生成的路由优先级高于通过 BGP 学习得到的路由,AS_PATH
长度较短的路由优先级高于 AS_PATH
长度较长的路由。如果两条路径的 AS_PATH
长度相等,则认为其路由成本相同。实际上,默认的 BGP 实现不仅要求两条AS_PATH
的长度相同,而且要求 AS_PATH
中的各个 ASN 也必须相同,才会认为其路由成本相同。如果想只使用 AS_PATH
长度来判断路径的成本是否相同,则需要打开一个放松该限制的配置项。
多协议支持
BGP 不仅可以通告如何到达某个 IP 地址的信息,还可以通告如何到达 MPLS 标签、MAC 地址等其他信息。定义 BGP 多协议支持的基本标准是 RFC4760。BGP 支持的每种网络协议都有其自己的标识,称为 AFI (Address Family Indicator,地址族标识符)。AFI标识了主要的网络协议。IP4 和IPv6 各自有自己的 AFI。但是,即使在 AFI内部,也需要进一步进行区分。例如,单播和多播路由信息的区别就很大。
BGP 使用 SAFI(Subsequent Address Family Indicator,子地址标识符) 来对单播和多播地址情况进行进一步区分。IPv4 Unicast AFI-SAFI是 RFC 中假定使用的地址标识符。当在描述时未指定 AFI/SAFI时,则可认为适用 IPv4 单播。BGP发言者需要关注的AFI/SAFI列表是通过BGPOPEN消息在能力协商时通告的仅当双方通告对其 AFI / SAFI 感兴趣时,两个 BGP 对等方才会交换有关网络地的信息。
BGP消息
表 14-2 列出了 BGP 发送的各种消息类型及其特定用途
Table 14-2. BGP 消息类型及其用途
消息类型 | 使用 | 周期 |
---|---|---|
Open | 在会话建立时发送,用于标识路由器和交换能力 | 一次 |
Update | 用于交换路由通告和撤回 | 仅在信息发生变化时 |
Keepalive | 心跳,用于向远程对等端发出信号,表明我们正在运行 | 已配置,通常为 60 秒 |
Notification | 在发生错误或以管理方式关闭会话时发送 | 在发生错误或关闭时 |
Route Refresh | 请求远程对等节点重新发送所有路由 | 仅在需要时进行 |
每条BGP消息被编码为一个TLV。一条BGP消息携带了一个固定长度的头部,头部中也包含了BGP消息的类型。
BGP中主要的消息是 Update,Update 消息中包含发布的路由列表和撤销的路由列表。
BGP中撤销路由信息的机制与 OSPF 和IS-IS 不同: OSPF和IS-IS 通过链路状态信息老化来撤销路由,而 BGP 采用了显式的撤消机制。BGP Update 消息的格式如图14-3(a) 所示。BGP 使用术语 NLRI (Network Layer Reachability Information,网络层可达性信息) 来表示所发布的路由。 community 属性则被编码在“Path Attributes List”中。
BGP 采用一个称为 MP_REACH_NLRI
的属性来保存非 IPv4 地址族的 NLRI,这是一个可选的,非传递路径属性,其内部格式如图 14-3 (b) 所示。如果该属性存在,则位于图 14-3 (a)的 BGP Update 消息中的“Path Attributes List”部分中。对于下一跳这种 NLRI中的关键属性,IPv4 和其他协议有不同的编码。在IPv4 中,下一跳是使用一个叫做 NEXTHOP
的路径属性编码在 Update 消息的“Path Attribute List”部分中的。但是 IPv6 路由的编码不同,IPv6 的下一跳和发布的路由按图 14-3 (b)所示进行编码。
一条 BGP Update 消息中可以携带多个 AFI /SAFI路由信息。例如,单个 BGP Update 消息可以同时携带IPv4 和IPv6 的更新。在这种情况下,Update消息中将同时存在 MP_REACH_NLRI
和标准的 NLRI属性。如果该条消息中没有IPv4 路由通告,则NEXTHOP
属性就不会出现在路径属性列表中,只会存在包含IPv6 路由的MP_REACH_NLRI
属性。
图14-3:BGP Update 消息和多协议网络地址的格式
使BGP适应数据中心
数据中心密集的网络连接与运营商管理域之间相对稀疏的连接有很大的区别。因此,在数据中心中部署 BGP有一些不同的权衡。BGP 在数据中心的使用情况可总结如下:
- eBGP 被用作唯一的路由协议。
- eBGP 与私有 ASN 一起使用
- 使用合适的BGP的ASN编号方案,以避免BGP的路径探索(Path hunting)问题
- 与服务提供商网络相比,数据中心中的 BGP 计时器适用于更积极的更新策略
eBGP 与 iBGP
鉴于整个数据中心都处于单个管理域内,使用iBGP似乎是一个显而易见的选择,但是,几乎每个数据中心内都选择了部署eBGP。
导致这种现象的主要原因是eBGP比iBGP更容易理解和部署。在最佳路径选择算法、选择和通告哪些路由的标准,以及处理和忽略哪些前缀属性的规则这些方面,iBGP让人感到迷惑。在一些特定的情况下,iBGP对多路径的支持也有局限性,特别是当一条路由被两个不同的节点通告时。我们可以克服这种限制,但是会非常麻烦。
iBGP比eBGP更容易让一个新手感到困惑,因为要实现预期的行为,需要调整BGP中较多的配置选项。这些难以理解的众多配置只会加剧新手的不安。
选择eBGP还有一个强烈的非技术性原因:与iBGP相比,eBGP有更多功能完善和可靠的实现。多种实现的存在意味着客户选择eBGP可以避免供应商锁定。
私有 ASN
私有 ASN是在全球Internet 中不可见的 ASN。 它们用于企业内部,类似私有 IP 地址(例如 10.0.0.0/8
)。 私有 ASN有2字节和4 字节两种 ASN变体。两字节的ASN支持 1023 个私有 ASN (64512-65534) ,而四字节的ASN 则支持近 9500万个私有 ASN(42000000004294967294),足以满足当今任何规模的数据中心的需求。
只要在与外界通信之前将其剥离,运营商也可以在数据中心内部使用全局 ASN。但是由于以下两个原因,这并不是一个好主意。首先,在数据中心内部使用全局 ASN可能会误导试图将 ASN 解码为名称有意义的操作人员和工具。由于很多 ASN是众所周知的,因此运营商在数据中心内看到这些 ASN时可能会非常困惑。例如,在数据中心内某个节点上看到 Verizon 的ASN时。
第二个原因是为了避免意外将内部 BGP 信息泄漏到外部网络。如果在内部使用了全局 ASN,并且将路由信息泄漏到外部,将会对 Internet造成严重破坏。 例如,如果某个数据中心在其内部使用 Twitter的 ASN,并且不小心泄漏了一条路由,声称Twitter 是该数据中心内一个可公开访问的路由的 AS PATH 的一部分,则将导致对twitter 服务的大规模的全球劫持。错误的配置是所有网络中断故障的头号或者第二号原因,因此不应该在数据中心内使用公共 ASN,以避免发生这种情况。
BGP的 ASN 编号方案
BGP的 ASN编号方案如下:
- 每个 leaf 节点都有自己的 ASN
- 二层 Clos 中的所有 spine 都有自己独立的 ASN。在三层 Clos 中,同一pod 内的所有 spine 使用相同的 ASN,但每个 pod 的ASN 不同。
- 在三层 Clos中,所有的super spine都使用相同的ASN
BGP的路径探索问题
困扰路径矢量协议的一个问题是计数到无穷 (count-to-infinity)。尽管我们不能在这里涉及关路径探索的所有细节,但是你可以通过图 14-5 中所示的拓扑中查看该问题的一个简化的解释。
在此拓扑中,所有节点都有一个单独的 ASN。现在我们从 R1 的角度来考虑前缀为 10.1.1.1
的可达性。R2和R3 都会向R1 通告 10.1.1.1
的可达性: R2为10.1.1.1
通告的 AS_PATH是[R2,R4]
,R3 通告的AS PATH 则是[R3,R4]
当节点R4 下线时,R2 失去了到达 10.1.1.1
的最佳路径,它重新计算后将通过R1的AS_PATH[R1,R3,R4]
作为最佳路径。R2和R3还向R1发送 10.1.1.1
的路由撤消消息。但是,如果R3 的路由撤消消息先于 R2 的到达R1,则R1会将其到 10.1.1.1
的最佳路径切换到经过 R2的AS_PATH[R1,R2,R4]
,并将此路由对外进行通告。现在,R3 切换为使用通过 R2 的路径作为最佳路径,并认为 10.1.1.1
仍然可以访问。当 R2 的路由撤消消息到达 R1时,R1 撤销到10.1.1.1
的路由并将撤消消息发送到 R3。由于节点之间数据转发时间顺序和每个BGP 实现的具体工作方法有所不同,事件的确切顺序可能与此处描述的不完全一样,但和此类似。
对这个问题的简短描述是; 因为一个节点并不知道网络中其他每个节点的物理链接状态,所以它不知道一条路由是真的消失了(路径末端的节点自身掉线了)还是可以通过其他路径到达。因此,节点会继续通过所有其他可用路径来探索目的地的可达性。这被称为路径探索。
在图 14-5 的简单拓扑中,这看起来并不是一个太大的问题。但是想象一下 R1和R4是Clos 拓扑中的leaf 节点,而 R2和R3是spine 的情况。常见的 Clos拓扑中通常有 32或64个leaf和4到8个spine。每个leaf都可以选择不同的spine作为最佳路径。当R4下线时,每个spine会探索从任一leaf到达R4的路径,因为每个leaf 选择了不同的 spine 作为最佳路径,因此需要进行一些额外的搜寻。该问题可能会变得非常严重,因为多余的消息交换过多,并且由于错误路由信息在网络中的长时间传播,会导致流量损失增加。
多路经选择
如果八个最佳路径度量指标的值分别都相等,则两条路径被视为等价的。这些标准之一是AS_PATH
中的AS 编号必须完全匹配,而不仅仅只是路径长度相同,该要求破坏了数据中心内两种常见部署方案中的多路径路由。
第一种部署场景如图14-6所示。在该图中,圆形表示绑定在一起的两个端口通道,对上层协议来说,这两个链接看起来像是一条高速逻辑链接。图中的服务器被连接到了两个TOR(Top of Rack) 交换机上,每个TOR 交换机有不同的ASN。在这种情况下,相同的路由会被采用不同的 ASN分别进行通告。
假设图中服务器所在的子网为 10.1.1.0/24
。两个leaf都会对外通告到自己到10.1.1.0/24
子网的路由。在这种情况下,每个 spine 会接收到两条到10.1.1.0/24
的路由,一个路由的AS_PATH为64600,另一个路由的AS_PATH为64601。根据等价路径的判断逻辑,BGP 不仅要求 AS_PATH的长度相同,而且还要求 AS_PATH包含相同的ASN列表。因为这两条路由的 ASN不相同,所以在 spine 上不会形成多路径路由。相反,他们只会选择两条路线之一作为最佳路径。
在第二种部署场景中,服务器上部署了虚拟服务(如 Kubernetes service) ,这种情况下多台服务器都会通告同一个服务虚拟 IP 地址 (例如 Kubernetes Cluster IP)的可达性。并且为了确保可靠性和可扩展性,服务器连接到了不同的 leaf 上,因此spine 也会收到来自多个不同 ASN 的同一个服务的路由,这些路径的 AS_PATH长度相同,但某些 ASN 并不相同。
有多种解决此问题的方法,最简单的是通过配置来修改最佳路径算法。在 FRR 和其他路由栈中有一条
bestpath as-path multipath-relax
配置命令,它的作用很简单:当来自两个不同来源的路由通告中的 AS_PATH
长度相同时,最佳路径算法会跳过对ASN 是否精确匹配的检查,直接进行下一个度量标准的判断。
BGP 的收敛时间
BGP 通常用四个计时器来控制在发生故障时或从故障中恢复时 (例如,链路断开后再次可用) 收敛的速度。了解这些计时器很重要,因为它们会影响信息在网络中传播的速度。对这些计时器进行适当的调整可以使 BGP 的收敛速度和其他内部路由协议(如OSPF) 达到相同的水平。
Advertisement interval
在路由 Internet 流量时,稳定性远比快速更新更为重要。但在数据中心,情况恰恰相反。 负责确保进行更新的主要 BGP 计时器是 advertisement interval。在向对等方发送下一次更新之前,BGP会等待 advertisement interval 中配置的时间间隔。默认情况下,该配置的值是 30 秒。在数据中心,此值必须设置为 0。就这一个更改就可以使eBGP 的收敛时间达到其他 IGP 协议 (例如 OSPF) 相同的水平。
Keepalive 和 Hold Timer
BGP 发言者会在每个已建立的会话中按 Keepalive 设置的时间周期定时发送 Keepalive 消息。如果远程对等方在 Hold 计时器配置的时间内 (通常是Keepalive 时间的三倍)未收到 Keepalive 消息,则它将宣布对等方死亡并终止对等会话。默认情况下,Keepalive 时间为 60 秒。这意味着 BGP 在其对等方T线三分钟后才能检测到。缺省情况下,如果一个 eBGP 会话的对等方只相隔一跳的距离,那么在链路发生故障后会立即重置该会话。Keepalive 和 Hold 计时器的作用是捕获软件层面的错误,比如链路状态虽然是 Up 的,但由于线缆故障而导致单通的情况。一些运营商启用了称为 BFD 的协议,可以在不到一秒钟或最多一秒钟的时间内检测到由于电缆问题引起的错误。但是要捕获 BGP 进程自身的错误,你就需要调整 Keepalive 和 Hold 计时器。在数据中心内,三分钟的时间太长了,相当于一生。数据中心内最常见的配置是 Keepalive 设置为 3秒,Hold 计时器设置为9秒。
Connect timer
这是四个计时器中最不重要的。当 BGP 尝试与对等方建立连接但由于某些原而失败时,它会等待一段时间,然后再次尝试连接。默认情况下,此时间是 60秒,换句话说,如果 BGP 无法与其对等方建立会话,就会等待一分钟,然后再尝试再次建立会话。当链路从故障中恢复或节点启动时,这个缺省值可能会延迟会话的重建。在数据中心内,此计时器的值通常设置为 10 秒。