VirtualBox NAT のゲスト DNS はホストが VPN に接続すると壊れる
ゲストには独自のリゾルバーがあり、NAT アダプターには二つの DNS モードがあります。検索を一度トレースし、ホストリゾルバーモードが VPN ポリシーに合うか判断します。
Windows ホストでは VPN が接続すると内部アプリケーション名が解決されるが、Ubuntu ゲストの内部では解決されない。ゲストは独自のリゾルバー設定を保持する、そしてその前の NAT アダプターは DNS クエリに二通りの方法で応答できる。ゲストを公開リゾルバーに向けるとウェブサイトは再び読み込まれるが、プライベート名は壊れたままになる。そのため何かを編集する前にリゾルバーの経路をトレースする。
NAT アダプターを通して一度の検索をトレースする
対照として内部の完全修飾名を一つと公開名を一つ選ぶ。トンネルを上げた状態で、ホスト上で内部名が解決し、その背後のアプリケーションが開くことを確認する。次に同じ二つの検索をゲスト内で実行し、ツールではなく応答を比較する。
先に進む前に、アダプターが本当に単純な NAT であることを確認する。ブリッジアダプター、名前付き NAT ネットワーク、ゲスト内の二台目の VPN クライアントには、それぞれ独自の構成と独自の説明がある。この時点で推測すると、調査の残りが無駄になる。
VBoxManage showvminfo work-ubuntu --machinereadable | grep -i natnet resolvectl status | head -40 cat /etc/resolv.conf
最初のコマンドはアダプターのモードと、それに接続された NAT ネットワークを表示する。Ubuntu ゲスト内では二番目がリンクごとの DNS 設定を一覧し、三番目は多くの場合ローカルのスタブアドレスだけを明らかにする、つまり実際の upstream は別の場所にある。
解決と到達性は分けて考える。正しいアドレスを受け取っても接続を開けないゲストには、ルーティング、フィルタリング、またはサービス権限の問題があり、これ以上の DNS 変更では決して触れられない。アドレスを別にテストし、二つのうちどちらが失敗したかを書き留める。
プロキシモードとホストリゾルバーモードは別の仕組み
プロキシモードでは NAT エンジンがゲストのクエリを既知の DNS サーバーに転送する。ホストリゾルバーモードではクエリを傍受し、ホストのオペレーティングシステムに、ホストが今使っている方法で名前を解決するよう求める。トンネルが上がったときにホストの解決を書き換える VPN クライアントに従うのは二番目だけである。そのため二つの設定は同じマシンで異なる応答を返す。
この違いが一文で表した問題の全体である。ゲストにサーバーアドレスの一覧を渡すことは、Windows に構成済みのリゾルバーで名前を解決するよう頼むこととは同じではなく、分割 DNS の VPN では二つの応答が異なる。アダプターのオプションは仕組みの話であり、許可の話ではない。
どちらのモードも何かへのアクセスを許すものではない。認可は VPN ポリシーとサービスにあり、検索が成功したのは名前がアドレスになったというだけである。
アダプターを切り替え、ゲストが何を受け取るか確認する
まず VM のネットワークと DNS 設定を記録し、それからマシンを停止して、編集するのが永続構成になるようにする。最初のアダプターが NAT を担う work-ubuntu という VM では、VM の停止中にホストからアダプターごとのオプションを設定する。その後で再起動し、終了ステータスを信じるのではなく結果を調べる。
VBoxManage modifyvm work-ubuntu --natdnshostresolver1 on VBoxManage showvminfo work-ubuntu --machinereadable | grep -i natdns
末尾の数字はアダプター番号を選ぶので、普遍的な値ではなく、アダプター 2 の設定ならその位置に 2 が入る。インストール済みの VirtualBox バージョンに属する VBoxManage バイナリを使い、パス上の古いものは、実行中のバージョンが無視する設定を書き込むことがある。
代わりにプロキシオプションを有効にすると別の仕組みが選ばれ、ホストリゾルバーの動作は得られない。ゲストの起動後、実際に保持している DNS 構成を確認する必要がある、ゲスト内の固定リゾルバーや暗号化 DNS 設定は、アダプターが何を提供してもアプリケーションを別の経路に保つからだ。
VPN のライフサイクル全体でテストし、一度だけで終わらせない
ゲストで両方の検索を繰り返し、それから実際のアプリケーションを開いて TLS ホスト名を検証させる。IP だけの接続テストは DNS をうまく切り分けるが、証明書の確認ではないし、そう報告すべきでもない。名前、アドレス、アプリケーションの結果を一緒に記録する。
承認された時間帯にホスト VPN を切断して再接続し、テストを繰り返す。結果はアクセスポリシーに一致すべきであり、公開解決が再び機能することは、プライベートクエリが意図した経路に残ったかどうかについて何も語らない。
ホストリゾルバーモードで何も変わらない場合は、記録した値を戻し、観察を保持する。ハイパーバイザーのトラフィックを除外する VPN クライアント、到達不能な内部リゾルバー、固定されたゲスト設定は、それぞれ別の修正を必要とし、アダプターをブリッジすると DNS をリセットするのではなくネットワーク設計を変える。