Dev Study
← DNSを運用する側から見る
レッスン 8 / 8·約 9 分·第9期 DNSを運用する側から見る

DoHとDoT — 誰から隠すのか

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP今ここ
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理
  7. DB保存

5本目『なぜ偽の応答が通るのか』と6本目『DNSSECは何を保証しないか』で「暗号化すれば全部守れる」という誤解に2回触れました。その解消を扱う、このコースの最終回です。

まず結論

暗号化は区間に効きます。DoT と DoH が包むのは、スタブリゾルバとフルサービスリゾルバの間だけです。その先、リゾルバから権威への問い合わせは従来どおりです。

「誰から隠れたか」は、リゾルバより手前に居た者に限られます。リゾルバ自身には、どの名前を引いたかが見えています。社内の監視装置が見えなくなるのも同じ理由です。

? 読む前に予測

端末で DoH を有効にしました。経路上の第三者から隠れたのは何で、隠れていないのは何でしょう。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

暗号化は経路ではなく区間に効く

5本目と6本目で「では暗号化すればよいのでは」という疑問が2度残ったはずです。出発点は1つ。暗号化は、経路全体ではなく区間に効きます。

名前解決の道のりには少なくとも2つの区間があります。スタブリゾルバからフルサービスリゾルバまでと、そのリゾルバから権威まで。DoT と DoH が規定するのは前者の運び方だけです。

第33週『TLS終端 — どこで暗号を解くのか』の形が当てはまります。暗号化された通信はどこかで必ず復号され、そこが保証の切れ目でした。DNS で復号するのはフルサービスリゾルバです。つまりリゾルバは、どの名前が引かれたかを平文で受け取ります。

だから問いはこうなります。誰から隠れたのか。 リゾルバより手前に居た者だけです。

具体実物

DoH の応答を開けてみる

実機で DoH のエンドポイントに問い合わせた出力です(macOS、curl、2026年9月17日取得)。?dns= には example.com の A を尋ねる DNS メッセージの base64url を載せました。

$ curl -sS -D - -o resp.bin -H 'accept: application/dns-message' "https://cloudflare-dns.com/dns-query?dns=..."コマンド出力
HTTP/2 200
server: cloudflare
date: Thu, 17 Sep 2026 13:41:48 GMT
content-type: application/dns-message
access-control-allow-origin: *
x-content-type-options: nosniff
content-length: 61
(以下 cf-ray / alt-svc 略)

普通の HTTPS の応答です。状態 200、メディアタイプ application/dns-message、本体61バイト。

$ xxd resp.bin — DoH の応答本体(61バイト)コマンド出力
00000000: 0000 8180 0001 0002 0000 0000 0765 7861 .............exa
00000010: 6d70 6c65 0363 6f6d 0000 0100 01c0 0c00 mple.com........
00000020: 0100 0100 0000 0100 0468 1417 9ac0 0c00 .........h......
00000030: 0100 0100 0000 0100 04ac 4293 f3 ..........B..

右側に exa mple.com と読めます。手前の 07 は長さ7、03 は長さ3で、DNS メッセージが名前を運ぶ形そのもの。先頭の 0002 は回答2本、末尾近くの 68 14 17 9a は 104.20.23.154、ac 42 93 f3 は 172.66.147.243(値は時点と環境で変わります)。

HTTPS で包んでいるだけで、中身は従来の DNS メッセージです。 RFC 8484 §6 が本体を RFC 1035 §4.2.1 のワイヤ形式と定めるとおりです。

✓ ここまでの確認

DoH の応答本体には何が入りますか。

抽象原理

3つの仕組みは、別々の問題を解いている

ここが山場です。DNS まわりで並べられる3つの仕組みは、別々の問題に対応していて、どれか1つが他を兼ねません。 RFC 8484 §9 は DoH についてこう述べます。

The HTTPS connection provides transport security for the interaction between the DoH server and client, but it does not provide the response integrity of DNS data provided by DNSSEC. DNSSEC and DoH are independent and fully compatible protocols, each solving different problems. The use of one does not diminish the need nor the usefulness of the other.

同趣旨の一文が RFC 7858 §8 にもあり、そちらは DoT の名前で書かれています。

As noted earlier, DNSSEC and DNS over TLS are independent and fully compatible protocols, each solving different problems. The use of one does not diminish the need nor the usefulness of the other.

2つの規格が、別々に同じ線を引いています。 一方を使っても、他方の必要性も有用性も減らない。

3つが対応している問題表
仕組み 何を与えるか 与えないもの
DNSSEC 出所の証明と完全性 機密性(中身は平文)
DoT / DoH 区間の秘匿 出所の証明
ソースポートの無作為化 当たる確率を下げる緩和 完全性も秘匿も

RFC 4033 §4 は DNSSEC の側から書いています。

Accordingly, DNSSEC is not designed to provide confidentiality, access control lists, or other means of differentiating between inquirers.

機密性は設計目標に入っていない、と規格が自分で述べています。逆に RFC 8484 §9 は「DNSSEC が与える応答の完全性は与えない」と書きます。互いに、自分がやらないことを明記しています。

具体実物

DoT と DoH の、規格としての違い

同じ「暗号化した名前解決」でも、2つの規格の性格は違います。

