什么是BGP?互联网路由基础完全解析

成千上万个各自独立运营的网络,究竟是如何互相告知路由、连接成一个整体的?本文介绍BGP的工作方式、选路规则,以及它为什么会出问题。

什么是BGP

BGP(边界网关协议)与家庭或办公室内部网络使用的路由方式不同,它专为不同组织各自运营的网络之间交换路由信息而设计。互联网其实并不是一个巨大的单一网络,而是由运营商、云服务商、大学、企业等运营的无数个独立网络,通过BGP互相连接而成的“网络的网络”。目前使用的是第4版BGP(RFC 4271),从1990年代起就是互联网域间路由的标准协议。

什么是自治系统(AS)

运营商、大型云服务商、大学和大企业通常各自运营一个或多个自治系统,并由国际互联网注册机构分配一个全球唯一的AS编号(ASN)。全球共有五个区域互联网注册机构(ARIN、RIPE NCC、APNIC、LACNIC和AFRINIC),使用中的ASN数量以万计。严格来说,BGP交换的不是单个IP地址之间的路由信息,而是自治系统与自治系统之间的路由信息。

外部BGP与内部BGP

两台愿意交换路由的BGP路由器会先通过TCP(179端口)建立会话,再互相发送路由通告。如果两台路由器属于不同的AS,这种会话称为eBGP;如果属于同一个AS,用于在内部共享从外部学到的路由,则称为iBGP。两者的行为有所不同:eBGP会在AS路径中加入发送方的AS编号,iBGP则不会。

路由通告与最佳路径选择

当一个AS通告自己负责的IP地址段时,相邻的AS会将其记录在自己的路由表中,再继续传递给它自己的相邻AS。这样反复传播后,全球的路由器就会知道到达某个目的地需要经过哪些AS(AS路径);当存在多条候选路径时,会依据既定标准(例如经过的AS数量更少)选出一条。实际上,运营商往往先按自己设置的本地优先级(成本、合同、容量)选路,之后才比较AS路径长度等其他条件。

为什么最具体的前缀优先

在比较路径之前,路由器先遵循一条更基础的规则:最长前缀匹配优先。如果一个AS通告203.0.113.0/24,另一个AS只通告范围更大的203.0.0.0/16,那么发往/24范围内地址的流量会走/24的路由,无论AS路径有多长。这条规则可用于流量调度,但也正是劫持者喜欢通告比受害者更具体前缀的原因。作为常见的实践,许多网络会过滤掉比/24更具体的IPv4通告和比/48更具体的IPv6通告。

对等互联与转接的关系

规模相近的大型运营商或内容提供商,常常会在互联网交换中心(IXP)直接互联,免费交换彼此的流量,这种关系称为“对等互联”(peering)。而没有自己长途骨干网络的中小型网络,则会向上层运营商付费,签订“转接”(transit)合同,从而获得通往整个互联网其余部分的路由。客户期望上游把自己的路由通告给所有人,而对等方只会为对方的客户转发流量,因此商业关系和成本同样会影响流量走向。

什么是BGP劫持

BGP劫持是指某个网络因失误或恶意目的,通告了一段自己并不实际拥有的IP地址,把本应流向其他网络的流量引向了错误的方向。由于BGP的设计基本上默认信任相邻网络所通告的信息,一旦某个AS因配置失误或恶意行为通告了不属于自己的IP段,该段地址的部分流量就可能被错误路由。一个广为人知的例子发生在2008年2月:巴基斯坦的一家运营商为了在国内屏蔽YouTube,通告了一条更具体的路由,结果泄露到了更大范围的互联网,使YouTube的流量在一段时间内被错误引走。

路由泄露与劫持不是一回事

路由泄露是指某个网络把从一个邻居学到的路由,以违背预期商业关系的方式转发给另一个邻居,例如把一个上游的路由传给另一个上游。路由的来源是合法的,但流量被引到了本不该经过的路径,常导致拥塞和变慢,而不是彻底中断。劫持涉及错误的“来源”,泄露涉及错误的“路径”,两者的对策也不同。

BGP为何以“信任”为前提设计

BGP诞生于1980年代末,当时接入互联网的组织数量相对较少,彼此之间保持一定程度的信任是合理的。因此,验证“某条通告是否真的来自该IP段合法所有者”的加密验证机制,并未被纳入最初的设计之中——这也成为延续至今的结构性安全弱点。后来的安全措施只能从外部补充,例如运营商过滤、路由登记库和加密证书。

RPKI如何验证路由

