WSLのネットワークエラー

# はじめに

## 目次
１．利用環境
２．エラー内容
３．結論－これで解決した！
４．その他に試したこと


## 利用環境
- Windows11
- WSL2
- Ubuntu 22.04

## エラー内容
WSLで以下のような外部ネットワークと接続するコマンドが一通りエラーで実行できなくなった。
`apt update`
`apt install <サービス名>`
`docker-compose up -d`
`git clone <アドレス>`
![neterror.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/68b97163-3ff8-196c-48df-ce766391d2fd.png)

## 結論－これで解決した！
- `ping google.com` と `ping 8.8.8.8` の挙動確認
- `/etc/resolv.conf` の編集
- `/etc/wsl.conf` の編集
- Windows 高速スタートアップを無効にする

一つずつ解説していきます。

### `ping google.com` と `ping 8.8.8.8` の挙動確認
Ubuntu で `ping <接続したいIPアドレス or ホスト名>` を実行すると、指定した IPアドレス or ホスト への接続ができているか確認できる。
ここで確認するのは、どちらのパターンなのか。

１．`ping 8.8.8.8` は接続できるが、`ping google.com` は接続できない。
２．`ping google.com` だけでなく、`ping 8.8.8.8` も接続できない 

私の場合は、その時々で１の状況もあれば、２の状況もあった。

⇩ ping が通っている状態（３行表示されたところで、Ctrl+Cで終了した）
![スクリーンショット 2023-11-05 183035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/c3df6ca1-5c85-178e-11b1-b731d9328a33.png)

#### １と２の違い
１の状況は、DNSが上手くいっていないことを表している。
DNS というのは、ドメイン名（googl.comなど）をIPアドレス（8.8.8.8など）に変換する役割のこと。
この場合、以下の状態である、
- WSLはネットワークには接続できている。
- 8.8.8.8 という IPアドレスを直接指定すれば接続できる。
- google.comというドメイン名を指定した場合、ドメイン名をIPアドレスに変換することができないので、接続できない。

２の状況は、IPアドレスを直接指定しても接続ができていないため、WSLへのネットワーク自体が接続できていない状況である。

#### 解決策
これは１の場合と２の場合で異なる。

１の場合については、ネットでもそれなりの記事が確認できたが、DNSの設定を編集すればよいことになる。
それが、この後に述べる**二種類のファイル `/etc/resolv.conf` と `/etc/wsl.conf` の編集**である。

２の場合についてが厄介だった。
何をやっても改善せず途方に暮れたが、最終的に行き着いたのが、その後に述べる **Windows 高速スタートアップを無効にする** ということだった。恐らくそれが理由で改善したものと思われる。

### `/etc/resolv.conf` と `/etc/wsl.conf` の編集
この件については、色々と参考記事が見つかるのだが、肝心なのはその順番であった。
概要を説明すると、WSL2 は WDL1 とネットワーク構造が大きく異なっている。
WSL1 は Windows のネットワークをそのまま使うらしいのだが、WSL2 は独自のネットワークを構成し、IPアドレスは、Windowsを再起動するたびに　Windowsとは異なる IPアドレスが割り当てられる。

