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

# はじめに

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.


https://learn.microsoft.com/en-us/windows/wsl/wsl-config

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

```/etc/resolv.conf
nameserver 8.8.8.8
``` 

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

### 調べて書く

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

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

### WSL2 再起動

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

```powershell
> wsl --shutdown
```

### 正常動作？

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

```bash
$ 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
```

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

```bash
$ 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月の投稿だよ。

https://learn.microsoft.com/en-us/windows/wsl/networking#accessing-windows-networking-apps-from-linux-host-ip

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.

## 参考情報

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

https://01futabato10.hateblo.jp/entry/2021/05/11/224937

https://yoshinorin.net/articles/2020/08/22/wsl2-network-error/

https://qiita.com/ryosukeYamazaki/items/c04ec3ff78aac6eb8d26

# まとめ

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

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