你有没有想过一个问题:当你坐在北京的家里,打开浏览器访问一个部署在阿根廷的网站时,你的数据是怎么穿越半个地球到达那里的?
这背后的功臣,就是今天要聊的主角——BGP,全称 Border Gateway Protocol,中文叫「边界网关协议」。
说它是互联网最重要的协议之一,一点都不夸张。某种程度上,BGP 就是让整个互联网”跑起来”的那个东西。没有它,互联网不过是一堆彼此孤立的网络碎片。
先从一个比喻说起
Cloudflare 有一个很经典的比喻:BGP 就是互联网的邮政系统。
想象一下你寄一封信。你把信扔进邮筒之后,邮局会帮你规划路线——先送到本地分拣中心,再转到区域枢纽,然后跨省、跨国,最终送到收件人手上。在这个过程中,邮局不需要知道全世界每一个门牌号的精确位置,它只需要知道”下一站该把这封信交给谁”就行了。
BGP 干的就是这个活儿。互联网上有成千上万个大大小小的网络,BGP 负责告诉每个路由器:”嘿,要到达那个目的地,你应该走这条路。”
什么是自治系统(AS)

要理解 BGP,首先得知道一个概念:自治系统(Autonomous System,简称 AS)。
互联网并不是一个浑然一体的网络,而是由无数个小网络拼接在一起的。每一个”小网络”就是一个自治系统。它可以是一个互联网服务提供商(ISP)的网络,可以是一所大学的校园网,可以是一家大公司的内部网络,也可以是像 Facebook、Google 这样的科技巨头自己运营的网络基础设施。
每个自治系统都有一个全球唯一的编号,叫 ASN(Autonomous System Number)。比如 Cloudflare 的 ASN 是 AS13335,Facebook(现在的 Meta)是 AS32934。
这些自治系统各自管理自己的内部路由,但要和外面的世界通信,就需要一种”通用语言”来交换路由信息。这个通用语言,就是 BGP。
BGP 到底是怎么工作的
BGP 的工作原理其实并不复杂,可以用三步来概括。
第一步是「建立邻居关系」。两个自治系统边缘的路由器会通过 TCP 179 端口建立连接,互相确认对方的存在。这个过程叫做 peering(对等互联)。一旦连接建立,它们就成了 BGP peers(BGP 对等体),之后会每隔 30 秒发送一次 keep-alive 消息,确认彼此还”活着”。
第二步是「交换路由信息」。BGP 对等体之间会互相通告自己能到达哪些网络前缀(IP 地址段)。这些通告里不仅包含目的地信息,还包含到达目的地的完整路径——经过了哪些自治系统。这也是为什么 BGP 被归类为「路径向量协议」(path-vector protocol)的原因。
第三步是「选择最优路径」。当一个路由器通过 BGP 收到了多条到达同一目的地的路由时,它会根据一系列属性来挑选最好的那条。最直观的指标是 AS 路径长度——经过的自治系统越少,路径越短,一般就越优先。但实际上还有很多其他属性可以影响路径选择,比如 local preference(本地偏好)、权重等,网络管理员可以通过配置这些参数来精细化地控制流量走向。
值得一提的是,BGP 是一个「增量更新」的协议。它不会每隔一段时间就把整张路由表重新发送一遍,而是只在有变化的时候发送变化的部分。这一点对于维持互联网的稳定性非常重要——毕竟全球 IPv4 路由表的条目已经超过 100 万条了,每次全量同步的话,路由器根本受不了。
eBGP 和 iBGP:外部与内部

BGP 分为两种风味:eBGP(External BGP)和 iBGP(Internal BGP)。
eBGP 用于不同自治系统之间的路由信息交换,这是 BGP 最核心的用途——把互联网这张大拼图拼在一起。
iBGP 则用于同一个自治系统内部的路由信息同步。你可能会问:内部路由不是有 OSPF、IS-IS 这些协议吗?没错,但对于大型网络来说,iBGP 可以用来在内部传递从外部学到的路由信息。打个比方,eBGP 就像国际快递,负责跨国运输;iBGP 就像国内物流,负责把包裹从口岸送到你手上。
两者有一个关键的区别:从 eBGP 邻居学到的路由,会被转发给所有 eBGP 和 iBGP 邻居;而从 iBGP 邻居学到的路由,只会被转发给 eBGP 邻居,不会再传给其他 iBGP 邻居。这个规则是为了防止路由环路,但也因此要求 iBGP 邻居之间必须建立全网状连接(full mesh),或者使用路由反射器(Route Reflector)来简化拓扑。
BGP 的”信任问题”
现在聊一个有意思的话题。
BGP 诞生于 1989 年——对,就是那个互联网还很”单纯”的年代。当时的设计哲学是基于信任的:我告诉你我能到达某个网络,你就相信我。
这套机制在互联网规模较小、参与者都比较”老实”的时候运作得很好。但随着互联网爆炸式增长,这种基于信任的模型就露出了破绽。
因为 BGP 本身没有内建的验证机制,任何一个自治系统都可以宣称自己能到达任何一个 IP 地址段。如果这个宣称是假的——不管是故意的还是不小心的——就会导致所谓的 BGP 劫持(BGP Hijacking)。
那些因为 BGP 出事的”名场面”
BGP 的脆弱性不是理论上的假设,历史上发生过很多次真实的、影响巨大的事故。
2008 年:巴基斯坦”误杀”全球 YouTube

