このページの目次
DNSプライバシー: DoH, DoT, DoQ, ODoH
DNSは元々平文プロトコルであり、ISPや中継ネットワークはどのドメインが照会されたかを確認できる。DoT/DoH/DoQはDNSクエリを暗号化チャネルに格納し、ODoHはさらにプロキシとリゾルバーの分離により、「誰が照会しているか」と「何を照会しているか」のプライバシー分離を実現する。4つのプロトコルは、プライバシー強度、デプロイメントモード、ミドルウェア互換性の点でそれぞれトレードオフがある。
概要
DNSは当初、平文プロトコル(UDPポート53)であり、ISPや中継ネットワークは、Webサイトの内容自体がHTTPSで暗号化されていても、あなたがどのドメインを照会したかを見ることができる。DoT(DNS over TLS)とDoH(DNS over HTTPS)は、DNSクエリを暗号化チャネルに格納し、機密性を提供する。DoHは、標準的なHTTPSトラフィックと見分けがつかないため、特にプライバシーを重視するユーザーに人気がある。DoQ(DNS over QUIC)は、さらにハンドシェイクの遅延を削減する。ODoH(Oblivious DoH)は、プロキシとリゾルバーの分離により、「誰が照会しているか」と「何を照会しているか」のプライバシー分離を実現する。
DoT: DNS over TLS (ポート853)
DNSのワイヤーフォーマットは、TLS接続上で直接送信される。独立したポート(853)を使用するため、ネットワーク管理者は容易に識別してQoS分類を行うことができるが、同時にブロックされやすいという欠点もある。
クライアント → サーバー ポート853:
TLSハンドシェイク (ECH有効時 + 暗号化SNI付きで1-RTT)
→ 接続確立後: 2バイトの長さプレフィックス + DNSメッセージ (RFC 1035 ワイヤーフォーマット)
長さ: ビッグエンディアン、プレフィックス自身は含まない (最大65535)
DoH: DNS over HTTPS (ポート443)
DNSは標準的なHTTPSトラフィックに混在しており、Webサイトとのトラフィックと見分けがつかない。
クライアント → https://dns.example.com/dns-query:
POST: Content-Type: application/dns-message
Body: DNSワイヤーフォーマット (RFC 1035と同様)
GET: ?dns=<base64url(DNSワイヤーフォーマット)>
HTTP/2: ストリーム多重化 → 複数のクエリが1つのTCP接続を共有
HTTP/3: QUIC → キャッシュされたDNSリゾルバーで0-RTT
コンテンツネゴシエーション (オプション):
Accept: application/dns-message → IDNAワイヤーフォーマット (バイナリ、デフォルト)
Accept: application/dns-json → JSON (Google/Cloudflare固有)
DoQ: DNS over QUIC (ポート853)
DoQはTCP+TLSの代わりにQUICを使用し、DoTのハンドシェイク遅延とTCPのHOL(Head-of-line)ブロッキング問題を解決する。
QUIC接続 (UDP 853):
ストリーム0: クライアント開始、双方向 → DNSメッセージ
ストリーム4: クライアント開始、単方向 → サーバーがデータを送信するために使用
ストリーム8: クライアント開始、単方向 → クライアントがデータを送信するために使用
各ストリーム: STREAMフレームにDNSメッセージを含む (長さプレフィックス不要、QUICストリームが境界を自動処理)
ODoH (Oblivious DNS over HTTPS, RFC 9230)
問題点: DoHでも「誰が何を照会しているか」は依然として露出する。リゾルバーはクライアントIPとDNSクエリの両方を見ることになる。
ODoHはプロキシとリゾルバーを分離する。
クライアント → プロキシ (Oblivious Proxy):
暗号化されたPOST https://proxy/dns-query
Body: 暗号化されたDNSクエリ (リゾルバーのHPKE公開鍵で暗号化)
→ プロキシはクライアントIPを知るが、クエリ内容は見えない
プロキシ → ターゲット (Oblivious Target = DNSリゾルバー):
暗号化されたPOST https://resolver/dns-query
Body: 暗号化されたDNSクエリ (同じく、プロキシは復号できない)
→ ターゲット/リゾルバーはクエリ内容は見るが、クライアントIPはわからない (プロキシのIPしか見えない)
プロキシとターゲットは共謀してはならない (共謀すると、依然として追跡可能になる)
4つのプロトコル比較
| ポート | 転送プロトコル | ハンドシェイク | ブロック容易性 | プライバシー (クエリ) | プライバシー (クライアントIP) | |
|---|---|---|---|---|---|---|
| Do53 | 53 UDP | UDP | 0 | 極めて低い | なし | なし |
| DoT | 853 | TCP+TLS | 1-2 RTT | 高い (独立ポート) | 部分的 (TLS) | なし |
| DoH | 443 | HTTP/2 または /3 | 1-2 RTT (h2), 0-1 RTT (h3) | 極めて低い (HTTPSと混在) | 部分的 (HTTPS) | なし |
| DoQ | 853 | QUIC/UDP | 0-1 RTT | 中程度 | 部分的 (QUIC) | なし |
| ODoH | 443 | HTTP + HPKE | 2 RTT (プロキシ経由後、リゾルバーへ) | 低い | あり (二重) | あり (リゾルバーは不可視) |
参考
- RFC: 7858, 8484, 9250, 9230
- AdGuard: adguard-dns.io/encryption.html
キーワード: DoH, DoT, DoQ, ODoH, DNSプライバシー, 暗号化DNS, HPKE, オブリビオスプロキシ