文章摘要
2026年1月,Cloudflare对1.1.1.1 DNS服务的例行更新意外导致全球用户解析故障。原因是DNS响应中记录顺序的改变——某些客户端要求CNAME记录必须排在首位,而这一40年来的协议模糊性使得"正确"顺序难以界定。故障暴露了DNS标准中关于记录顺序的长期歧义问题。
文章总结
标题:DNS解析故障溯源:CNAME与A记录的排序之争
来源:Cloudflare技术博客 发布时间:2026年1月14日
核心事件: 2026年1月8日,Cloudflare对1.1.1.1 DNS解析服务的内存优化更新意外引发全球性解析故障。根本原因在于DNS响应中CNAME记录排序的改变触发了部分客户端解析逻辑的异常。
技术背景: 1. DNS解析链示例: www.example.com → cdn.example.com → server.cdn-provider.com → 198.51.100.1 2. 缓存机制:各中间记录具有独立TTL,支持部分链过期时的增量更新
故障时间线: - 2025-12-02:代码变更引入记录排序调整 - 2026-01-07:变更开始全球部署 - 2026-01-08 18:19:故障正式宣告 - 19:55:回滚完成,服务恢复
技术细节: 1. 代码变更: 原逻辑将CNAME置于响应顶部,优化后改为追加到现有记录末尾,导致部分客户端: - glibc的getaddrinfo函数 - 三款思科交换机(触发重启循环) 无法正确处理倒序记录
- 协议规范争议:
- RFC 1034(1987)使用"possibly preface"描述CNAME位置,但缺乏现代RFC的强制用语(MUST/SHOULD)
- 现代DNSSEC规范(RFC 4035)对RRSIG记录有明确排序要求
- RRset(相同名称/类型记录集)内部顺序无关性不适用于跨类型记录排序
影响范围: - 主要影响依赖顺序解析的客户端实现 - 现代解析器(如systemd-resolved)通过全量解析不受影响
解决方案: 1. 立即措施:恢复CNAME优先的原始排序逻辑 2. 长期方案:向IETF提交《draft-jabley-dnsop-ordered-answer-section》草案,建议明确规范: - CNAME记录应置于响应顶部 - CNAME链需保持逻辑顺序
行业启示: 1. 40年历史的DNS协议存在实现差异空间 2. 性能优化需考虑历史客户端兼容性 3. 云服务商在协议演进中的桥梁作用
延伸阅读: - 思科技术公告:kmgmt3846-cbs-reboot - IETF草案:datatracker.ietf.org/doc/draft-jabley-dnsop-ordered-answer-section
(注:原文中产品推广及招聘相关内容已按主题相关性进行删减)
评论总结
以下是评论内容的总结:
1. DNS协议普遍存在问题
- 观点:DNS协议存在长期未解决的奇怪问题,可能需要彻底放弃才能解决。
- 引用:
- "Random DNS servers and clients being broken in weird ways is such a common problem..."(charcircuit)
- "It's surprising how something so simple can be so broken."(charcircuit)
2. 对RFC 1034的解释分歧
- 观点:RFC 1034中关于CNAME顺序的表述存在歧义,但部分人认为其含义明确。
- 引用:
- "The 'possibly preface'... is obviously to be understood as 'if there are any CNAME RRs, the answer...'"(steve1977)
- "It's pretty clear that CNAME is at the beginning... If they are present, they are first."(paulddraper)
3. 实现依赖与测试不足
- 观点:许多实现依赖未明确规定的行为,且缺乏全面的测试套件。
- 引用:
- "I'm just surprised that anyone is implementing... without a comprehensive test suite..."(frumplestlatz)
- "How come this issue was discovered only in production?"(mdavid626)
4. 兼容性与修复建议
- 观点:尽管RFC未明确要求顺序,但为兼容性应保持CNAME顺序。
- 引用:
- "That's the only reasonable conclusion, really."(forinti)
- "I kind of wish they start sending records in randomized order..."(sebastianmestre)
5. 其他技术问题
- 观点:DNS还存在其他设计缺陷,如错误处理和服务发现问题。
- 引用:
- "Main one being that if an upstream DNS server returns SERVFAIL..."(seiferteric)
- "Results in a bunch of pointless upstream queries..."(seiferteric)
6. 流程与响应时间
- 观点:Cloudflare的回滚部署时间异常长,RFC更新流程值得讨论。
- 引用:
- "You'd think that would be a very long time for CloudFlare infrastructure."(therein)
- "Would this be worth filing errata against the original RFC..."(ShroudedNight)
总结反映了对DNS协议设计、实现依赖和兼容性问题的多角度讨论,既有技术分析,也有对流程的质疑。