DNS応答の生のバイトを取得する方法は?

DNS応答の生のバイトを取得する方法は?

デバッグのために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                             .....

関連情報