RFCを読もう 〜 DNS編 〜
途中で力つきていた……。
何
昨日の記事はten986さんの「」でした。
誰
普段はKMCでは飲酒、SLACKで雑談、サーバ管理、管理の応援、ヴァーチャルYouTuberの視聴等をしています。 今回の範囲は以下のRFCぐらいです。逆に言うと多分以下のRFCより情報は増えていません。
その他
はい
みなさんは生活していると突然車輪の再発明をして車輪の仕組みを学びたくなることありませんか? 私はあります。 ありますよね? あるという体で進めさせてください。 HTTPのパーサ的なものとかなら多くの人がなんだかんだで書いてみたりしているのではないかと予想します。という訳で今回はそれのDNS編です。
DoH
そこでこの記事をもう一度読んでみると、冒頭に以下のような追記があります。
【2018/11/16 追記】
本記事は、2016 年 4 月に Google Public DNS サーバに実装された、実験的な DNS over HTTPS プロトコルについて紹介しています。DNS over HTTPS プロトコルはその後 IETF の doh ワーキンググループにて標準化が進められ、2年半後の 2018 年 10 月に RFC8484 として出版されました。本記事で紹介したプロトコルは RFC8484 に規定されたプロトコルとはいくつもの点で異なっていることにご注意ください。
いきなり躓いてしまいました。
Google Public DNS provides two distinct DoH APIs at these endpoints:
とあります。どうやらJSON APIをGoogleが作ってみた後に、それがブラッシュアップされてRFC8484となったようです。
というわけでRFC8484を読んでいきます。
RFC8484
Requestのほうはこうです。
:method = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message
curlにするならこうでしょうか。
ここではエンドポイントとして dns.google を使いリクエストを投げています。また、結果として謎のバイナリが帰ってくるので、とりあえずod -x しています。ついでにネットワークバイトオーダーでやっていくので、--endian=bigもつけておきます。
これは以下のような出力となります。
0000000 0000 8180 0001 0001 0000 0000 0377 7777
0000020 0765 7861 6d70 6c65 0363 6f6d 0000 0100
0000040 01c0 0c00 0100 0100 0023 5100 045d b8d8
0000060 2200
0000061
謎です。
When the HTTP method is GET, the single variable "dns" is defined as the content of the DNS request (as described in Section 6), encoded with base64url RFC4648. らしいので、どうやらdns=AAABA...はBase64 encodedされたDNS requestで、その中身は(section 4.1.1)
In this example, the 33 bytes are the DNS message in DNS wire format RFC1035, starting with the DNS header. らしいので、RFC1035に定義されたDNS messageらしいですね。
code:echo AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB | base64 -d | od -x --endian=big
0000000 0000 0100 0001 0000 0000 0000 0377 7777
0000020 0765 7861 6d70 6c65 0363 6f6d 0000 0100
0000040 0100
0000041
中身はこう。謎です。
というわけで、DoHならDNSのパケットの構造をとりあえずは知らなくても、JSON APIで取ってこれる というわけにはいかないようです。RFC1035に潜っていきましょう。
RFC1035
と、このような感じでDNSパケットが読めるようになり、リクエストが投げられるようになります。
本当はどのようにDNSが動作するかのRFC1034を先にやっておく必要があった気がしてきたけれども、長くなりすぎる気がするのでこのへんで……。
(気合があれば書くかも……)
いかがでしたか?
以上、DNSについて調べてみました! いかがでしたか?
明日の記事はwalkureさんの「」です。