10月31日にWSL Ver.2.0.7がリリースされた。今回はネットワーキングモード(networkingMode)とDNSトンネリング(dnsTunneling)を試してみた。
なお、ネットワーキングモード、DNSトンネリングモードは、マイクロソフトのWindows Command Lineブログの記事(https://devblogs.microsoft.com/commandline/windows-subsystem-for-linux-september-2023-update/)によれば、Windows Insider ProgramのCannary、Release Preview チャンネルでのみ動作するとの表記がある。この記事が公開されたときには、Windows 11 Ver.23H2は正式配布はされてなかった。
試したところ、この2つの機能は、Windows Ver.23H2でも動作した。Betaチャンネルのプレビュー版では、ミラードモードでIPアドレスがWin32側と同じになったが、ネットワークアクセスができなかった。また、Devチャンネルでは、ミラードモードにしてもIPアドレスは変化しなかった。
実際に試す場合には、Windows 11 Ver.23H2か、Release PreviewチャンネルまたはCanaryチャンネルのプレビュー版Windows 11を使う必要がある。また、WSL Ver.2.0.7では、Linux側でのQEMUの実行が失敗するなど、Linux側プログラムに影響があった。プレビュー版であるため、日常的にWSLを利用している場合にはインストールは避けるべきだろう。
なお、最新のプレビュー版であるWSL Ver.2.0.7にアップデートすると、Linux側でパッケージマネージャーを使って、システムやライブラリなどを更新する必要がある。UbuntuなどDebian系のならば、
sudo apt update
sudo apt upgrade
として、ディストリビューションを最新にする。また、WSLのバージョンは、Win32側で「wsl.exe -v」を実行すると表示させることができる。
DNSトンネリングを設定する
WSLで、インターネットにアクセスするとエラーが表示されることがある。たとえば、apt updateコマンドなどだ。このとき、DNSの問い合わせがエラーになっていることがある。また、応答が返るまでの時間が長すぎ、Linux側でタイムアウトする場合もある。
WSL2では、/etc/wsl.confの「[network]」セクションにある「generateResolvConf」設定がtrueの場合、起動時にWin32側アドレスなどを使ってDNS設定である/etc/resolv.confを自動生成する。これが標準で/etc/resolv.confの「nameserver」設定は仮想スイッチでのWin32側(ホスト側)のIPアドレスになる。
このため、WSLディストリビューションからのDNS問い合わせは、すべてWin32側に送られ、Win32側で改めてDNS問い合わせるようになっている。このとき、DNSの問い合わせパケットは、仮想スイッチを経由してWin32側へ送られる。
この過程で、DNS問い合わせがエラーになることがあるようだ。こうした問題を解決する設定の1つが、DNSトンネリングだ。DNSトンネリングを有効にすると、DNS問い合わせは、直接Win32側に送られ、仮想スイッチを経由しなくなる。このため、WSL側やWin32側のネットワーク設定に影響を受けることなくDNS問い合わせができる。
なお、WSL Ver.2.x以前の場合には、手動で/etc/resolv.confを設定することで状況が回復することがある。/etc/wsl.confの「generateResolvConf=false」とすると、/etc/resolv.confの自動生成が停止する。その上で、/etc/resolv.confでnameserverにプロフバイダなどが提供するDNSアドレスを設定すると、「apt update」コマンドなどのインターネットアクセスのエラーが解消できることがある。
WSL Ver.2.0.7で、DNSトンネリングを行うと、筆者の環境では/etc/resolv.confで定義されているnameserverが「127.0.0.42」に設定された。IPv4では、ローカルループバックアドレスは、127.0.0.0/8(127.0.0.0から127.255.255.255の範囲)であるとされ、このアドレスもローカルループバックアドレスになる。
おそらくは、この特殊なアドレスに対して、DNS問い合わせをすると、カーネル側あるいは仮想マシン支援環境側で、これを捕まえて、トンネリングするのではないかと考えられる。なお、マイクロソフトのWSL関連のドキュメント(https://learn.microsoft.com/ja-jp/windows/wsl/networking#accessing-windows-networking-apps-from-linux-host-ip)では、/etc/resolv.confを見て、Win32側のIPアドレス(仮想スイッチ側)を調べろとある。DNSトンネリングではこの方法が不可能になるので注意されたい。
この連載の記事
-
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる -
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う -
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ - この連載の一覧へ