🐧

WSL2のDNS問題をいい感じに解決する(2024)

2024/01/28に公開

散々苦しめられた、WSL2の Could not resolve host 問題

WSL2と言えばコレ!」と言わんばかりの定番中の定番ネタなのですが、WSL2で apt にしろ npm にしろ、パッケージを更新しようとしたら失敗してしまい、よくよく見てみたらWSL2の名前解決がうまくいっていない…という事があります。

定番パターンは 8.8.8.8 を使う方法なのですが、個人的にはゴリ押し感が拭えず数年間モヤモヤしていました。今回はもっと良さそうな方法を見つけたので、紹介しておきます。

1. dnsTunnelingを使用する

WSL September 2023 update から、dnsTunneling オプションが追加されました。

WSLの仮想マシンからWindowsホスト側にDNS名をリクエストして、直接Windows側のDNS設定を拾ってくるようになります。

https://devblogs.microsoft.com/commandline/windows-subsystem-for-linux-september-2023-update/

設定方法はWSLのdistro毎に設定するのではなく、WSL全体のコンフィグに適用するので都度設定する必要もありません。Cのユーザ直下の自分のユーザディレクトリ内にある、 C:\Users\<username>\.wslconfig に以下を追記するだけです。

.wslconfig
[wsl2]
dnsTunneling=true

手元の環境で試した限りでは、Ubuntu, Archどちらでも正常に動作しました。Dockerコンテナからも問題なく名前解決ができているようです。

2. 起動時にPowershellからDNS情報を引っこ抜く

結局はやっていることは dnsTunneling と近い事なのですが、Powershellから引っこ抜いてくる方法もあるようです。こちらはGithubでたまたま見つけました[1]

ブート時のコマンドを指定して、マウントされたWindows側のpowershellを叩いてDNSサーバのIPを拾ってきているようです。

https://gist.github.com/ThePlenkov/6ecf2a43e2b3898e8cd4986d277b5ecf

/root/boot.sh に配置し、 /etc/wsl.conf で指定してWSL起動時に呼び出します。

/etc/wsl.conf
[network]
generateResolvConf=false
[boot]
command=boot.sh

手元環境では Arch で動作確認済みです。

まとめ

長年悩まされた問題が dnsTunneling=true 一行で解決できるので超スッキリしました。  Windowsはどうしても開発環境が整え辛いイメージがありますが、WSLの発展に伴ってかなり良くなってきている実感があります。

Microsoftさん、この調子でシンボリックリンクの問題とか、 Wayland環境で fcitx5 が動かない問題とかも…何卒よろしくお願いします🙇

脚注
  1. fix-wsl2-dns-resolution ↩︎

Discussion