プライベート DNS と VPN:各層が実際に何を覆うのか
プライベート DNS の画面からトンネルまで、ひとつの要求を追う:各層が見えるもの、二つが分かれる場所、そして内部名で壊れる理由。
スマートフォンでは、プライベート DNS がプロバイダーのホスト名に設定され、同時に VPN アプリが動いている。どちらかが名前の解決を担っていると考えるのは自然だ。この文が示す意味では、どちらも担っていない。その理由を最短で見るには、リンクをタップした瞬間から要求を一つ追えばよい。
この二つの機能は、同じ旅路の別の地点にある。プライベート DNS は、リゾルバーに投げる問いを暗号化する。VPN は、答えの接続がたどる経路を変える。
だから、両方が有効な端末で順番にたどり、各層がまだ何を見えるのかを書き留めよう。
第一段階:問い合わせがアプリを離れる
リンクをタップする。何かが接続する前に、アプリはそのホスト名のアドレスを必要とする。Android では、該当する画面は「設定、ネットワークとインターネット、プライベート DNS」だ。プロバイダーのホスト名を選ぶと端末は厳格モードになり、そのホスト名へポート 853 で TLS 上の DNS を行う。暗号化されたやり取りが失敗すれば、ポート 53 の平文へ黙って戻るのではなく、問い合わせは失敗する。
これは「自動」との意味のある違いだ。自動は機会的な暗号化を使い、ネットワークが妨害すれば暗号化されていないリゾルバーを平気で使う。問い合わせを決して平文にしないことが目的なら、プロバイダーのホスト名を使う厳格モードがそれに合う設定だ。
この道のりが最初に明かすのはこうだ。問い合わせはローカルネットワークから守られるが、リゾルバーはやはり名前を知る。暗号化が覆うのはその一跳びだけだ。そのリゾルバーの運営者が問い合わせを見るのは、答えることが仕事だからだ。
第二段階:接続は別の経路を取る
リゾルバーがアドレスを返し、アプリはそこへ接続する。この段階は、問い合わせがどう暗号化されたかに左右されない。トンネルがなければ、接続は通常の公開アドレスから出ていく。DNS が暗号化されていてもいなくても、宛先 IP と TLS の握手によって、名前はたいていネットワークに見えたままだ。
VPN をオンにすると、変わるのはこの段階だ。クライアントの経路ポリシーに合う通信はトンネルを通り、ローカルネットワークには VPN の端点への接続が見え、サイトには通常は出口のアドレスが見える。名前の解決も、クライアントが何を配るかによってはトンネルの中を通る。
その切り分けが、比較のすべてを一文にしたものだ。DNS の暗号化は「誰が問いを読めるか」に答える。VPN は「会話がどこへ向かうか」に答える。
第三段階:トンネルの中では DNS がポリシーの問題になる
ここで二つの機能が干渉し合う。意外なのはたいていブラウザーだ。独自の安全な DNS 設定を持つブラウザーは、OS に尋ねる代わりに、選んだリゾルバーへ HTTPS で問い合わせを送ることがある。Android のプライベート DNS 設定は、その判断には届かない。
Firefox ではスイッチは「設定、プライバシーとセキュリティ、安全な DNS を有効にする」にある。Chrome では「設定、プライバシーとセキュリティ、安全な DNS を使用する」にある。どちらも特定のプロバイダーに固定することも、オフのままにすることもできる。オンにすると、その問い合わせではトンネルの DNS 設定が迂回される。ページの通信は依然としてトンネルを使うのに、だ。
VPN が自分のリゾルバーを配り、ブラウザーが自分のものにこだわると、分裂が起きる。名前は解決し、ページは読み込まれ、トンネルを通るはずだった問い合わせは直接外へ出ていく。リゾルバーのアドレスが VPN の端点と違うこと自体は漏えいの証拠ではない。しかし、あなたが宣言した意図と矛盾する問い合わせ経路は直す価値がある。
第四段階:内部名で壊れる
仕事用の VPN に接続し、イントラネットのホストを開く。ブラウザーの安全な DNS がオンで、公開リゾルバーを指していると、その名前はブラウザーには存在しない。トンネルは上がり、ほかのすべては動いている。それなのに一つのホスト名だけが失敗し、サイトが落ちているように見える。
同じ故障は Android では逆方向に現れる。公開プロバイダーを使った厳格なプライベート DNS は、内部リゾルバーだけが知る名前を解決しない。厳格モードに代替経路はない。スマートフォンの DNS を、公開の暗号化リゾルバーと企業リゾルバーに分けるのは設定の問題ではなく、VPN を運用する者が答えるべき経路ポリシーの問題だ。
トンネルを責める前にこれを確認しよう。内部名を問い合わせ、次にブラウザーの安全な DNS を切った状態で同じ名前を問い合わせる。解決すれば、問題はリゾルバーの選択であり、接続ではなかった。
この道のりが変えろと言うこと
ほぼすべては四つの画面に載っている。この順に見て、それぞれが何を言うかを書き留めよう。答えはたいてい組み合わせの中に見える。
- Android の設定、ネットワークとインターネット、プライベート DNS:自動、またはプロバイダーのホスト名、そしてどのホスト名か。
- ブラウザーの安全な DNS 設定:オフ、または特定のリゾルバーに固定。
- VPN クライアントの DNS ポリシー:リゾルバーを配るか、分割トンネルが名前を必要とする何かを除外していないか。
- トンネルを上げた状態での内部ホスト名のテスト。二回行い、一度はブラウザーの DNS をオン、一度はオフにする。
そのうえで、修正を要件に合わせる。逆ではない。問い合わせを暗号化して出し、自分が選んだリゾルバーに届けることが要件なら、厳格なプライベート DNS を設定し、ブラウザーをそれに同意させる。通信を別の場所から出すことが要件なら、トンネルを設定し、DNS の設定がアドレスを動かすと期待するのをやめる。
境界も忘れないこと。どちらの機能も、敵対的な宛先を安全にはしない。どちらも、サインインした identity を消しはしない。暗号化が変えるのは誰が問いを読めるかであり、トンネルが変えるのは接続がどこへ行くかだ。どちらもアカウントを匿名にはしない。