Hacker News 中文摘要

RSS订阅

先有CNAME还是先有A记录? -- What came first: the CNAME or the A record?

文章摘要

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函数 - 三款思科交换机(触发重启循环) 无法正确处理倒序记录

  1. 协议规范争议:
  • 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协议设计、实现依赖和兼容性问题的多角度讨论,既有技术分析,也有对流程的质疑。