今使っているDNSサーバがDNS over HTTPS (RFC8484)に対応しているか確認する方法は標準化されていません。
例えばChromeでは、どのDNSサーバがDoHをサポートしているかソースコード(URL)にハードコードされています。
通常、DHCPや、IPv6 Router AdvertisementsでDNSサーバを指定する場合はIPアドレスで指定されます。それが、DoHやDoTに対応しているか識別出来るようにするというのが今回の話です(ちなみに、HTTPSで繋いでみるという方法はうまくいきません)
この問題を解決するために「Discovery of Designated Resolvers」という提案仕様が出ています。すでにADD WGにAdoptionされております。
今回はこの仕様を簡単に読んでいこうかと思います。
Discovery of Designated Resolvers
「Discovery of Designated Resolvers」は、Apple, Cloudflare, Fastly, Microsoftの方による共著になっています。
具体的な手順については、大きく分けて2つに別れており、対象のDNSサーバのホスト名がわかってる場合と、分かってない場合があります。分けて説明していきます。
ホスト名が分かっている場合
resolver.example.com がDoHに対応しているか確認する場合、_dns.resolver.example.com のSVCBレコードを確認します。
SVCBレコードとは現在標準化が進められているリソースレコードであり、そのドメインで提供しているサービス及び接続方法(alpnやESNI情報)が記述されています。
(仕様: https://tools.ietf.org/html/draft-ietf-dnsop-svcb-https-02)
_dns.resolver.example.com 7200 IN SVCB 1 . ( alpn=h2 dohpath=/dns-query{?dns} ) _dns.resolver.example.com 7200 IN SVCB 2 . ( alpn=dot )
この情報を見ると、DoHとDoTに対応している事がわかります。このとき、DoHは、path情報も記述されています。
DoHにリクエストを送るときに書きpathでリクエストする必要があることがわかります。(この情報がないと、単純にhttpsで接続してもdohのリクエストができません)
https://resolver.example.com/dns-query{?dns}
ホスト名が分かってない場合
先述の通り、DHCPなどではIPアドレスのみでDNSサーバが指定されます。その場合には「dns://resolver.arpa」に対してSVCBレコードを引きに行きます。
(なお、resolver.arpaはいわゆるSpecial Use Domain Nameとして予約されるドメイン名です)
もし再帰リゾルバがDoHサーバを知っていれば、SVCBレコードを返します。このときipv4hintをつけて返すことで、DoHサーバのAレコード解決を省略することができます。
## 表記上改行 _dns.example.net 7200 IN SVCB 1 . ( alpn=h2 dohpath=/dns-query{?dns} ipv4hint=x.y.z.w ) _dns.example.net 7200 IN SVCB 1 dot.example.net ( alpn=dot port=8530 ipv4hint=x.y.z.w )
また、このときのサーバ認証については仕様を参照ください。
おわりに
DoHサーバに繋ぐ設定をどうクライアントに入れ込むか、という議論は長らく続いてきました。そのなかで様々な立場から幾つか提案仕様が提出されました。
そんななか出てきたのが今回の仕様です。この仕様はすでにWG Adoptionされているので、この方向で進んでいくのかと思います。
すべてが解決されるわけではないと思いますが、引き続き追っていきたいなと思う。