DNS Queries over HTTPS の標準化 (RFC8484)

20181020更新
RFC8484として標準化されました


DNS Queries over HTTPS」の仕様の標準化が始まっている。

今までもこのテーマはIETFにおいて何度か議論になってきましたが、今回 DNS Over HTTPS (doh) WGの設立に合わせて(まだProposed)、この「DNS Queries over HTTPS」の標準化がマイルストーンとなっている。

今回の「DNS Queries over HTTPS」は、Googleの提供しているDNS over HTTPSとは全然違う仕様である点は注意が必要です。GoogleのものはクエリとレスポンスをJson形式で構造化するが、今回は比較的素のDNSクエリをHTTPSで送り合う仕様である(今後JSON形式をサポートする可能性はあります)。


このプロトコルではHTTP/2を使う必要があります(MUST)。HTTP/2を使うことで、既存のWebサーバとのコネクション上でDNSレコードをサーバプッシュで送る事も出来ます。

DNS Queries over HTTPS

背景

たとえば、接続しているネットワークが外のDNSとの通信を許可するとは限りません。

公衆Wi-Fiなどのネットワーク提供者がネットワーク内のDNSとの接続のみを許可していたり、もしくはなりすましされて、DNS通信が偽装される可能性もあります。そのようなネットワークでも安全にDNSとやり取りするために、HTTPS上でDNSクエリを送る方法が今回の「「DNS Queries over HTTPS」」という仕様になります。

HTTPリクエス

GET及びPOSTをサポートします。GETの場合はGETパラメータに、POSTの場合はHTTPボディにDNSクエリが格納されます。
www.example.comのAレコードを問い合わせる場合は

GETの場合

   :method = GET
   :scheme = https
   :authority = dnsserver.example.net
   :path = /.well-known/dns-query?  (no CR)
           content-type=application/dns-udpwireformat&  (no CR)
           body=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
   accept = application/dns-udpwireformat, application/simpledns+json

POSTの場合

   :method = POST
   :scheme = https
   :authority = dnsserver.example.net
   :path = /.well-known/dns-query
   accept = application/dns-udpwireformat, application/simpledns+json
   content-type = application/dns-udpwireformat
   content-length = 33

   <33 bytes represented by the following hex encoding>
   abcd 0100 0001 0000 0000 0000 0377 7777
   0765 7861 6d70 6c65 0363 6f6d 0000 0100
   01
  • .well-known/dns-queryにリクエストします(別のPathでも可)
  • acceptヘッダにapplication/dns-udpwireformatを設定すべきです
  • GETの場合は、bodyはBase64urlエンコードされます
  • キャッシュ出来るように、DNSクエリのDNS IDは0がセットされる

HTTPレスポンス

HTTPレスポンスボディにDNSレスポンスが格納されます。max-ageにDNSTTLと同じ値を格納すべきです。また、304ステータスコードやLast-Modifiedヘッダ、Etagヘッダは仕様すべきではありません。

www.example.comの問い合わせに、93.184.216.34 (TTL=128)を帰す場合は

   :status = 200
   content-type = application/dns-udpwireformat
   content-length = 64
   cache-control = max-age=128

   <64 bytes represented by the following hex encoding>
   abcd 8180 0001 0001 0000 0000 0377 7777
   0765 7861 6d70 6c65 0363 6f6d 0000 0100

   0103 7777 7707 6578 616d 706c 6503 636f
   6d00 0001 0001 0000 0080 0004 5db8 d822