2026年1月8日,互联网的脉搏突然漏了一拍。
不是黑客攻击,也不是海底光缆被挖断,甚至不是什么惊天动地的服务器宕机。
罪魁祸首,仅仅是为了省一点内存,把几行数据的位置挪了一下。
就在那天,全球无数用户的 DNS 解析突然失效,网页打不开,软件连不上。而这一切的根源,指向了一个尘封了40年的互联网协议“模糊地带”。
一次为了省内存的“微整形”
事情得从 2025 年 12 月 2 日说起。
Cloudflare 的工程师们在维护 1.1.1.1 这个全球知名的公共 DNS 服务时,做了一次代码优化。目标很单纯:降低缓存实现的内存占用。
改动小到几乎不值一提:在合并 DNS 记录时,原本是“先插入 CNAME 记录,再追加 A 记录”,为了省去内存分配和复制的开销,改成了“直接把 CNAME 记录追加到现有列表后面”。
在工程师眼里,这就像整理书架,先放小说还是先放杂志,只要书都在,有什么区别?
但在互联网的底层逻辑里,顺序就是一切。
代码在测试环境里跑了一个月,安然无恙。2026 年 1 月 7 日晚,更新开始全球推送。第二天傍晚,当 90% 的服务器都更新完毕时,警报拉响了。
谁在“死板”地读数据?
为什么换个顺序就会出大乱子?
这得聊聊 DNS 解析里的“链路追踪”。当你访问 www.example.com 时,DNS往往不会直接给你 IP 地址,而是给你一连串“别名”(CNAME),让你像接力棒一样一步步找到终点。原来的逻辑是这样的:
- 答:它是
cdn.example.com 的别名。
这是按顺序读的,顺理成章。
但 Cloudflare 的那次更新,把顺序打乱了。回答变成了这样:
- 答:IP 是
198.51.100.1(这是 cdn.example.com 的 IP)。 - 答:
www.example.com 是 cdn.example.com 的别名。
对于“聪明”的现代解析器,这没问题,它们会把整个包读完再整理。
但对于那些“老实”的解析器,这简直是灾难。比如 Linux 系统里常用的 glibc 库,以及某些型号的 Cisco 交换机。
它们是“顺序执行”的死忠粉。读到第一条记录时,发现名字对不上(我要找 www,你给我 cdn 的 IP),直接忽略;读到第二条记录时,发现名字对上了,但这是 CNAME,于是它更新目标,准备找下一跳——结果发现,没下文了。
在它们眼里,这个 DNS 响应包是空的。
更惨的是 Cisco 的三款以太网交换机。收到这种乱序包后,它们没有选择报错,而是选择了“死机”——直接陷入无限重启循环。
40年前的“模糊”预言
为什么会出现这种“有的软件能忍,有的软件不能忍”的情况?
得去翻翻 1987 年的老黄历。
那一年发布的 RFC 1034,是 DNS 协议的基石。里面有一句看似轻描淡写的话:
The answer to the query, possibly preface by one or more CNAME RRs...注意这个单词:preface(作为序言/前置)。
按照字面意思,CNAME 记录应该放在最前面。但问题是,1987 年的协议还没那么严谨,没用上后来那种“MUST”(必须)、“SHOULD”(应该)的强制性词汇。
直到 1997 年,RFC 2119 才把这些规范词给标准化了。
这就留下了一个巨大的解释空间:CNAME 到底是“必须”在前,还是“建议”在前?
Cloudflare 的工程师们认为,只要数据都在,顺序无所谓。毕竟 RFC 里也说过,同一组记录(RRset)的顺序不重要。
但他们忽略了一个细节:RFC 讨论的是“同一组记录”的顺序,而 CNAME 和 A 记录,根本就不是同一组。
这就是那个埋藏了 40 年的逻辑陷阱。
现实给理想上了一课
虽然从协议字面上看,Cloudflare 甚至可能觉得自己没错。但互联网不是实验室,它是无数旧系统、旧代码堆起来的金字塔。
你永远不知道有多少老旧的设备、多少不再更新的嵌入式系统,正死死守着“CNAME 必须在前”这条不成文的规矩。
事故发生后,Cloudflare 的反应很快。18:19 宣布事故,18:27 就开始回滚代码。不到两小时,一切恢复正常。
但这事儿不能就这么算了。
为了防止未来再有人踩进这个坑,Cloudflare 干了一件大事:他们向 IETF(互联网工程任务组)提交了一份草案。
这份草案的目的很明确:别再猜了,咱们把规矩立死。
未来的新 RFC 将会明确规定,CNAME 记录必须出现在其他记录之前。这不仅是给 Cloudflare 自己看的,也是给整个 DNS 社区的一个交代。## 写在最后
这次故障像是一个警钟。
在软件工程里,我们常说“不要过早优化”。为了省那一点点内存,换来全球网络的波动,这笔账怎么算都不划算。
更重要的是,它提醒了我们:互联网是建立在几十年前的“默契”之上的。
那些看似模糊、不严谨的古老协议,依然在支撑着我们每天数千亿次的数据交换。当你试图挑战这些“潜规则”时,最好先确认一下,整个世界是不是已经准备好跟你一起向前走了。
毕竟,在互联网的世界里,顺序,有时候就是生死。
参考链接: https://blog.cloudflare.com/cname-a-record-order-dns-standards/