这个DNS系列现在有以下几篇文章
DNS EDNS DNSSEC DNS over HTTPS 完整代码请看DNS
EDNS
上一篇我们写了DNS,EDNS就是DNS的功能扩充.
上一篇的DNS里头部有ARCOUNT的计数,EDNS就包含在那个里面,EDNS发送的请求在请求头之后的Additional中,应答在Answer和Authoritative之后,我们可看以下图,跟清晰了吧
1 | +---------------------+ |
协议格式
Additinoal包含以下部分
1 | Field Name Field Type Description |
因为EDNS中扩展的协议非常多,这里我们就以常用的SubNet为例吧,更多其他类型请看dns-parameters
因为我们以SubNet为例,所以先要了解下SubNet的具体协议格式
1 | +0 (MSB) +1 (LSB) |
这里前面三个字段就是我们之前RDATA中规定的协议格式,后面就是SubNet的格式
SubNet的OPTION-CODE为8,
OPTION-LENGTH就是完成之后的长度
FAMILY表示设置的IP的类型 IPv4为1,IPv6为2 更多类型请看address-family-numbers
SOURCE PREFIX-LENGTH为查询中位置偏移(就是CIDR中的mask),具体请了解CIDR,是计算机网络很基础的知识
SCOPE PREFIX-LENGTH是响应返回的位置偏移,在查询中应为0
ADDRESS就是设置的SubNet的IP地址,依据上面的FAMILY
请求
看过具体协议格式规定后,我们就可以来完成代码了
先定义以下各种请求的OPTION-CODE
1 | var ( |
然后完成SubNet的
1 | func createEdnsClientSubnet(ip net.IP) []byte { |
再完成Additional,加上完整的请求头,注意这里我们要修改一下请求头中ArCount的大小
1 | func createEDNSReq(domain string, reqType2 reqType, eDNS []byte) []byte { |
应答
我们先分析一下应答的解析顺序,就跟最开始的一样
- Header
- Answer
- Authority
- Additional
Header和Answer的解析我们上一篇已经完成了,这里需要完成Authority和Additional
因为我们不需要Authority内的具体内容,这里我们就直接获取到Authority之后的数据就行了
1 | func resolveAuthoritative(c []byte, nsCount int, b []byte) (left []byte) { |
Additional, SubNet
1 | func resolveAdditional(b []byte, arCount int) { |
最后需要在之前的DNS分析加上这两个函数,完整代码请看开头