🔍

wsl2 と DNS(リゾルバ)

2025/02/04に公開

問題の整理

あくまで発生している問題は、自分だけかもしれないので先にそれを書く。

  • WSL2 / Ubuntu 24 / mirrorModeだけ指定して、他は弄ってない
  • 名前解決はそもそも出来る
  • 名前解決が早いときもあれば、遅い時もある、遅い時は15Secぐらいかかる

WSL2側の設定

https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config

  • 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.confgenerateResolvConf=false でこの書き換えを黙らせることは出来るが、こんどは ubuntu 自体の systemd-resolved が働くようになり、今度はこいつが /etc/resolv.conf を毎回書き換える。

systemd-resolvedってなんや?

自身の 127.0.0.53 でListenして resolv.conf もそれを指すように仕向ける。これにより、本来Linuxには存在しないDNSキャッシュを実現するらしい。それだけじゃないらしいけど。
https://wiki.archlinux.jp/index.php/Systemd-resolved

詳しくはちゃんと調べた方が良い。2025年時点でも(汎用)生成AIは適当な嘘しか言わないので、真面目に調べた方が早い。
systemd-resolvedが生成する resolv.conf 読めば分かるが自動生成なので、こいつを弄っても意味ない。どうしても直接弄るんならresolvedを黙らせれば良い、systemctl で。
systemd-resolvedを生かしつつ、最終的にどのnameserverを使うのかを設定したい場合は /etc/systemd/resolved.conf.d/*.conf を作成して、systemdに吸わせてあげれば良い。

dnsTunneling=false にする理由は?

https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config

dnsTunnelingIpAddress というパラメータがあり、ここを弄ると /etc/resolv.conf が書き換えられる。これでOKそうで 8.8.8.8 とか指せば外のDNSさせそうだが、どうやら違う。デフォルトの場合 10.255.255.254 だが、これはWindowsにDNSをリレーするときに使うIPアドレスのようだ。なので 8.8.8.8を差してもそれを使って、Windowsに投げられる

そもそも問題が発生してないなら、こんなことしなくていい

上記の原理を踏まえても、なんで私の環境でのDNS問い合わせが たまにというには高頻度で メチャクチャ遅くなるが、原因は分からない。原理的にはデフォルトの状態で全く問題無いはずなので、問題起こってない人は無視して。

Discussion