一、什么是EDNS0? EDNS0:Extension Mechanisms for DNS Version 0,是DNS在rfc1035基础上对DNS协议的扩展。 二、EDNS0作用? 1. 扩展DNS使用UDP传输时的最大报文限制,可以超过512字节 2. 扩展RCODE,由4为增加到12位 3. 建议利用域名标签类型的剩余两个(10和01)[RFC1035 4.1.4] 三、协议变化 1. 增加OPT RR 2. 交互流程 (1) 客户端发起DNS请求,在Additional部分增加OPT RR (2) 服务器端解析并记录下客户端能够处理的最大UDP报文的大小 (3) 服务器端生成相应报文,若大于最大值,则置truncated位,否则可发送大于512且小于最大值报文 四、OPT-RR 结构 五、 OPT-RR 数据结构 typedef struct { uint16_t type; uint16_t clas; char name[DNS_MAX_DOMAIN_LEN]; DNS_TCN domain; uint16_t udp_payload_size; uint8_t hb_rcode; uint8_t edns0_ver; uint16_t z; uint16_t data_len; uint8_t data[0]; }OPT_NODE; 六、C/S端升级 1. 若客户端支持EDNS0,则可以发起EDNS0请求 如:dig www.baidu.com +bufsize=4096 2. 若服务器端支持EDNS0,则可以接受并处理EDNS0请求,否则返回 RCODE NOTIMPL,FORMERR或SERVFAIL 七、报文 DNS 平时用Sniffer观察到的DNS报文都在使用53/UDP,什么时候会用到53/TCP? 根据RFC1035,对于DNS服务器,递归解析时用53/UDP,区传输因需要可靠传输,必须使用53/TCP。DNS服务器的标准实现必须同时支持53/TCP和53/UDP。RFC 1035中还指出,53/UDP上的UDP数据区(不包括UDP首部)不得超过512字节,发送时如果超过512字节,将被截断成512字节,同时DNS协议Flags字段Truncated位置位。53/TCP上的数据区最前面是big-endian序的2字节长度域,不包括自身这2字节,指明了后续数据长度。 当DNS响应数据大于512字节的时候,数据只返回512字节,剩余的数据将被丢弃.这个时候名字解析器(DNS客户端或递归解析中的DNS服务器)通常使用TCP重发原来的查询请求,它将允许返回的响应超过512个字节.所以何时使用TCP是由名字解析器决定的,也就是说,名字解析器用TCP发送请求,名字服务器才会用TCP发送响应,正常情况下决不会出现请求抱文是UDP而响应报文是TCP的情况. 使用 DNS 的扩展名机制 (EDNS0) DNS 的扩展机制允许 DNS 请求者公布其 UDP 数据包的大小,并且更便于传输大于 512 字节(对于 UDP 数据包大小的原始 DNS 限制,RFC 1035)的数据包。DNS 服务器通过 UDP 传输层接收请求时,它对来自 OPT 资源记录 (RR) 的请求者的 UDP 数据包大小进行标识,测量其响应,以包含请求者指定的最大 UDP 数据包大小中允许的多个资源记录。 |