dnsproxyでDoH3(DNS-over-HTTP/3)をやってみる

投稿者: | 2021年7月29日

はじめに

ブラウザにおいてクライアントレベルでDoHが使用可能であり、FireFoxにおいてはデフォルトでDoHを使用(いまのところ米国ユーザのみ)する設定だったりします。DNSリクエストに対する抗トラッキングというかプライバシー保護の意識が高まっているのではないでしょうか。

そのような中、QUICが2021年5月にRFC-9000として標準化されました。
これでQUICをトランスポート層プロトコルに用いるHTTP/3も近いうちに標準化されるのではないかと思われます。

そこで現在のDoHのトランスポートをQUICに置き換えたDoH3(DNS-over-HTTP/3)をやっていきます。
調べたところAdguardTeamのdnsproxyではDoH、DoQに対応しておりDoH3への改修もしやすい実装になっていましたのでDoH3化していきます。

 

dnsproxyのDoH3、IPv6パッチ

dnsproxyですが現時点最新のv0.39.0ではDoH3(DNS-over-HTTP/3)は対応していないので、DoH部分のHTTP/3対応化を行い、またIPv6推進のためにDNSサーバへはIPv6のみで接続します。

・DNSリゾルバーへの接続はDoH3(DNS-over-HTTP/3)のみで行うようになります
・DNSレスポンスの順はIPv6が(あれば)先になります

パッチのライセンス

dnsproxy-0.39.0-v6doh3.patch

 

dnsproxyのビルド

任意のディレクトリで下記を実行しビルドします。

 

dnsproxy動作確認

(1) dnsproxyを立ち上げ

 DoH3での接続先として確認できたDNSリゾルバーを載せます。接続先に応じたオプションでdnsproxyを立ち上げます。

  • cloudflare
  • google

*ここではIPv6のループバックアドレスでlistenしていますが、IPv4アドレスも指定可能です
*接続先へはIPv6でのみ接続します

(2) ドメインを引いて確認

ここではdigコマンドでIPが引けるかで確認しましたが、tcpdumpやwiresharkなどでQUICでの接続も確認しておくと良いかもしれません。

 

あとがき

HTTP/3のメリットというよりQUICの恩恵ですがQUICでの接続は接続元のIP変動(含むポート変動)に影響されないので、IPv6でのテンポラリアドレス(時間などで変動)や動的IP(固定IP契約でないPPPoE、DS-LITE、MAP-Eなど)の環境下でIPが変わったタイミングでの切断を気にしないで済みそうです。

またキャッシュされていない任意のドメインについてDoH3、DoHでそれぞれQuery timeをdigで確認してました。数回確認しましたがQuery timeはDoH3(約380msec)、DoH(約520msec)となり、DoH3の方が140msec±5msecほど高速になりました。DoHをDoH3に置き換えることで25%以上の高速化が望めるようです。