DNS Flag Day 2019

由于线上运行的dns系统实现较多,且对标准的支持程度差别较大,导致各系统交互时,引入不必要的兼容性要求,使整个DNS系统代码变得复杂且效率降低。为了解决这个问题,由国外的一些大型的dns服务商牵头,包括ISC(bind), CZ.NIC(knot), Google, Powerdns, 思科,cloudflare等,发起了向标准协议对齐,对非标准的实现不再兼容的倡导,此倡导被称为DNS Flag Day.

DNS Flag Day 2019

2019.2.1为第一次共识的截止时间,此次共识主要解决授权服务器对edns的支持不符合协议引入的两个问题:

  1. 如果携带edns的请求timeout,则不会重试去掉edns的请求,直接将ns标识为不可用(重试引入时延)。
  2. 如果不支持edns,对于后面dns新特性的支持将受限,比如dnssec。

    主要包括三个协议的对齐:
    RFC1035 - DNS基础协议;
    RFC2671 - EDNS0定义;
    RFC6891 - EDNS0更新;

逻辑变更

主要包括以下两个方面:

  1. dns-recursor对于某些服务器的EDNS查询超时,不会像以前一样再次发送不携带EDNS的查询,而是认为该服务器上的53服务已经终止。这将导致递归服务器后续的请求不会到达这台DNS服务器,导致同zone的其他NS负载上升。
  2. 按照RFC6891-section7,未包含opt的请求,响应中不得包含opt;如果请求者支持opt,权威自己不支持opt,则权威应该回复formerr,并且不带opt;如果请求者支持opt,权威自己也支持opt,但是请求的opt记录中格式或者值错误,则回复formerr并携带opt记录。

递归服务器

以下开源递归服务器的新版本将不提供兼容:

  • BIND 9.13.3 (development) and 9.14.0 (production)
  • Knot Resolver has already implemented stricter EDNS handling in all current versions
  • PowerDNS Recursor 4.2.0
  • Unbound 1.9.0

授权服务器

授权服务器的开源实现,基本都是遵循协议的,比如Bind/Knot dns/Powerdns等,当各DNS服务提供商基本都有自己实现的版本,以下服务商已明确支持:

测试方法

  1. web测试方法 - https://ednscomp.isc.org/ednscomp;
  2. 源码测试方法 - https://gitlab.isc.org/isc-projects/DNS-Compliance-Testing;
  3. 批量测试方法 - https://gitlab.nic.cz/knot/edns-zone-scanner/-/tree/master;
  4. dig测试方法 - https://kb.isc.org/docs/edns-compatibility-dig-queries;