订阅以接收新文章的通知:

为什么 BGP 社区比 AS 路径预置好?

2022/11/24

16 分钟(阅读时间)

互联网最纯粹的形式是一个由独立网络(也称为自治系统 (AS))组成的松散连接图。这些网络使用一种称为 BGP(边界网关协议)的信令协议,通知邻居(也称为对等体)IP 前缀(一组 IP 地址)在其网络中或通过其网络的可达性。部分交换包含有关 IP 前缀的有用元数据,用于通知网络路由决策。元数据的一个例子是完整 AS 路径,它由 IP 数据包到达目的地需要经过的不同自治系统组成。

由于我们都希望数据包尽快到达目的地,因此为给定前缀选择最短 AS 路径是一个好主意。这正是预置发挥作用的地方。

互联网路由入门

在深入讨论一些细节之前,我们来简单介绍互联网在最基本的层面上是如何工作的。

互联网的核心是一个由成千上万个网络组成的大型互联网络。每个网络都有两个至关重要的东西:

1. 自治系统编号 (ASN):一个唯一标识网络的 32 位整数。例如,某个 Cloudflare ASN(我们有多个)是 13335。

2. IP 前缀:IP 前缀是一系列 IP 地址,以 2 的幂数组合而成。在 IPv4 空间,两个地址组成一个 /31 前缀,四个组成一个 /30,以此类推,一直到 /0,即“所有 IPv4 前缀”的缩写。IPv6 也是如此,但最高聚合不是 32 位,而是 128 位。下图显示了 IP 前缀之间的关系。反过来说,一个 /24 包含两个 /25,而一个 /25 又包含两个 /26,以此类推。

要在互联网上通信,必须能够到达目的地,这就是路由协议发挥作用的地方。它们使互联网上的每个节点都知道将消息发送到哪里(以及接收方如何返回消息)。

如前所述,这些目的地由 IP 地址识别,IP 地址的连续范围则表示为 IP 前缀。为优化效率,我们使用 IP 前缀进行路由:在 IPv4 中,跟踪 40 亿 (232) 个 IP 地址的去向非常复杂,需要大量的资源。坚持使用前缀可以将这个数字减少到一百万左右。

现在回想一下,自治系统是独立运行和控制的。在互联网的网络中,我如何告诉其他网络中的来源 A,在我的网络中(或通过我的网络)有一条可以到达目的地 B 的路径?回答是 BGP!BGP 是边界网关协议,用来传递可达性信息。来源 ASN 产生的信号信息被称为"公告",因为它们向互联网宣布前缀中的 IP 地址是在线和可达的。

请看上图。来源 A 现在应该知道如何通过 2 个不同的网络到达目的地 B 了!

实际的 BGP 消息如下所示:

BGP Message
    Type: UPDATE Message
    Path Attributes:
        Path Attribute - Origin: IGP
        Path Attribute - AS_PATH: 64500 64496
        Path Attribute - NEXT_HOP: 198.51.100.1
        Path Attribute - COMMUNITIES: 64500:13335
        Path Attribute - Multi Exit Discriminator (MED): 100
    Network Layer Reachability Information (NLRI):
        192.0.2.0/24

如您所见,BGP 消息不仅包含 IP 前缀(NLRI 位)和路径,还包含其他元数据,提供有关路径的额外信息。其他字段包括社区(稍后会详细介绍),以及 MED 或来源代码。MED 是对其他直接连接网络的建议,如果有多种选择,应该采取哪种路径,最低值获胜。来源代码可以是下列三个值之一:IGP、EGP 或不完整。如果通过 BGP 发起前缀,则设置 IGP;EGP 不再使用,这是一个古老的路由协议;如果从其他路由协议(如 IS-IS 或 OSPF)向 BGP 分发前缀,则设置不完整。

现在,来源 A 知道如何通过两个不同的网络到达目的地 B。我们来谈谈流量工程吧!

流量工程

流量工程是所有网络日常管理的一个关键部分。就像在物理世界中一样,运营商可以设置绕行路线,优化进入(入站)和离开(出站)其网络的流量。出站流量工程明显比入站流量工程容易,因为运营商可以从邻近网络中选择,甚至使一些流量优先于其他流量。相比之下,入站流量工程需要影响完全由他人运营的网络。网络的自主性和自我管理是最重要的,所以运营商使用现有工具通知或调整来自其他网络的入站数据包流量。理解和使用这些工具很复杂,可能是一个挑战。

现有的流量工程工具集(包括入站和出站)都依赖于操作给定路由的属性(元数据)。由于我们在讨论独立网络之间的流量工程,所以我们将操作 EBGP 学习路由的属性。BGP 可以分为两类:

  1. EBGP:两个不同 ASN 之间的 BGP 通信
  2. IBGP:同一 ASN 内的 BGP 通信

虽然协议相同,某些属性会在 IBGP 会话中交换,但在 EBGP 会话中不交换。其中一个属性是本地优先级。我们稍后会详细介绍。

BGP 最佳路径选择

