DNS Queries over HTTPSにおいて、HTTPのキャッシュとDNSのキャッシュの話が面白かったのでメモ
DoH
IETFで「DNS Queries over HTTPS (DoH)」と呼ばれる、HTTP上でDNS通信を行うプロトコルが議論されている。DoHと呼ばれており、実装もすでに広く行われている。
外とのDNS通信を遮断するようなネットワークでもHTTPSとして出ていくため経路上からは判別することができない。特にHTTP2などで通常のWebサーバとのコネクション上でDNSクエリが送られれば見分けはつかない。
また、CDNからの配信も既存のWebの仕組みに乗っかることができるほか、HTTP/2 ServerPushも行えるなど応用の幅は広い。
例
GETとPOSTに対応しているが、GETでwww.example.comの名前解決を行う例を示す。
このように、HTTPリクエストのパラメータにbase64urlエンコードしたDNSクエリが付加される。
:method = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message
レスポンスはボディにDNSレスポンス入って返ってくる。この例は結果として192.0.2.1 TTL=128のDNSレスポンスである。
:status = 200
content-type = application/dns-message
content-length = 64
cache-control = max-age=128
<64 bytes represented by the following hex encoding>
00 00 81 80 00 01 00 01 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01 03 77 77 77 07 65 78 61 6d 70 6c 65 03 63 6f
6d 00 00 01 00 01 00 00 00 80 00 04 C0 00 02 01
TTLとCache-Control
HTTPにはCache-Controlヘッダというキャッシュを制御するヘッダがある、一方でDNSの世界にはTTLと呼ばれるキャッシュしてよい期間を示すパラメータがある。
DoHを利用するとき、CDNやその他のキャッシュサーバはDoHを解釈せずにDoHのメッセージをキャッシュする可能性があります。そのため、DoHサーバ(レスポンスを生成するオリジン)は、生成するDoHレスポンスのTTLに合わせてCache-Controlヘッダ
を指定する必要があります。
具体的に、DNSレスポンスに含まれる複数レコードのTTLがそれぞれ30
, 600
, 300
だったら、Cache-Control: max-age=30
を指定することになります。Ageヘッダが付いている場合、DoHクライアントはTTLからAgeの値分を引いて処理する必要があります。
アンサーセクションがなくSOAレコードをもつ場合、MINIMUMの値よりも短い期間のみキャッシュするようにしなければなりません。
通常のHTTPと同様に、Cache-Controlヘッダ
でstale-if-error
, stale-while-revalidate
を指定することで名前解決に失敗したときのみキャッシュを使ったり、キャッシュをひとまず使ってから更新がないか問い合わせるという事もできます。