RFC 7858 と RFC 8484 が規定しているもの表
DoT (RFC 7858) DoH (RFC 8484)
待ち受け先 TCP 853番 が MUST(§3.1) URI Template を設定で配る(§3)
固定パス — 定義していない
本体の形式 RFC 1035 §4.2.1 RFC 1035 §4.2.1(§6)
+ 2バイトの長さが前置 長さの前置なし

DoT 側の 853番は MUST です。RFC 7858 §3.1 の逐語:

By default, a DNS server that supports DNS over TLS MUST listen for and accept TCP connections on port 853, unless it has mutual agreement with its clients to use a port other than 853 for DNS over TLS.

一方 DoH に、対応する固定の入口はありません。RFC 8484 §3 が規定するのは、クライアントに URI Template を設定することと、その設定・発見・更新はプロトコルの外で行うことです。

✓ ここまでの確認

「DoH には `/dns-query` という決まったパスがある」——この説明の評価はどれですか。

⇄ 2つを見比べる
具体例 A

TLS終端の位置(第33週)

第33週『TLS終端 — どこで暗号を解くのか』で見たとおり、終端した場所がエンドポイントで、保証はそこで切れます。LB で終端すれば、その先は平文で流れます。

保護される区間表
クライアント === TLS ===> LB ---平文---> アプリ
↑ここで保証が切れる
具体例 B

DoT / DoH の復号点

復号するのはフルサービスリゾルバです。そこから権威への問い合わせは DoT・DoH の規定の外です。区間の手前に居た者からは隠れますが、復号した当人には、どの名前が引かれたかが見えています。

保護される区間表
スタブ === DoT/DoH ===> リゾルバ ---従来どおり---> 権威
↑ここで復号される

どちらも「どこで暗号が解かれるか」が見える範囲を決めています。DNS の場合、解いた先には何が残るでしょうか。

「隠れた」と言うとき、誰の視点から隠れたのかを1つずつ数えてみてください。復号する当人は、その数に入るでしょうか。

抽象原理

図で見る、暗号化されている区間

DoT / DoH で暗号化されるのは、どこからどこまでか
端末のスタブリゾルバ問い合わせの始点
DoT(TCP 853番)/ DoH(HTTPS)で暗号化された区間
経路上に居る者中身は読めない
社内の監視装置もここ
フルサービスリゾルバここで復号される
どの名前を引いたかが平文で見える
この先は DoT / DoH の規定の外
権威サーバ(ルート → TLD → 権威)リゾルバからの問い合わせ
  • ・暗号化されるのは上半分だけ。下半分は DoT・DoH が規定していない
  • ・復号する当人(リゾルバ)は「隠れた相手」に含まれない
  • ・「経路上に居る者」に何が含まれるかは、組織の構成で決まる

中段の「経路上に居る者」に何が入るかは、規格が決めることではありません。 悪意のある第三者のことも、組織が意図して置いた監視装置のこともあります。仕組みから見れば、どちらも「区間の手前に居た者」です。

なお同じ発想を QUIC の上で行う DoQ が RFC 9250 として定義されています。運び方は変わりますが、どこで復号されるかという構造は同じです。

この章のまとめ

  • 暗号化は区間に効く。 DoT・DoH が包むのはスタブとリゾルバの間で、その先は規定の外。
  • 復号する当人は「隠れた相手」に入らない。 リゾルバには、どの名前を引いたかが平文で見えている。
  • DoT の 853番は MUST(RFC 7858 §3.1)。DoH に固定パスの規定は無い(§3 は URI Template を配る設計)。/dns-query は事業者の実例。
  • DoH の本体は application/dns-message(§6)で、中身は従来の DNS メッセージそのもの。
  • 3つは別々の問題を解いている。 DNSSEC = 出所の証明と完全性 / DoT・DoH = 区間の秘匿 / ソースポートの無作為化 = 当たる確率の低減。RFC 7858 §8 と RFC 8484 §9 が、それぞれ "independent and fully compatible" と書いている。
  • 企業網の可視性が落ちるのは副作用ではなく、監視装置が「区間の手前に居た者」だから。
  • 本教材の DoT の実機確認は TCP 接続まで(手元の DiG は +tls 非対応)。

語彙の網羅は既存のクイズ群「DNS(名前解決)」の DNS V(セキュリティ) に譲ります。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

DoT が待ち受けるポートを、RFC 7858 §3.1 はどう規定していますか。

用語集(4語)
DoT (DNS over TLS)
DNS の問い合わせを TLS で包んで運ぶ方式(RFC 7858)。§3.1 は既定で TCP 853番を MUST と規定し、同じ節が 853番での平文を MUST NOT で禁じる。
DoH (DNS over HTTPS)
DNS の問い合わせ・応答を HTTP のやり取りに対応づける方式(RFC 8484)。§3 は URI Template を配る設計で、固定パスを定義していない。
application/dns-message
DoH で運ぶ本体のメディアタイプ(RFC 8484 §6)。中身は RFC 1035 §4.2.1 のワイヤ形式の DNS メッセージ1通。DoT の §4.2.2 の形式(2バイトの長さが前置)とは別。
区間の秘匿
暗号化が効く範囲が経路全体ではなく2つの端点の間に限られること。DoT・DoH では、スタブリゾルバとフルサービスリゾルバの間。