这大概是 BGP 历史上最有名的事件。2008 年 2 月,巴基斯坦政府下令封锁 YouTube。巴基斯坦电信为了执行这个命令,在 BGP 中宣告了一条指向 YouTube IP 段的更具体路由(/24),意图把国内用户的 YouTube 流量引到黑洞中丢弃。
问题出在哪儿呢?这条路由被泄露给了它的上游提供商——香港的 PCCW。PCCW 没有做任何过滤验证,直接把这条路由传播到了全球互联网。由于 /24 比 YouTube 自己宣告的 /22 更具体,根据 BGP 的最长前缀匹配规则,全球的路由器纷纷选择了这条假路由。
短短三分钟内,全球大部分 YouTube 流量都被导向了巴基斯坦。YouTube 在全球范围内瘫痪了大约两个小时,直到 PCCW 手动撤回了这条路由才恢复。
一个本来只想在国内封锁 YouTube 的操作,因为 BGP 的信任模型,变成了一场全球性的互联网事故。
2021 年:Facebook 从互联网上”消失”了六个小时
2021 年 10 月 4 日,一个更戏剧性的事件发生了。Facebook(以及 Instagram、WhatsApp、Messenger)从互联网上完全消失了将近七个小时。
起因是 Facebook 的工程师在对骨干网络进行例行维护时,执行了一条用于评估全球骨干网容量的命令。但这条命令出了 bug——它意外地断开了 Facebook 所有数据中心之间的连接。
更要命的是,Facebook 的 DNS 服务器有一个安全机制:如果它们检测到无法连接到 Facebook 的数据中心,就会自动撤回自己的 BGP 路由宣告。于是,当骨干网断了之后,DNS 服务器判断”网络不健康”,自动把自己从互联网上”摘”了下来。
结果就是,全世界的路由器都不知道该怎么找到 Facebook 了。更讽刺的是,Facebook 内部用来修复问题的工具也依赖于自家的网络和 DNS——所以连修复都变得极其困难。据说工程师们不得不亲自跑到数据中心去物理操作路由器。
这次事故让 Facebook 的股价当天下跌了近 5%,扎克伯格个人身家蒸发超过 60 亿美元,Facebook 的广告收入损失至少 6000 万美元。
其他事件
类似的事件还有很多。1997 年的 AS7007 事件是第一次大规模的 BGP 路由泄露,一个路由器因为软件 bug 宣告了全球路由表的大部分内容。2020 年,俄罗斯的 Rostelecom 意外宣告了超过 8000 条不属于自己的前缀,导致 Google、Facebook、Amazon 等大量服务受影响。2022 年,俄罗斯电信在试图国内封锁 Twitter 时,泄露的路由影响了其他国家的 Twitter 用户。
这些事件反复证明了一个事实:在 BGP 的世界里,一个自治系统的”手抖”,可能导致整个互联网震动。
让 BGP 更安全:RPKI
面对这些问题,互联网社区并非坐视不管。目前最主要的应对方案是 RPKI(Resource Public Key Infrastructure,资源公钥基础设施)。
RPKI 的核心思想很简单:用密码学证书来证明一个自治系统确实有权宣告某个 IP 前缀。网络运营商可以创建 ROA(Route Origin Authorization),声明”AS12345 有权宣告 1.2.3.0/24″。其他路由器在收到 BGP 宣告时,可以通过 RPKI 验证这条路由是否合法。
在 2020 年 Rostelecom 的事件中,启用了 RPKI 验证的网络(如 Telia、NTT)成功忽略了那些错误的路由宣告,有效限制了事故的影响范围。
不过 RPKI 的部署进度在全球范围内仍然参差不齐,还有很长的路要走。
写在最后
BGP 的故事其实挺有意思的。它是一个诞生于 1989 年、最初设计被画在两张餐巾纸上的协议,却至今支撑着整个互联网的运转。它的核心机制建立在信任之上——你说你能到达哪里,我就信你——这在早期互联网的”小圈子”里是合理的,但放到今天这个规模的互联网上,就显得有些天真了。
然而,尽管有这样那样的问题,BGP 依然是互联网路由的基石,没有任何协议能够替代它。互联网社区选择的策略不是推倒重来,而是在现有基础上添加安全层(比如 RPKI 和 BGPsec),逐步加固这座已经运行了三十多年的大厦。
下次当你流畅地刷着视频、发着消息的时候,不妨想一想:你的每一个数据包,都在 BGP 的指引下,穿越了无数个自治系统,最终找到了它要去的地方。这个过程通常只需要几十毫秒——快到你根本感觉不到。
但如果有一天 BGP 出了问题,你一定会感觉到的。就像 2021 年那个下午,全世界 35 亿 Facebook 用户突然发现自己哪儿也去不了了一样。

发表回复