WSLでネットワーク不調時に試すこと

WSLで起動したディストリビューションからネットワーク接続ができなくなることが偶に発生します。

/ # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/x86_64/APKINDEX.tar.gz
WARNING: updating and opening https://dl-cdn.alpinelinux.org/alpine/v3.19/main: temporary error (try again later)
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/x86_64/APKINDEX.tar.gz
WARNING: updating and opening https://dl-cdn.alpinelinux.org/alpine/v3.19/community: temporary error (try again later)
4 unavailable, 0 stale; 15 distinct packages available

このような場合、ホストマシンのネットワークアダプターを一旦無効化し、再度有効化すると解決する場合があります。後述するresolv.confの書き換えの前にまず試してみると良いでしょう。

ホストマシンのネットワーク接続が問題なく行えていて、IPアドレス直打ちであればWSLから外のネットワークに接続できる場合、原因はおよそWSL内からDNSの名前解決ができないことによるようです。

解決策としてwsl.confにてresolv.confの自動生成を抑制するよう設定し、/etc/resolv.confnameserver指定をパブリックDNSサーバーに決め打ちで指定するという方法がよく見つかります。

しかし、この方法では自宅内ではLAN内で稼働する機器向けのDNSサーバーを参照し、他のネットワーク接続時はデフォルトのDNSサーバーを参照するという使い方がとても面倒になります。できれば本来の動作のまま使えることを期待したいのです。

今回の解決方法となるネットワークアダプターの操作は、Windows 10ではネットワーク接続画面から行います。

ホストマシンのネットワークアダプターを無効化すると、付随してvEthernet(イーサネット)vEthernet(WSL)の2つのアダプターが削除されます。この2つのアダプターはホストマシンのネットワークアダプターを有効化すると再作成されます。

ネットワーク接続

vEthernet系のアダプターの再作成により、DNS問い合わせエラーによるWSLのネットワーク不調は解決すると思います。

この方法で解決できなかった場合は、resolv.confの書き換えなどの手段を検討してください。

警告
初稿時点ではWindows 11でWSLのネットワーク不調に遭遇していないため、Windows 11で同様に問題が解決するかは確認できていません。
情報

Windows 11では設定アプリのネットワークとインターネットネットワークの詳細設定ハードウェアと接続のプロパティからvEthernet (WSL (Hyper-V firewall))という名前のネットワークアダプターが確認できますが、ネットワークの詳細設定画面からのネットワークアダプター無効化→有効化操作ではvEthernetアダプターが再作成されたようには見えませんでした。

なお、Windows 11のネットワーク接続画面では、vEthernetアダプターが表示されないようになっていました。

情報

2024/4/3追記

WSL 2.2.1からDNSトンネリング機能がデフォルトで有効になり、DNS問い合わせエラーによるネットワーク接続の不調が解消されるようです。

Microsoft、WSL 2.2.1でDNSトンネリングをデフォルトで有効に

2024/4/3時点ではMicrosoft Storeから取得可能なバージョンはWSL 2.1.5ですが、WSL 2.2.1が利用可能になればまず試すことは「wsl --updateを実行すること」になりそうです。

<<WSL2のAlpine LinuxでDockerを使う OWASP ZAPのコンテナを日本語対応させる>>