wsl2 と DNS(リゾルバ)
問題の整理
あくまで発生している問題は、自分だけかもしれないので先にそれを書く。
- WSL2 / Ubuntu 24 / mirrorModeだけ指定して、他は弄ってない
- 名前解決はそもそも出来る
- 名前解決が早いときもあれば、遅い時もある、遅い時は15Secぐらいかかる
WSL2側の設定
-
dnsTunneling
は Default で true -
dnsTunnelingIpAddress
も Defaultのまま
この状態で、先の問題が発生する。dnsTunnelingさえすれば問題解決という意見が圧倒的なので、そもそも問題ないならこの記事は無視して。
先に解決方法
/etc/wsl.conf
の設定
[network]
generateResolvConf=false
/etc/systemd/resolved.conf.d/dns_server.conf
作成
[Resolve]
DNS=8.8.8.8
Domains=~.
%userprofile%/.wslconfig
[wsl2]
networkingMode=mirrored
dnsTunneling=false
wsl --shutdown
で再起動
なぜこうなるのか?
wsl2側のお節介
wsl2側の挙動で、 /etc/resolv.conf は起動のたびに書き換えられている。このとき dnsTunneling
使っているならば、 dnsTunnelingIpAddress
の設定値で書き換えられる。
/etc/wsl.conf
で generateResolvConf=false
でこの書き換えを黙らせることは出来るが、こんどは ubuntu 自体の systemd-resolved
が働くようになり、今度はこいつが /etc/resolv.conf を毎回書き換える。
systemd-resolvedってなんや?
自身の 127.0.0.53
でListenして resolv.conf もそれを指すように仕向ける。これにより、本来Linuxには存在しないDNSキャッシュを実現するらしい。それだけじゃないらしいけど。
詳しくはちゃんと調べた方が良い。2025年時点でも(汎用)生成AIは適当な嘘しか言わないので、真面目に調べた方が早い。
systemd-resolvedが生成する resolv.conf 読めば分かるが自動生成なので、こいつを弄っても意味ない。どうしても直接弄るんならresolvedを黙らせれば良い、systemctl で。
systemd-resolvedを生かしつつ、最終的にどのnameserverを使うのかを設定したい場合は /etc/systemd/resolved.conf.d/*.conf
を作成して、systemdに吸わせてあげれば良い。
dnsTunneling=false
にする理由は?
dnsTunnelingIpAddress
というパラメータがあり、ここを弄ると /etc/resolv.conf
が書き換えられる。これでOKそうで 8.8.8.8
とか指せば外のDNSさせそうだが、どうやら違う。デフォルトの場合 10.255.255.254
だが、これはWindowsにDNSをリレーするときに使うIPアドレスのようだ。なので 8.8.8.8を差してもそれを使って、Windowsに投げられる
そもそも問題が発生してないなら、こんなことしなくていい
上記の原理を踏まえても、なんで私の環境でのDNS問い合わせが たまにというには高頻度で
メチャクチャ遅くなるが、原因は分からない。原理的にはデフォルトの状態で全く問題無いはずなので、問題起こってない人は無視して。
Discussion