DNS Flag Day 2020

由于线上运行的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;

逻辑变更

主要包括以下两个方面:

  1. 请求及响应中edns0 bufsize默认设置为1232,减少分片的可能性。
  2. 对于超过1232的报文,响应中需要置截断标识位,并且客户端需要发起tcp请求,服务端需要能够处理tcp请求。

递归服务器

  1. 支持tcp53端口的dns请求;
  2. 支持1232字节大小的bufsize,对于超过的截断。

授权服务器

  1. 支持tcp53端口的dns请求;
  2. 支持1232字节大小的bufsize,对于超过的截断。

测试方法

  1. 授权web测试方法 - https://dnsflagday.net/2020/index.html#action-authoritative-dns-operators;
  2. 递归web测试方法 - https://dnsflagday.net/2020/index.html#action-dns-resolver-operators;
  3. dig测试方法 - https://dnsflagday.net/2020/index.html#how-to-test;

服务器配置方法

下面的开源软件对tcp的支持是默认的,不需要配置,所以只配置默认的edns bufsize的大小。

  • BIND
    1
    2
    3
    4
    options {
    edns-udp-size 1232;
    max-udp-size 1232;
    };
    
  • Knot DNS
    1
    2
    server:
    max-udp-payload: 1232
    
  • Knot Resolver
    1
    net.bufsize(1232)
    
  • PowerDNS Authoritative
    1
    udp-truncation-threshold=1232
    
  • PowerDNS Recursor
    1
    2
    edns-outgoing-bufsize=1232
    udp-truncation-threshold=1232
    
  • Unbound
    1
    2
    server:
    edns-buffer-size: 1232
    
  • NSD
    1
    2
    3
    server:
    ipv4-edns-size: 1232
    ipv6-edns-size: 1232