WSL2 で dns の名前解決ができなくなって ネット接続できなくなった場合の対処方法

## 問題の事象
`sudo apt-get update` をしたら
```
W: Failed to fetch https://packages.microsoft.com/ubuntu/18.04/prod/dists/bionic/InRelease  Temporary failure resolving 
```
と表示された？？
え？ 

```
wget https://packages.microsoft.com/ubuntu/18.04/prod/dists/bionic/InRelease
```
したら
```
curl: (6) Could not resolve host: packages.microsoft.com
```
となった。 DNS による名前解決ができていない？？

Windows 側の環境では ちゃんと `https://packages.microsoft.com/ubuntu/18.04/prod/dists/bionic/InRelease`
見えるのに・・。

DNS の状況確認

```
dig +tcp packages.microsoft.com
```
した結果

```
;; Connection to 172.25.208.1#53(172.25.208.1) for packages.microsoft.com failed: timed out.
```
でも

```
dig packages.microsoft.com
```
だと ちゃんと応答を返す。
TCP 接続での DNS 解決ができていないために このトラブルが発生している。


## 解決方法（2024/05 に 解決方法がリリースされました）

WSL の 最新バージョンでは ネットワーク設定周りの強化が行われました。

https://devblogs.microsoft.com/commandline/whats-new-in-the-windows-subsystem-for-linux-in-may-2024/

現在インストールされている WSL を最新版に更新します。

```
wsl --update
```
Windows 11 でも Windows 10 でも インストールできます。

インストール後の確認
```
wsl --version
```

Windows 11 の場合
```
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3593
```
Windows 10の場合
```
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.4412
```
になっていると思います。


`C:\Users\<<ユーザ名>>\.wslconfig`

ファイルを作成して
```
[wsl2]
dnsTunneling=true
```
の定義を入れると DNS の 問題が改善するようです。


この方法は WSL 側から Windows で管理しているDNS情報をネットワークを使わずに取得する事ができるような仕組みになっているそうです。

実験的な機能です、と公開されている時から利用していますが、安定して動作しています。

https://learn.microsoft.com/ja-jp/windows/wsl/networking#dns-tunneling
>Windows 11 22H2 以降を実行しているマシンでは、.wslconfig ファイルの [wsl2] の下に dnsTunneling=true を設定すると、WSL では WSL 内から DNS 要求に応答する仮想化機能が使用され、ネットワーク パケット経由でそれらが要求されることはありません。 この機能は、VPN やその他の複雑なネットワーク設定との互換性を向上させることを目的としています。

https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config#configuration-settings-for-wslconfig


## 解決方法（旧方法 参考までに・・）
WSL2 の DNS は WSL2 起動時に自動的に 仮想ネットワークの `172.25.208.1` 等のアドレスに
なっている事があって、この仮想ネットワークのDNS が不調になっている場合に発生する。

WSL2 の中でも Google の DNS サーバー `8.8.8.8` を利用するように設定する事で 
仮想ネットワーク上の DNS を利用しないようにする。

コマンドプロンプトから WSL をシャットダウンさせる。
```
wsl --shutdown
```
次に wsl にログインして `/etc/wsl.conf` ファイルを作成して、下記の内容を登録する
`sudo vi /etc/wsl.conf`

```
[network]
generateResolvConf = false
```
次に `/etc/resolv.conf` ファイルを削除して DNS の設定を登録

```
sudo rm /etc/resolv.conf
sudo sh -c "echo 'nameserver 8.8.8.8' > /etc/resolv.conf"
```

`/etc/resolv.conf` は `../run/resolvconf/resolv.conf` へのシンボリックリンク
なっているので一旦削除して設定します。

編集したら、サービスの再起動をしなくても DNS 設定が変更されます。

### おまけ： DNS 設定を元に戻す方法

DNS 設定を変更前に元戻す場合下記の手順を行います。

```
cd /etc
sudo mv resolv.conf resolv.conf.new
sudo ln -s ../run/resolvconf/resolv.conf resolv.conf
sudo rm /etc/wsl.conf
```
コマンドプロンプトから

```
wsl --shutdown
```
として もう一度 wsl にログインします。


### 参考URL


https://github.com/microsoft/WSL/issues/4285

[Microsoft Docs : Windows Subsystem for Linux のトラブルシューティング](https://docs.microsoft.com/ja-jp/windows/wsl/troubleshooting)

`/etc/wsl.conf` についての詳細な解説は

[Microsoft Docs : WSL での詳細設定の構成](https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config)