当网络连接到其他多个网络和服务提供商时,可以从许多网络中接收通往同一 IP 前缀的路径信息,每个网络的属性都略有不同。然后,该信息的接收网络使用 BGP 最佳路径选择算法选择“最佳”前缀(和路由),使用它转发 IP 流量。我给“最佳”打了引号,因为最佳是主观要求。“最佳”通常是最短路径,对我的网络来说最佳,但对另一个网络来说未必最佳。

BGP 在过滤收到的选项时会考虑多个前缀属性。但是,BGP 最佳路径选择不是将所有这些属性合并为一个选择标准,而是分层使用这些属性。在任何一层,如果可用属性足以选择最佳路径,则算法就以这个选择终止。

BGP 最佳路径选择算法非常广泛,包含 15 个为给定前缀选择最佳可用路径的离散步骤。鉴于步骤太多,尽早决定最佳路径符合网络的利益。前四步是最常用和最有影响力的,如下图的筛子所示。

选择可能的最短路径通常是一个好主意,所以“AS 路径长度”是在算法早期执行的一个步骤。然而,看上图,“AS 路径长度”出现在第二位,尽管它是寻找最短路径的属性。因此,我们来谈谈第一步:本地优先级。

本地优先级
本地优先级是运营商的最爱,因为它允许运营商选择所需的路由+路径组合。它是算法中的第一个属性,因为它对任何给定的路由+邻居+AS 路径组合都是唯一的。

网络在导入路由时设置本地优先级(从邻居网络学习该路由)。作为非传递属性,意味着这个属性永远不会通过 EBGP 消息发送到其他网络。这本质上意味着,例如,AS 64496 的运营商不能在邻近的 AS 64511 中将路由的本地优先级设置为自己(或中转网络)的 IP 前缀。无法做到这一点的部分原因是,通过 EBGP 实现入站流量工程非常困难。

预置人为增加 AS 路径的长度
由于没有哪个网络能够直接为另一个网络中的前缀设置本地优先级,所以影响其他网络选择的第一个机会就是修改 AS 路径。如果下一跃点有效,而且给定路由的所有不同路径的本地优先级都相同,显而易见,可以修改 AS 路径来改变流量到达您网络的路径。BGP 消息的预置如下所示:

之前:

BGP Message
    Type: UPDATE Message
    Path Attributes:
        Path Attribute - Origin: IGP
        Path Attribute - AS_PATH: 64500 64496
        Path Attribute - NEXT_HOP: 198.51.100.1
        Path Attribute - COMMUNITIES: 64500:13335
        Path Attribute - Multi Exit Discriminator (MED): 100
    Network Layer Reachability Information (NLRI):
        192.0.2.0/24

之后:

BGP Message
    Type: UPDATE Message
    Path Attributes:
        Path Attribute - Origin: IGP
        Path Attribute - AS_PATH: 64500 64496 64496
        Path Attribute - NEXT_HOP: 198.51.100.1
        Path Attribute - COMMUNITIES: 64500:13335
        Path Attribute - Multi Exit Discriminator (MED): 100
    Network Layer Reachability Information (NLRI):
        192.0.2.0/24

具体来说,运营商可以进行 AS 路径预置。在进行 AS 路径预置时,运营商向路径添加额外的自治系统(通常,运营商使用自己的 AS,但协议中没有强制执行)。这样,AS 路径的长度可以是 1 到 255。现在,由于长度大幅增加,不会选择该路由的具体路径。运营商改变向不同对等体公布的 AS 路径,可以控制进入其网络的流量。

遗憾地是,预置有一个问题:要成为决定性因素,所有其他属性必须对等。这种情况很少,特别是到达目的地有许多路由选择的大型网络。

业务策略引擎

BGP 也被俗称为业务策略引擎:不是从性能角度选择最佳路径;相反,通常情况下,从业务角度选择最佳路径。业务标准可以是任何东西,从投资(端口)效率到增加收入等。这听起来很奇怪,但信不信由您,这就是 BGP 的设计初衷!BGP 的力量(和复杂性)在于它使网络运营商能够根据运营商的需求、合同和政策做出选择,其中许多无法通过传统工程性能概念来反映。

不同本地优先级

很多网络(包括 Cloudflare)会根据用于发送路由的连接类型分配本地优先级。值越高,表示优先级越高。例如,从中转网络连接中学到的路由将获得较低的本地优先级 100,因为它们的使用成本最高;骨干网络学到的路由是 150,互联网交换 (IX) 路由是 200,最后,私人互连 (PNI) 路由是 250。这意味着,对于出口(出站)流量,Cloudflare 网络默认优先选择 PNI 学习路由,即使通过 IX 或中转邻居有更短的 AS 路径。

PNI 优于 IX 的部分原因是可靠性,因为不涉及我们无法控制的第三方交换平台。这很重要,因为我们的操作假设是所有硬件都可能并且最终会损坏。另一部分原因是端口效率。效率取决于每个端口的每兆传输成本。粗略地说,成本计算方法是:

((交换成本/端口数量)+ 收发器成本)

