我想出于调试原因检索 DNS 响应的原始字节,例如:
dig -t https clickhouse.com
;; ANSWER SECTION:
clickhouse.com. 242 IN HTTPS 1 . alpn="h3,h3-29,h2" ipv4hint=172.66.40.249,172.66.43.7 ipv6hint=2606:4700:3108::ac42:28f9,2606:4700:3108::ac42:2b07
我怎样才能获得这些答案部分的字节,是否有一些现有的工具可以在解码为纯文本之前向我显示这些原始字节?
我尝试使用wireshark,但它是加密的,尝试使用另一个dns服务器,但我没有得到任何响应(似乎被ISP阻止)。
更新:
所以我采用手动方式,在 Go 中创建一个简单的程序:
m := &dns.Msg{
MsgHdr: dns.MsgHdr{
Authoritative: false,
AuthenticatedData: false,
CheckingDisabled: true,
RecursionDesired: true,
Opcode: dns.OpcodeQuery,
},
Question: make([]dns.Question, 1),
}
q := &m.Question[0]
q.Qclass = dns.ClassINET
q.Qtype = dns.TypeHTTPS
q.Name = "clickhouse.com."
// 0 = {uint8} 0
r, err := dns.Exchange(m, "9.9.9.9:9953")
设置断点dns.Answer, off, err = unpackRRslice(int(dh.Ancount), msg, off)
,github.com/miekg/dns/msg.go:840
然后将其复制粘贴msg
到文本文件。
答案1
根据版本dig
(9.11.0或更高版本),您可以传递+unknownformat
标志:
+[no]unknownformat This option prints all RDATA in unknown RR type presentation format (RFC 3597). The default is to print RDATA for known types in the type's presentation format.
例如,查询example.com. IN SOA
给出
$ dig +unknownformat example.com. soa
...
;; ANSWER SECTION:
example.net. 3532 CLASS1 TYPE6 \# 53 026E73056963616E6E036F726700036E6F6303646E73056963616E6E 036F7267007886A9DA00001C2000000E100012750000000E10
...
这种格式(RFC 3597\# <rdata-length> <rdata>...
)以十六进制编码的格式呈现原始记录数据线格式rdata
,并且可以分成多个字,因此上面是
00000000: 026e 7305 6963 616e 6e03 6f72 6700 036e .ns.icann.org..n
00000010: 6f63 0364 6e73 0569 6361 6e6e 036f 7267 oc.dns.icann.org
00000020: 0078 86a9 da00 001c 2000 000e 1000 1275 .x...... ......u
00000030: 0000 000e 10 .....