Mahajan 2002 — 三周看互联网,1% 的路由更新是手滑
是什么
这篇论文做了一件简单到让人意外的事:架了 23 个监听点,连续记 BGP 路由通告三周,然后数有多少是手滑。
日常类比:像在十字路口架 23 台相机录三周,统计有多少司机是真的要左转,多少是开错车道临时打的方向灯。
数出来的结果是:每天 200-1200 个新前缀通告是误配置;占新路由的 1% 左右;4% 的误配置会持续几个小时;约 1.4% 真的把别人的网络黑掉了。
这个数字之所以重要,是它第一次给互联网量了一次「日常出错率」。在这之前,大家知道 BGP 偶尔出事,但没人知道究竟有多频繁。
为什么重要
不读这篇,下面这些事都讲不清楚:
- 为什么过了 20 多年,BGP 劫持新闻还在发——2008 把 YouTube 全球黑屏,2019 把 Cloudflare 流量带歪,2024 还在出
- 为什么互联网这种「关键基础设施」的核心协议至今没强鉴权
- 为什么云厂商要花大力气搞 RPKI / ROV / MANRS 这些后补丁
- 为什么「误配置」和「恶意劫持」从来分不清——它们在协议报文上长得一模一样,只能事后看动机猜
核心要点
论文把误配置拆成两类:
-
原始误配置(origin misconfig):一个 AS 跑出来宣告「这个前缀是我的」,但其实它根本没这块 IP。
- 类比:你把别人的车牌号当自己的报给停车场,然后对面真车主进不来。
- 论文里典型场景:把客户的内网前缀错误 redistribute 到外部、复制旧配置忘改前缀。
-
导出误配置(export misconfig):路由本身是真的,但你把它告诉了不该告诉的邻居——比如客户的路由泄给了别的 ISP,让流量绕远。
- 类比:你正常收快递没问题,但快递员把你家地址抄给了陌生人,开始有人按这个地址来你家。
- 论文里典型场景:忘了配 filter、community 标错、复制粘贴时漏改 peer 列表。
观测方法:
- 23 个公开的 BGP 监听点(RouteViews + RIPE)
- 看哪些「短命」前缀更新——出现几分钟又消失,且和已有路由冲突
- 给运营商发邮件求证,回复率约 60%,里面再人工分类
实践案例
案例 1:复制粘贴老配置
运营商加新客户,复制了上一个客户的 prefix-list 配置,忘了把前缀改掉。结果新客户的设备一上线,就把上一个客户的前缀又宣告了一遍。BGP 选路按 AS path 长短挑,部分流量从这一刻起被吸到错的那一边。
为什么反复发生:配置文件是纯文本 + 命令式 + 多人改,没有「这条规则的语义是什么」可校验。
案例 2:redistribute 把内部协议串到 BGP
路由器内部跑 OSPF,外部跑 BGP。redistribute 命令本意是把一些静态路由倒到 BGP 上发出去。手滑写成 redistribute ospf into bgp——所有内网路由全宣告到了全球。
经典案例:2008 年某运营商误把客户的 /24 私网前缀全部 export,全球流量被吸进去几分钟。
案例 3:误配置和恶意劫持长得一模一样
报文层面没法区分「我手滑」和「我故意」:
- 都是一个 AS 宣告了不属于它的前缀
- 都让全球路由表收敛到错的方向
- 都需要邻居主动 filter 才能挡住
这就是为什么 RPKI 之前,互联网对 BGP 劫持几乎没免疫力——协议把信任假设当默认。
案例 4:community 标签错位
很多 ISP 用 BGP community 字段来标记「这条路由要怎么对待」——比如「只在本国传」「不要发给客户」。一个标签数字错一位,原本应该限制在本国的路由就漏到全球。
这种错很难被发现,因为路由本身是合法的、源 AS 是合法的,只是传播范围错了。监听三周才能从异常路径分布里反推出来。
踩过的坑(也是为什么反复发生的根因)
-
协议没有 origin authentication:谁有权宣告某个 IP 段?BGP 自己不知道,邻居也不验。1989 年设计时是假设几十个学术机构互相信任。
-
协议没有 path authentication:AS path 是路由器一路加上去的字符串,任何中间节点都能伪造。BGPsec(RFC 8205, 2017)想修这个,部署率极低,因为加签会让收敛慢、CPU 重。
-
配置语言极底层:Cisco IOS / Juniper Junos 是命令式脚本,没有「整体一致性」概念。改一行可能引发跨设备级联效应,回滚也只能靠备份。
-
事务式提交不存在:大多数路由器是「敲一行生效一行」。半改完一半网络在新策略一半在老策略——和数据库没事务一样。
-
RPKI 部署缓慢:发布方要去 RIR 申请 ROA(声明哪些 AS 能宣告哪些前缀),接收方要部署 ROV(强制丢弃签名错的路由)。两侧都得动,且任何一个 ISP 不参与就漏防线。截至 2024 年,全球 ROV 强制率仍不到一半。
-
改一行影响全球:BGP 是个全互联网协议,本地一改,外部很快感知。没有「灰度发布」概念——你不能让 1% 的邻居先看到新策略再扩大。
适用 vs 不适用场景
这篇方法论适用于:
- 想量化任何协议的「日常错误率」——监听 + 求证邮件 + 分类,是非常便宜的实证研究
- 给基础设施改造找数据支撑——不是「我觉得 BGP 不安全」,是「1% 的更新出错」
不适用:
- 想分清误配置 vs 恶意劫持——这篇明确说做不到,只能看动机
- 想算精确事故影响——观测点有偏,且回复样本不全
- 想看现代 BGP 健康度——数据是 2001 年的,今天 RPKI / ROV 部署后图景变了,但根本机制还在
历史小故事(可跳过)
- 1989 年:BGP-1 出(RFC 1105),假设互联网就是几个学术 AS,互相信任,没鉴权设计。
- 1997-1999:Labovitz 系列论文发现 BGP 路由抖动严重,但没人量化「错误」。
- 2001 春:Mahajan 三人架监听点收三周数据。
- 2002 SIGCOMM:本论文发表,第一次给出「1% 的更新是误配置」这个数字,业界震惊。
- 2008:巴基斯坦 PCCW 案——一个国家的 ISP 误把 YouTube 前缀宣告到全球,YouTube 全球黑屏 2 小时。
- 2012 起:RPKI 标准化(RFC 6480 系列),业界尝试加签。
- 2019:Verizon 接受 Cloudflare 的路由泄漏,全球流量绕远 30 分钟,BGP 安全话题再起。
- 2024:MANRS、ROV 推广多年,仍每年出大事故。
学到什么
- 协议设计的安全假设会跨年代留存——1989 年的「互相信任」假设,2024 年还在让 ISP 头疼
- 测量 > 直觉——「BGP 不太安全」是直觉,「每天 200-1200 个新前缀是误配置」是数字。后者才能驱动改造
- 重发问题需要看「谁也不动」的均衡——RPKI 单边部署没用,得两边都改,所以推广慢
- 误配置和恶意行为在协议报文层不可分——这条是 BGP 安全所有讨论的底层约束
- 配置作为代码——这篇 2002 年就喊高级配置语言、lint、事务提交,今天 NetDevOps 圈才慢慢做起来
- 报错快不等于免疫——大部分误配几分钟内就被运营商发现并改正,但那几分钟内全球流量已经跑偏,缓存、DNS、TLS 重连都受影响
为什么劫持和泄漏反复发生(一段话总结)
BGP 是个没有鉴权的全网共识协议:任何 AS 都能开口说「这块 IP 是我的」、「我能到达那个目的地」,邻居默认信。配置又是命令式的、跨设备的、没事务的——人手抖、复制粘贴、redistribute 误用,每个都是小概率,乘以全球几万个 AS 和每天千万次更新,误配每天几百次是必然。RPKI / BGPsec 想从协议层堵漏,但部署需要全网协同,单边没用,所以推广 20 多年仍未铺满。这就是为什么劫持新闻每年都有,且短期内停不下来——问题不在某个运营商手滑,问题在协议假设和配置工艺整体落后于今天的互联网规模。
这篇之后的世界
研究侧:
- RPKI(Resource PKI):让 RIR 给每块 IP 签发 ROA(路由起源授权),接收方做 ROV 验证。RFC 6480 系列,2012 起标准化
- BGPsec:给 AS path 也加签,每个中间 AS 用私钥签自己加的那一段。RFC 8205, 2017,部署率几乎为零(CPU 太重)
- MANRS(Mutually Agreed Norms for Routing Security):业界倡议,要求成员部署 prefix filter、ASN filter、anti-spoof,做最低限度的卫生
工程侧:
- 配置 lint 工具:Batfish、NetMRI、Cariden——把命令行配置当代码做静态分析
- 事务式提交:Junos
commit confirmed、IOS XR replace 模式——让网络改动也能回滚
但所有这些都是补丁。BGP 协议本身的「默认信任」假设没改,30 多年后大家还在和它共生。
延伸阅读
- 论文 PDF:Mahajan-Wetherall-Anderson 2002
- 中文综述:BGP 路由安全的现状与挑战(CNNIC 系列)
- RPKI 入门:Cloudflare blog — How BGP and RPKI work
- 经典事故复盘:Cloudflare 2019 Verizon route leak post-mortem
- caesar-rexford-2005 —— BGP 综述论文,把 BGP 设计假设讲透
- gao-2001-as-relations —— AS 之间的客户/对等关系推断,是判别 export misconfig 的工具
- saltzer-1984-e2e —— 端到端论证,解释为什么协议核心层不应该承担过多
关联
- caesar-rexford-2005 —— 给 BGP 全貌做综述,本文是其中误配置一章的实证根据
- gao-2001-as-relations —— 推断 AS 关系的算法,是 export misconfig 检测的前置工具
- saltzer-1984-e2e —— 端到端论证,解释 BGP 为什么把鉴权留给上层而不是协议本身
- akamai-2002 —— 同年的另一篇网络论文,从应用层绕开 BGP 路由问题
- metcalfe-boggs-1976 —— 以太网,BGP 之下传输层的祖先
- tcp —— BGP 跑在 TCP 上,BGP 邻居断 = TCP 断
反向链接
- akamai-2002 —— Akamai 2002 — 把网站搬到离用户 10 毫秒的地方
- caesar-rexford-2005 —— Caesar-Rexford 2005 — 你的包为什么绕了大半个地球
- calder-2015-anycast-cdn —— Calder 2015 — Anycast CDN 在生产环境真的能用吗
- codons-2004 —— CoDoNS — 用 P2P 哈希表替代分层 DNS 的实验
- gao-2001-as-relations —— Gao 2001 — 用算法猜出互联网上 AS 之间谁给谁付钱
- metcalfe-boggs-1976 —— Metcalfe-Boggs 1976 — 一根线上几百台电脑怎么不打架
- r-bgp-2007 —— R-BGP 2007 — 故障切换前先把备份路径塞进邻居口袋
- ron-2001 —— RON 2001 — 让一小撮节点自己绕开 BGP 故障
- saltzer-1984-e2e —— End-to-End Arguments — 把功能尽量推到端上做
- tcp —— TCP — 在不可靠的 IP 上凿出一条 reliable 字节流