由于线上运行的dns系统实现较多,且对标准的支持程度差别较大,导致各系统交互时,引入不必要的兼容性要求,使整个DNS系统代码变得复杂且效率降低。为了解决这个问题,由国外的一些大型的dns服务商牵头,包括ISC(bind), CZ.NIC(knot), Google, Powerdns, 思科,cloudflare等,发起了向标准协议对齐,对非标准的实现不再兼容的倡导,此倡导被称为DNS Flag Day.
DNS Flag Day 2020
2020.10.1为第二次共识的截止时间,此次共识主要解决授权服务器及递归服务器对tcp协议的支持,避免udp报文的分片发生。
主要包括三个协议的对齐:
RFC7766 - DNS必须支持TCP;
RFC6891 section 6.2.3. - 请求EDNS0 bufsize默认为1232;
RFC6891 section 6.2.4. - 响应EDNS0 bufsize默认为1232;
逻辑变更
主要包括以下两个方面:
- 请求及响应中edns0 bufsize默认设置为1232,减少分片的可能性。
- 对于超过1232的报文,响应中需要置截断标识位,并且客户端需要发起tcp请求,服务端需要能够处理tcp请求。
递归服务器
- 支持tcp53端口的dns请求;
- 支持1232字节大小的bufsize,对于超过的截断。
授权服务器
- 支持tcp53端口的dns请求;
- 支持1232字节大小的bufsize,对于超过的截断。
测试方法
- 授权web测试方法 - https://dnsflagday.net/2020/index.html#action-authoritative-dns-operators;
- 递归web测试方法 - https://dnsflagday.net/2020/index.html#action-dns-resolver-operators;
- dig测试方法 - https://dnsflagday.net/2020/index.html#how-to-test;
服务器配置方法
下面的开源软件对tcp的支持是默认的,不需要配置,所以只配置默认的edns bufsize的大小。
- BIND
1
2
3
4options { edns-udp-size 1232; max-udp-size 1232; }; - Knot DNS
1
2server: max-udp-payload: 1232 - Knot Resolver
1
net.bufsize(1232) - PowerDNS Authoritative
1
udp-truncation-threshold=1232 - PowerDNS Recursor
1
2edns-outgoing-bufsize=1232 udp-truncation-threshold=1232 - Unbound
1
2server: edns-buffer-size: 1232 - NSD
1
2
3server: ipv4-edns-size: 1232 ipv6-edns-size: 1232