DNSSEC

这个DNS系列现在有以下几篇文章
DNS EDNS DNSSEC DNS over HTTPS 完整代码请看DNS


注意: 这里我只完成了请求字段,主要原因是因为我学习这些DNS协议是为了找到防止DNS污染的方法,而DNSSEC并不能,而且应答头比较复杂,可能还要了解ssl和tls的知识,所以这里我没有完成代码,想了解的请看protocol change rfc4034 rfc4035 Algorithm

DNSSEC也是使用了EDNS,而且只需要改一个字段,就是之前提到Z,具体协议请看

1
2
3
4
5
6
          +0 (MSB)                +1 (LSB)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
0: | EXTENDED-RCODE | VERSION |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
2: |DO| Z |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

完成请求头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type eDNSHeader struct {
trueDnsHeader []byte
trueName [1]byte
trueType [2]byte
truePayloadSize [2]byte
trueExtendRCode [1]byte
trueEDNSVersion [1]byte
trueZ [2]byte
trueData []byte
}

func createDNSSEC(domain string, reqType2 reqType) (header eDNSHeader, b []byte) {
true//eDNSHeader := createEDNSReq(domain,reqType2,[]byte{})
trueheader = eDNSHeader{}
trueheader.DnsHeader = creatRequest(domain, reqType2)
trueheader.Name[0] = 0b0
trueheader.Type = [2]byte{0b00000000, 0b00101001}
trueheader.PayloadSize = [2]byte{0b00010000, 0b00000000} //4096
trueheader.ExtendRCode = [1]byte{0b00000000}
trueheader.EDNSVersion = [1]byte{0b00000000}
trueheader.Z = [2]byte{0b10000000, 0b00000000} // Do bit = 1
truereturn header, createEDNSRequ(header)
}

是不是很简单,再结合之前的EDNS就能完成完整的请求