这与互联成本相结合(可能是每月定期费用 (MRC) 或一次性费用)。PNI 更合适,因为它可以降低每兆传输的总成本,帮助优化价值,因为单位价格随着端口利用率提高而降低。

这种推论对于其他很多网络都类似,在中转网络中非常普遍。BGP 与成本和业务策略的相关性不亚于与性能的相关性。

中转本地优先级

为简单起见,当提到中转点时,这是指传统 1 级中转网络。由于这些网络的性质,它们有两套不同的网络对等体:

1. 客户(例如 Cloudflare)
2. 无结算对等体(如其他 1 级网络)

在正常情况下,中转客户分配的本地优先级比用于无结算对等体的本地优先级高。这意味着,无论预置多少前缀,如果流量进入该中转网络,流量始终落在您与该中转网络的互连上,不会被转移到另一个对等体。

如果您有多个不同的链接,想从一个链接切换/转移流量,或者如果流量来源是多个中转点后面的多宿主(并且他们没有自己的本地优先级),仍然可以使用预置。但是,通过 AS 路径预置实现从一个中转端口到另一个中转端口的入站流量工程流量收益明显递减:一旦超过三个预置前缀,在这一点上不太可能有什么变化。

示例

在上述情况中,无论 Cloudflare 对前往 AS 64496 的 AS 路径中做任何调整,流量都会通过中转点 B <> Cloudflare 互连流动,尽管从 AS 路径的角度来看,来源 A → 中转点 B → 中转点 A → Cloudflare 的路径更短。

在这种情况下,没有什么变化,但来源 A 现在是两个中转提供商后面的多宿主。在这种情况下,AS 路径预置有效,因为在来源 A 侧看到的路径包括预置路径和非预置路径。只要来源 A 不做任何出口流量工程,并且平等对待两个中转网络,选择的路径则为来源 A → 中转点 A → Cloudflare。

基于社区的流量工程

现在,我们发现了互联网生态系统中对运营商来说相当关键的问题:利用上述工具,并不总是能(有些人甚至会说完全不可能)准确指定流量进入自己网络的路径,减少了自治系统对自己网络的控制。幸运的是,这个问题有一个解决方案:基于社区的本地优先级。

一些中转提供商允许客户使用 BGP 社区来影响中转网络中的本地优先级。BGP 社区是路由公告的一个可选传递属性。这些社区可以提供信息(“我在罗马学到此前缀”),但也可以用来触发接收方的行动。例如,Cogent 发布了以下行动社区:

社区 本地优先级
174:10 10
174:70 70
174:120 120
174:125 125
174:135 135
174:140 140

Cogent 在其网络中使用以下默认本地优先级:

对等体 → 本地优先级 100
客户 → 本地优先级 130

很容易看出,我们可以利用所提供的社区来改变所使用的路由。但需要注意的是,由于我们不能将路由的本地优先级设置为 100(或 130),AS 路径预置在很大程度上无关紧要,因为本地优先级永远不会相同。

以下列配置为例:

term ADV-SITELOCAL {
    from {
        prefix-list SITE-LOCAL;
        route-type internal;
    }
    then {
        as-path-prepend "13335 13335";
        accept;
    }
}

我们给 Cloudflare ASN 添加两个前缀,使 AS 路径总长为 3,但我们仍然看到大量(太多)流量进入我们的 Cogent 链接。在这种情况下,工程师可以再增加一个前缀,但对于 Cloudflare 这样连接良好的网络,如果两个前缀没有什么作用,那么三个、四个或五个也不会有什么作用。相反,我们可以利用上述 Cogent 社区更改 Cogent 内部的路由:

term ADV-SITELOCAL {
    from {
        prefix-list SITE-LOCAL;
        route-type internal;
    }
    then {
        community add COGENT_LPREF70;
        accept;
    }
}

上述配置将流量改变为如下所示:

这正是我们想要的!

总结

AS 路径预置仍然有用,并且作为运营商的流量工程工具,也有其用途,但应该谨慎使用。过度预置会使网络受到更广泛的路由劫持,应该不惜一切代价来避免这种情况。因此,使用基于社区的入口流量工程非常可取(并且推荐)。在没有社区(或无法引导客户流量)的情况下,可以使用预置,但我鼓励运营商积极监测效果,如果无效,则回退。

顺便一提,P Marcos 等人发表了一篇关于 AS 路径预置的有趣论文,深入探讨了预置方面的一些趋势。我强烈推荐大家阅读:https://www.caida.org/catalog/papers/2020_aspath_prepending/aspath_prepending.pdf

我们保护 整个企业网络,帮助客户 高效构建互联网规模应用,加速任何 网站或互联网应用,抵御 DDoS 攻击,阻止 黑客,并为您的 Zero Trust 之旅提供协助

从任何设备访问 1.1.1.1,使用我们的免费应用加速和保护您的互联网。

如需进一步了解我们帮助构建更美好互联网的使命,请从 这里 开始。如果您正在寻找新的职业方向,请查看 我们的空缺职位
Routing (CN)BGP (CN)Network (CN)简体中文

在 X 上关注

Tom Strickx|@tstrickx
Cloudflare|@cloudflare

相关帖子