hosts ファイル対ルーターのフィルター: VPN 経由でサイトをブロックする
hosts のエントリはローカルで答え、どんなトンネルも生き延びます。ルーターのフィルターはルーターを通るものしか見えないので、ノート PC で終わる VPN は名前を隠します。
hosts ファイルのエントリとルーターのフィルターは、まったく別の理由で同じサイトをブロックし、だから一方は VPN の下でも動き続け、もう一方は静かに止まるのです。hosts ファイルは、パケットがマシンを離れる前に名前へ答えます。ルーターのフィルターは、自分を通るトラフィックを検査します。その二点の間にトンネルを置くと、後者は視界を失い、前者は何も気づきません。
名前をどこで解決するかがすべてを決める
すべてのブロックは「名前をアドレスに変えるのは誰か」という一つの問いから始まります。通常のデスクトップでは、設定された順序をたどり、ふつうは DNS に問い合わせる前に hosts ファイルを読む、システムのリゾルバーが答えます。フィルターされたネットワークではルーターが答えることがあり、ルーターはクライアントが保護なしで自分を通して問い合わせを送ったときにだけ、その問いを見ます。経路を変えれば、誰に答える権利があるかも変わります。
VPN はここで、既定のルートを動かすことと、独自の DNS サーバーを押し付ける可能性という二つのことを同時に行います。どちらか一方の変化だけで、名前解決をブロックを強制していた機器から遠ざけるのに十分です。
これが、VPN をつなぐまではフィルターが効くという、よく聞く不満のからくりです。
hosts のエントリはトンネルができる前に答える
127.0.0.1 www.example.com のような行はローカルのリゾルバーが読むので、ネットワークを介さずにマシン上で答えが作られます。トンネルをつなぎ、DNS サーバーを変え、ネットワークを切り替えても、エントリは依然として loopback を返します。だから hosts によるブロックだけが、VPN がどこで終わるかに左右されないのです。
その盲点も同じくらいローカルです。独自のリゾルバーを同梱するアプリ、DNS over HTTPS で話すアプリ、リテラルなアドレスに接続するアプリはシステムに問い合わせないので、エントリは参照されません。実行中のプロセス内にキャッシュされたアドレスも、そのプロセスが再起動するまで同じ効果を持ちます。
ブラウザーのタブを信じるのではなく、Linux では getent ahosts、Windows では Resolve-DnsName で答えを確認してください。
ルーターのフィルターは、自分を通るものしか見えない
家庭用ルーターのコンテンツフィルターや URL フィルターは、読める形で自分を通る名前とリクエストに照合します。クライアントがどこか別の場所のサーバーへ暗号化トンネルを張ると、ルーターにはそのサーバーへの一つの流れだけが見え、中身は見えません。フィルターには照合する名前がないのでそのトラフィックを通し、これは回避されたというよりフィルターが失敗したように見えます。
うまくいく構成はもう一方で、ルーター自身がトンネルを持ち、端点で復号し、そこでフィルターを適用します。その設計では、フィルターは平文が現れる場所に座ります。
トンネルがノート PC で終わるなら、ルールがどう書かれていても、ルーターは定義上、保護された経路の外にあります。
四つの強制ポイントと、それぞれが何を取りこぼすか
ブロックを強制できる場所は四つあり、それぞれ違う形で失敗します。この一覧は順位ではなく、カバレッジの地図として読んでください。
- hosts ファイルまたはローカルのリゾルバー: オフラインでも、どんなトンネルの下でも動きますが、同梱されたリゾルバーやハードコードされたアドレスには回避されます。
- VPN ゲートウェイでの DNS フィルタリング: 押し付けられたリゾルバーを使うクライアントは覆いますが、DNS を上書きするクライアントは取りこぼします。
- アドレスや SNI によるゲートウェイの出口ルール: クライアントの DNS から独立していますが、読めない名前と、まだ学習していないアドレスには盲目です。
- 管理されたブラウザーや端末のポリシー: 管理されたハードウェアでは強く、個人の端末では存在しません。
これらはいずれも、管理されていない端末上の意志ある利用者に対するセキュリティ境界ではありません。ポリシーによる制御であり、正直な説明は、それぞれが実際にどのトラフィックを覆うのかを述べます。
意図に合う層を選ぶべきで、家庭の便宜は端末に属し、組織のルールはゲートウェイに属します。
終わったと言う前に両方の状態を試す
VPN をつないだ状態と切った状態で、リゾルバーの答えを見る getent ahosts、問い合わせが何を返すかを見る nslookup、接続がまだ完了するかを見るサイトへの curl -I という同じ三つのコマンドを実行します。一つ目が loopback を返し、三つ目が実際のアドレスにつながるなら、何かがリゾルバーを迂回しており、hosts のエントリはあなたが思うような制御ではありません。
ルーターでは、リクエストの前後でフィルターのカウンターを読んでください。まったく動かないカウンターは、トラフィックがフィルターに届かなかったという意味で、それはルールの答えではなく経路の答えです。
次の VPN の変更がまた経路を動かすので、結果は構成と一緒に書き留めてください。