WSL2 で名前解決できずインターネットに接続できない
`ping 8.8.8.8` は通るのにホスト名が引けないなら DNS の問題。
`/etc/resolv.conf` は WSL が自動生成するため手で書いても消える。
固定するには `/etc/wsl.conf` で自動生成を止める。
公開:
要約
WSL2 でパッケージの取得やネットワークアクセスが失敗するとき、原因の多くは経路ではなく名前解決である。
/etc/resolv.conf は WSL が起動のたびに自動生成する。
手で書き換えても次の起動で上書きされるため、設定を残したいなら /etc/wsl.conf で自動生成そのものを止める必要がある。
よくある原因
- 自動生成による上書き:
/etc/resolv.confを直接編集したが、WSL が再生成して元に戻した。 - VPN や企業ネットワーク: Windows ホストへの DNS 問い合わせが遮られる構成になっている。
- 反映漏れ:
/etc/wsl.confを書いたが WSL を再起動していない。 - 構成の複雑さ: 複数の仮想アダプタや独自 DNS が絡み、問い合わせ先が定まらない。
解決策
1. DNS の問題か切り分ける
ping -c 1 8.8.8.8
ping -c 1 example.com前者だけ通るなら経路は生きており、名前解決だけが失敗している。
2. resolv.conf の自動生成を止める
sudo tee /etc/wsl.conf > /dev/null << 'CONF'
[network]
generateResolvConf = false
CONFgenerateResolvConf を false にすると WSL は /etc/resolv.conf を自動生成しなくなる(公式ドキュメント(新しいタブで開く))。
3. DNS サーバを書く
sudo rm -f /etc/resolv.conf
sudo tee /etc/resolv.conf > /dev/null << 'CONF'
nameserver 1.1.1.1
CONF自動生成を止めた後に書けば、この内容が保持される。
既存の /etc/resolv.conf はシンボリックリンクのことがあるため、先に削除しておく。
4. WSL を再起動する
wsl --shutdownPowerShell から実行し、WSL を立ち上げ直して設定を反映させる。
5. VPN 環境では DNS トンネリングを確認する
Windows 11 22H2 以降では .wslconfig の [wsl2] にある dnsTunneling が既定で有効になっており、ネットワークパケットを送らずに Windows 側へ DNS 要求を渡す。
VPN 併用時の名前解決が不安定なら、この設定の状態を確認する。