5月14日、Numa開発者が「Anonymous DNS without an account: shipping ODoH client + relay in one Rust binary」と題した記事を公開した。
近年、政府による大規模監視やISPによるDNS履歴販売が問題視される中、DNSクエリのプライバシー保護への関心が高まっている。この記事では、アカウント不要でDNSクエリを匿名化するODoH(Oblivious DNS over HTTPS)をRustで実装した技術について詳しく紹介されている。
プライバシーを保護するDNSの課題
現在の一般的なDNS環境では、プライバシー保護に根本的な問題がある。Pi-holeやAdGuard Homeなどの転送リゾルバを使用している場合、すべてのクエリが単一の事業者を経由し、ユーザーのIPアドレスと問い合わせ内容の両方が把握される。一方、Unboundのような再帰リゾルバに切り替えた場合は、権威DNSサーバーにIPアドレスが露出してしまう。
DoH(DNS over HTTPS)やDoTといった技術は通信の暗号化を行うが、「誰が何を知るか」という根本的な問題は解決しない。AppleのiCloud Private Relayは、入口プロキシ(IPアドレスのみ把握)と出口プロキシ(リクエスト内容のみ把握)に経路を分離することでこの問題を解決したが、iCloud+(月額0.99ドル)の加入とAppleエコシステムへの依存が必要だった。
ODoH:匿名DNSの標準プロトコル
ODoH(RFC 9230)は、この問題に対するIETFの標準解決策だ。Numa v0.14では、クライアント、リレー、パブリックデプロイメントを単一のRustバイナリで提供している。
動作メカニズム
ODoHの動作は以下の手順で進む:
- クライアント:ターゲットのHPKE公開鍵でクエリを暗号化し、レスポンス用の対称鍵を含める
- Numaリレー:ユーザーのIPアドレスを把握するが、暗号化されたクエリ内容は見られない
- Cloudflareターゲット:クエリを復号化するが、IPアドレスではなくリレーのアドレスのみ確認
- 権威サーバー:標準的なDNS再帰処理(Cloudflareが処理)
- 返答:Cloudflareがユーザー提供の対称鍵で回答を暗号化し、同じ経路で返送
暗号化にはHPKE(Hybrid Public Key Encryption, RFC 9180)を使用している。これはTLS 1.3のEncrypted ClientHelloと同じプリミティブだ。CloudflareのオープンソースライブラリOdoh-rsを採用し、暗号化の自作実装は避けた方針だ。
実装上の技術的課題
ODoHクライアントはNumaの既存転送パイプライン(UDP、DoH、DoTに続く第4の転送手段)として実装された。リレーモードでは特に2つの要素で注意深い実装が必要だった。
SSRF対策のホスト名検証
リレーはリクエストURLで指定されたターゲットへの外部接続を開く。検証なしでは、悪意のあるクライアントが169.254.169.254への「転送」を要求し、クラウドメタデータを窃取する典型的なSSRF攻撃が可能になる。検証では**RFC 1035のASCIIラベルに厳密な正規表現制限**を適用し、IDN、IPリテラル、443以外のポートを禁止している。
eTLD+1による同一事業者チェック
ODoHの保証は、リレーとターゲットが異なる組織によって運営されることに依存する。eTLD+1(有効トップレベルドメイン+1ラベル、例:example.comの場合はexample.com全体)を共有する場合、単一の事業者が両方の区間でIPと問い合わせを結合でき、プライバシー保護が形骸化する。Numaはデフォルトで同一事業者構成を拒否する。
制限事項と残る課題
記事では、ODoHが解決しない問題についても率直に説明している:
- ターゲットは問い合わせ内容を把握できる:ODoHは信頼を移転するが除去はしない。Cloudflareが全ODoHクエリをログ記録することは暗号学的に防げない
- 再帰モードでは依然としてリークが発生:ターゲットの再帰処理では、ルート/TLD/権威への通信が平文のUDP/TCPになる
- 小規模リレーはトラフィック分析が可能:少数のクエリしか処理しないリレーでは相関関係がリークする。単一ユーザーのセルフホストリレーは、忙しいパブリックリレーよりもプライバシー保護が劣る
パブリックエコシステムの現状
DNSCryptの管理リストによると、現在稼働中の既知のパブリックリレーはodoh-relay.edgecompute.app(Fastly Compute上でFrank Denisが運営)のみだった。Numaは2番目のパブリック事業者としてodoh-relay.numa.rsを追加し、既存のエコシステムを拡張している。
著者は「これは製品ではなく、Numaが必要としていたインフラストラクチャ」と位置づけており、プロトコルのプライバシー特性は事業者の多様性に比例するとして、他の開発者によるリレー運営を歓迎している。
使用方法
匿名DNSを今日から使用するには:
cargo install numa
numa.tomlでmode = "odoh"を設定すれば、クエリが2つの独立した組織を経由してルーティングされる。Dockerユーザー向けには、ODoHモードで事前設定されたターンキー構成も提供されている。
詳細はAnonymous DNS without an account: shipping ODoH client + relay in one Rust binaryを参照していただきたい。