デバッグのために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>...
)は、生のレコードデータライン形式を16進エンコーディング形式でレンダリング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 .....