RPKI(资源公钥基础设施)让地址注册机构可以提前用加密方式证明“某个AS有权通告某个IP段”,这类签名对象称为ROA(路由起源授权)。采用RPKI的网络可以将收到的BGP通告与这些证书进行比对,这个过程称为路由起源验证,并自动过滤掉来自未获授权来源的错误通告。RPKI验证的是“谁有权发起”某个前缀,并不能证明整条路径都是可信的。不过并非所有网络都已采用RPKI,持续提高其普及率仍是互联网安全社区面临的课题。

为何一个小失误会引发全球性故障

如果某个AS因失误一次性通告了远超其实际拥有范围的IP地址段,或者泄露了错误的路由信息,相邻的AS会照单全收并继续向外传播,导致错误在几分钟之内迅速扩散到整个互联网。这也是为什么大型互联网服务或云服务商发生故障时,新闻中常常会提到“配置失误导致的BGP路由问题”这一原因。另一种故障形式是路由被撤回:2021年10月,Facebook的一次配置变更使其网络停止通告路由,服务中断了数小时。

一条路由是如何传播的:一个简化的例子

假设有一家小公司,使用AS 64500(私有编号范围内的号码,此处仅作示意),拥有地址段198.51.100.0/24,并向一家区域运营商购买转接服务。公司的路由器把这段地址通告给运营商,运营商在AS路径中加入自己的AS编号后,再通告给它的上游和对等方,对方再依次添加自己的编号。经过几跳之后,地球另一端的路由器就会得到一条记录:要到达198.51.100.0/24,把流量送往某个邻居,经过若干个AS,最终到达64500。如果公司的线路故障,运营商会撤回通告,其他地方的路由器会改用其他已知路径,或者彻底失去这条路由。这个收敛过程可能需要几秒到几分钟,所以互联网故障很少是瞬间、均匀发生的。

BGP通告的地址段究竟是如何划分的

如果好奇AS通告IP地址段时使用的表示方法,可以了解一下CIDR表示法——这是简洁表达地址块及其大小的基础机制,理解它会让路由通告变得容易读懂得多。/24包含256个地址,/16包含65,536个,前缀长度每减少1位,地址块就翻一倍。全球路由表中的IPv4前缀数量已达到百万量级,每台路由器都需要存储这些条目。

真正在洲际之间承载流量的是什么

BGP决定的只是逻辑上的路径,而真正在各大洲之间物理传输数据的,是海底电缆。BGP的逻辑路由与实体电缆网络相结合,才构成了一个统一的全球互联网。当某条电缆中断时,BGP会把流量切换到其余线路上,不过备用线路的容量可能会吃紧。

运营商如何自我防护

网络运营商通常采取多层防护:对客户的通告做过滤,确保客户只能通告自己的前缀;限制从任一邻居接收的前缀数量;为自己的地址空间发布ROA;拒绝未通过起源验证的路由。这些措施单独看都不完整,所以严重的路由事故每年仍会发生。对一般组织而言,最现实的做法是发布准确的ROA,并选择严格执行过滤和验证的服务商。

常见问题

我家里用的路由器也用到BGP吗?

不会。家庭或办公室的内部网络通常依靠静态路由,或DHCP分配的默认网关信息就足以正常运行。BGP专门用于拥有自己AS编号的组织——例如运营商、云服务商和大型企业——之间交换路由信息。

普通用户能察觉到BGP劫持正在发生吗?

普通用户通常只会感觉到某个网站突然变慢或无法访问,很难直接判断原因是否出在BGP上。多数情况下,是网络运营商或安全公司通过监控路由,在事后才确认BGP路由错误是根本原因。加密连接(HTTPS)能限制攻击者对被劫持流量的利用,但不能阻止流量被引走。

BGP和OSPF有什么区别?

OSPF是内部网关协议,用于在单个组织的网络内部,根据链路成本找出最短路径。BGP是外部协议,在不同组织之间交换可达性信息,主要根据商业关系等策略而不是单纯的速度来选路。大型网络通常两者并用:内部使用OSPF或IS-IS,边界使用BGP。

小企业可以自己运行BGP吗?

可以,但需要有自己的AS编号和独立的公网IP地址段,二者通常通过区域互联网注册机构或服务商申请,还需要有愿意与你建立BGP会话的上游。大多数小企业并不需要,使用运营商分配的地址空间就足够了。只有在需要多线接入(同时连接多家运营商以保证冗余)时,BGP才变得有价值。

有了RPKI,BGP就安全了吗?

RPKI是重要的一步,但并不完整。路由起源验证能防止许多意外劫持和简单的恶意劫持,但它不验证完整的AS路径,因此更复杂的路径操纵仍然可能发生。路径验证方面已有新的技术,但部署有限,所以RPKI最好被看作多层防护中的一层。