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.conf
のnameserver
指定をパブリックDNSサーバーに決め打ちで指定するという方法がよく見つかります。
しかし、この方法では自宅内ではLAN内で稼働する機器向けのDNSサーバーを参照し、他のネットワーク接続時はデフォルトのDNSサーバーを参照するという使い方がとても面倒になります。できれば本来の動作のまま使えることを期待したいのです。
今回の解決方法となるネットワークアダプターの操作は、Windows 10ではネットワーク接続
画面から行います。
ホストマシンのネットワークアダプターを無効化すると、付随してvEthernet(イーサネット)
とvEthernet(WSL)
の2つのアダプターが削除されます。この2つのアダプターはホストマシンのネットワークアダプターを有効化すると再作成されます。
vEthernet系のアダプターの再作成により、DNS問い合わせエラーによるWSLのネットワーク不調は解決すると思います。
この方法で解決できなかった場合は、resolv.conf
の書き換えなどの手段を検討してください。
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
を実行すること」になりそうです。