由于线上运行的dns系统实现较多,且对标准的支持程度差别较大,导致各系统交互时,引入不必要的兼容性要求,使整个DNS系统代码变得复杂且效率降低。为了解决这个问题,由国外的一些大型的dns服务商牵头,包括ISC(bind), CZ.NIC(knot), Google, Powerdns, 思科,cloudflare等,发起了向标准协议对齐,对非标准的实现不再兼容的倡导,此倡导被称为DNS Flag Day.
DNS Flag Day 2019
2019.2.1为第一次共识的截止时间,此次共识主要解决授权服务器对edns的支持不符合协议引入的两个问题:
- 如果携带edns的请求timeout,则不会重试去掉edns的请求,直接将ns标识为不可用(重试引入时延)。
- 如果不支持edns,对于后面dns新特性的支持将受限,比如dnssec。
主要包括三个协议的对齐:
RFC1035 - DNS基础协议;
RFC2671 - EDNS0定义;
RFC6891 - EDNS0更新;
逻辑变更
主要包括以下两个方面:
- dns-recursor对于某些服务器的EDNS查询超时,不会像以前一样再次发送不携带EDNS的查询,而是认为该服务器上的53服务已经终止。这将导致递归服务器后续的请求不会到达这台DNS服务器,导致同zone的其他NS负载上升。
- 按照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服务提供商基本都有自己实现的版本,以下服务商已明确支持:
- Akamai
- Citrix
- BlueCat
- efficient iP
- F5 BIG-IP
- Juniper: Older versions of the Juniper SRX will drop EDNS packets by default. The workaround is to disable DNS doctoring via # set security alg dns doctoring none. Upgrade to latest versions for EDNS support.
- Infoblox
- Microsoft Azure, Microsoft DNS
- Pulse Secure
测试方法
- web测试方法 - https://ednscomp.isc.org/ednscomp;
- 源码测试方法 - https://gitlab.isc.org/isc-projects/DNS-Compliance-Testing;
- 批量测试方法 - https://gitlab.nic.cz/knot/edns-zone-scanner/-/tree/master;
- dig测试方法 - https://kb.isc.org/docs/edns-compatibility-dig-queries;