参考サイト
[Windows Subsystem for Linuxガイド 第10回 WSLネットワーク編](https://news.mynavi.jp/article/20220925-2462456/)

本来はDNSサーバーで上手く名前解決できるはずなのだが、下記の参考サイトにもあるように、なぜかそれが上手くいかないことが多いようだ。そのため、二種類のファイル `/etc/resolv.conf` と `/etc/wsl.conf` を編集することにより、こちらでDNSサーバーを指定してこの問題を回避する。

参考サイト
[WSLからインターネットに接続できないときは/etc/resolv.confを変更する](https://blog.cosnomi.com/posts/wsl-resolv-conf/)

ところが、上記サイトに書いてある方法をそのまま試しても、私の場合上手くいかず、何日も躓いてしまった。
大事なのはその順番だったようだ。

> WSLでは /etc/resolv.conf はシンボリックリンクとなっており、generateResolvConf = false 設定後に /etc/resolv.conf を直接編集した上でWSLを再起動すると既存のファイルも削除され、/etc/resolv.conf は 編集の有無によらず破棄されてしまう ようです。

参考サイト
[WSLのDNS設定をカスタムしたい（202203現在）](https://blog.jp.square-enix.com/iteng-blog/posts/00015-wsl-dns-custom/)

上記順番に則って、ファイルを編集する。

DNSサーバーを指定するのが、`/etc/resolv.conf` である。
このファイルは、Windows を立ち上げるたびに自動生成されてしまうので、 `/etc/wsl.conf` を編集し、自動生成されないように設定する必要がある。

`sudo vim /etc/wsl.conf` 実行し、下記追記。
※vim の操作方法に関してはここでは言及しない。
```
[network]
generateResolvConf = false
```
![スクリーンショット 2023-11-05 180445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/3a0e8408-e5de-70ad-37e9-3f2deb195cdd.png)

ここで一度 WSL をシャットダウンして再起動する。
PowerShell にて下記実行。
```
wsl --shutdown
```

再度 WSL を起動したら、まずは元からあるファイルを削除する必要がある。
（これをしていなかったことが、私が躓いた原因の一つだと思われる）

> resolv.confの自動生成が行われているとき、/etc/resolv.confは、/run/resolvconf/resolv.confへのシンボリックリンクになっている。まずはリンクを削除し、その上で/etc/resolv.confファイルを作成する。

参考サイト
[Windows Subsystem for Linuxガイド 第10回 WSLネットワーク編](https://news.mynavi.jp/article/20220925-2462456/)

```
sudo rm /etc/resolv.conf
```

その上で、`sudo vim /etc/resolv.conf` を実行し、ファイルに下記追記。

```
nameserver 8.8.8.8
```

![スクリーンショット 2023-11-05 175440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/348fd214-f019-be08-c909-afef5b1da7b5.png)

これで ping google.com も通るようになり、DSN問題は解決するはずである。
`ping google.com` だけでなく、`ping 8.8.8.8` も通らなかった方は次へ。

### Windows 高速スタートアップを無効にする
Windowsのネットは繋がっているのに、WSLのネットが繋がらない理由は何だろうと色々考えた中で、Docker が何やら関係しているかもしれないという情報を見つけた。本ネットワークエラーに関しては、WSL を提供している Microsoft も問題を解決できていない GitHubの isuu がある。

参考サイト
[DNS issues in WSL2 #8365](https://github.com/microsoft/WSL/issues/8365)

原因は定かではないが、私自身も docker-compose build を実行後、もしくは実行時におかしくなることが多い気がしている。
そうなった時に、その前と後で何か設定をいじっているわけではないので、PC再起動で直るのでは？ということを考えた。
しかし、それが直らないから困っている。
そこで行き着いたのが、Windows の高速スタートアップだった。

参考サイト
[Windows 10・11の高速スタートアップとは](https://windowsfaq.net/windows/setting/how-to-disable-fast-startup/)

これは、Windows PC の電源を入れた際に高速に起動するための設定で、デフォルトでは有効になっている。
ところが、速い反面、ネットワーク関連の問題が起こった時に、シャットダウンしても状態が改善せずにそのまま不具合が残った状態になることがあるようだ。

上記サイトを参考に、高速スタートアップを無効にしてみたところ、ping 8.8.8.8 が無事通るようになった！
度々通らなくなるのだが、その時はPC をシャットダウンして再起動すれば、また通るようになった。


## その他に試したこと
- PC 再起動
- PowerShell 管理者で NAT再起動
- WSL のアップデート
- netsh でネットワーク関連の設定をリセット

参考サイト
[Windows Subsystem for Linux September 2023 update](https://devblogs.microsoft.com/commandline/windows-subsystem-for-linux-september-2023-update/)
[[2023年6月版]WSLだけ外に出れない？](https://zenn.dev/asopitech/articles/20230621-173203_1)

## まとめ
このネットワーク関連エラーで何も作業が進まず、原因を探っても全然解決できなくて数日を無駄にしました。
今回は色々な方のサイトを参考にさせていただきましたが、自分自身もネットワーク関連の知識をつけなければいけないと痛感しています。
DNS や名前解決といったワードの意味がある程度分かるようになったことは、大きな学びになりました。
とにかく、やっと解決できてほっとしています。
この記事が、同じように困っている方の助けになれば幸いです。