LoginSignup
4
9

【WSL2】名前解決できないとき

Last updated at Posted at 2022-10-29

はじめに

WSL2にubuntu20.04を入れて使おうとして、sudo apt update や git clone hogehoge をしようとしたら、名前解決できずにネットワークにアクセスできませんでした。
解決はしたのですが、一応メモしておきます。

  • (理由は分からないのですが) /etc/resolv.conf がおかしいので、8.8.8.8 と書き直す
  • (それでも解決しないので)直接DNS のIPアドレスを調べて、/etc/resolv.conf に書く

がやったことです。

【追記2022/11/27】それでも解決しないとき、なぜか、WSL2 を version 1 にしたら動いたことがありました。

内容

まず、/etc/resolv.conf ですが、私の環境ではシンボリックリンクになっていて、下記のように変な状態でした。

$ file /etc/resolv.conf
/etc/resolv.conf: broken symbolic link to ../run/resolvconf/resolv.conf

もともと、いろいろ書かれているように、初期設定時に resolv.conf を書く、という設定が紹介されていました。自分の所では、下記のようにしていました。

/etc/wsl.conf
[network]
generateResolvConf = false

ここが true だと resolv.conf が作られるそうです。

true set WSL to generate /etc/resolv.conf. The resolv.conf contains a DNS list that are capable of resolving a given hostname to its IP address.

これは置いておいて、resolv.conf がないと、

/etc/resolv.conf
nameserver 8.8.8.8

のように自分で書く、ということで解決されている方が多いようです。

調べて書く

私の場合、それでも解決できませんでした。ので、直接、調べて設定しました。power shell で

$ ipconfig /all

として、ホストのwindows がネットワークに接続している接続のDNSサーバのIPアドレスを調べます。それを、resolv.conf に追加しました。

WSL2 再起動

WSL2 を終了させます。power shell から行います。

> wsl --shutdown

正常動作?

とりあえずネットにつながっただけで、あるべき正しい姿がまだよく分かりません。
別の環境では、/etc/wsl.conf はなく、/etc/resolv.conf は

$ file /etc/resolv.conf
/etc/resolv.conf: symbolic link to /mnt/wsl/resolv.conf
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.21.32.1

となっていて、問題なく使えています。

原因について考察

途中からホスト側のネット環境が変わると、DNSも変わる可能性があると思います。そのとき、起動中のWSL2のresolv.conf は古いままとなり、名前解決されなくなる可能性があるのかな、と思いました。例えば、喫茶店を変えて接続するFree WiFiが変わるとか、途中で会社のVPNに入るとか。

また、正常な状態なら、/etc/resolv.conf が正常に作られるようなので、wsl.conf で generateResolvConf = false にしない方が良いのかもとも思いました。実際にもう一つの環境では、問題なく動いています。

あと、Docker for windows で WSL2を使っていたのも影響していたかもしれません。途中からきどうしたとき、何か変わるのかな。

まぁ、いずれしていも良く分からん。

それでも動かない(WSL1へ)

WSL2からWSL1 へ?(2022/11/27追記)

それでも(確実に)動かないときがありました。ホストマシンがプライベートのネットワークでグローバルIPを持たない状態でしたが、それが関係しているか分かりません。ホスト側でイーサネットのDNSにはIPv6のアドレスが書かれていました。そのとき、確実にWSLでネットにつなぐには、WSL version 1 にしたら動きました。

PS> wsl --set-version ubuntu_20.04 1

で1にできます。
もしversion 2なら、WSL2 でのkernel version が5.10.xxx になるようです。

$ uname -a
Linux node-name 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

考察

Ubuntu20.04 をインストールするとき、WSL のdefault version が 1 でした。それが関係しているのかも、という気もしますが、分かりません。

やはり動かないらしい(2023/4/11追記)

ずばりこの記事。2023年3月の投稿だよ。

WSL1ではhostのネットワーク接続がそのままWSL1で使えるけれど、WSL2ではそうではないと。特に、WSL2ではIPv6は使えないと。がーん。WSL1にするは正しい方法だったのか。

IPv6 access
WSL 2 distributions currently cannot reach IPv6-only addresses. We are working on adding this feature.

参考情報

他にもたくさん読みました。多謝。

まとめ

WSL2でネットワーク接続において名前解決ができなくなったとき、/etc/resolv.conf を修正したら動きました。今後も様子をみます。。。Linuxマシンを使いたいのに使えない環境に、今日も涙。
(2022/10/28)

追記

  • 2022/11/27 それでも動かない: WSL2からWSL1 へ? を追加
  • 2023/4/11 WSL2でIPv6が現在は使えないとの learn.microsoft.com の記事のリンクを記事を追加
4
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
9