ディストリビューション内の閲覧は動き、トンネルが上がった瞬間に最初の社内ホスト名が失敗する。反射的に公開リゾルバーを足すと、インターネットは戻るが社内名はその日いっぱい引けなくなる。WSL 2 では /etc/resolv.conf は設定ではなく生成物であり、理解すべきなのはこの仕組みだ。直すべきは優れたリゾルバーではなく、ファイルの所有権である。

ファイルは設定ではなく生成される

WSL 2 は起動時にその時点で見える Windows アダプターからファイルを書き、先頭にそう述べるコメントを出力する。後から VPN クライアントがアダプターを追加したり書き換えたりしても、ディストリビューションが必ず再生成するとは限らず、ファイルはもう存在しないネットワークを説明し続ける。

二番目の失敗はより静かだ。WSL は一部のアダプターからしかサーバーをコピーしないことがある。物理アダプターにすでに IPv6 リゾルバーがあると、VPN アダプターが提供する IPv4 サーバーは追加されずに落とされ、ファイルは完全に見えながら、社内名に答えるサーバーだけを正確に欠く。

Windows 側の見え方と Linux 側の見え方を比べる

編集の前に両側を読む。ディストリビューション内でファイルの中身と、通常のファイルかリンクかを見る。Windows では VPN が作ったものも含め、各アダプターのリゾルバーを一覧にする:

ls -l /etc/resolv.conf
cat /etc/resolv.conf
Get-DnsClientServerAddress -AddressFamily IPv4
Get-NetAdapter | Where-Object Status -eq 'Up'

VPN アダプターが社内サーバーを示し Linux が別のものを示すなら、食い違いは到達性ではなく生成にある。アダプターの一覧とアドレスの両方を比べる。アダプターが欠けていればサーバーが欠ける理由になる。この区別が、WSL を直すのかファイアウォールを直すのかを決め、両者に共通点はない。

生成を止めて自分で書く

WSL にファイルを書き換えさせない文書化された設定が一つあり、それは /etc/wsl.conf にある。そのファイルにネットワークの節を足す:

[network]
generateResolvConf = false

次に Windows から wsl --shutdown でディストリビューションを終了し、起動し直す。パスが通常のファイルではなくシンボリックリンクなら、自分の内容を書く前にリンクを消す。リンク越しに書くと次の起動で生成先が作り直されることがある。その時点からファイルは自分のもので、何も書き換えない。

nameserver 172.28.4.10
nameserver 172.28.4.11
search site.corp.example
options timeout:1 attempts:2 rotate

検索ドメインがないと、修飾されていないホスト名は公開ルートで補完され、そのようなドメインはないという結果で返る。timeout は死んだ最初のサーバーがすべての問い合わせを止めるのを防ぎ、attempts は一度の問い合わせが使う試行回数を制限し、rotate は常に先頭から始める代わりに再試行を散らす。代償は、リゾルバーのアドレスがセッションごとに変わる VPN にファイルが追従しなくなることだ。

移動するリゾルバーを扱い、それから検証する

セッション固有のリゾルバーを配るクライアントもあり、静的ファイルは次の接続で壊れる。妥当な方法は二つある。アドレスが変わるたびに小さなスクリプトでファイルを書くか、生成を有効のままにして WSL がコピーするアダプターに社内サーバーが載っていることを確かめる。後者はフックが要らず、生成が VPN アダプターを飛ばすたびに失敗する。どちらも先に IPv6 の衝突を解く必要がある。

Windows は独自の名前ポリシーも適用する。接尾辞の検索一覧や特定ドメインの解決ポリシーなどで、アダプターのアドレスを写してもその規則は再現されない。同じサーバーで Windows では引けてディストリビューションで引けないなら、トンネルを責める前に接尾辞の扱いを比べる。

パケットではなく名前で試す。getent hosts sensor-access0.corp.example はリゾルバーのスタックを通るが、ping はキャッシュやリテラルのアドレスに対して成功しうる。次に切断と再接続の後に繰り返す。一度動いて再開時に再生成される設定は直っておらず、以前の中身を保存したうえでそのマシンでこのパスを所有する構成要素を記せば、次の変更は証拠から始められる。

関連記事