WSL2のUbuntu 22.04.3 LTSにリモートデスクトップ接続する。（その３：ブリッジ接続）

# はじめに
前回は`WSL2`を動かしている`Windows`ホストから`WSL2`の仮想マシンに対してリモートデスクトップ接続を行いましたが、今回は外部のクライアントから`WSL2`の仮想マシンに直接接続できるように、仮想ネットワークの設定を変更しようと思います。

- 【前】[WSL2のUbuntu 22.04.3 LTSにリモートデスクトップ接続する。（その２’：xrdpインストール）](https://qiita.com/sakai00kou/items/c3f2e4043765aad0651f)

# ブリッジ接続を行うために必要なこと
`WSL2`はいわゆる仮想マシンを動作させる機能となりますが、`WSL2`を動かしている`Windows`ホストと仮想マシン間では仮想のスイッチを介して通信を行っています。

デフォルトでは`Windows`ホストと仮想マシン間でしか接続できない設定となっており、また、`Windows`ホストから仮想マシンに接続するには`Windows`ホスト側でポートフォワードを行う必要がありました。

外部と直接通信するためには外部と通信が行える仮想スイッチを作成する必要がありますが、仮想スイッチを作成する機能は`Hyper-V`のサービスを有効にする必要があり、`Hyper-V`のサービスを有効にするには`Windows 11 Pro`でなければ有効にできません。

以下より`Windows 11 Pro`でブリッジ接続を行えるようにする設定を紹介していきます。

# Hyper-Vサービスの有効化
ブリッジ接続を行うためには`Hyper-V`サービスを有効にする必要があるため、今回は`PowerShell`から有効にしていきます。

`PowerShell`を特権モードで起動して以下コマンドを実行します。

```powershell:Hyper-Vサービスの有効化
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all
```

サービス有効化後、再起動する必要があるため、メッセージに従い再起動を行ってください。

# 新しい仮想スイッチの作成
ブリッジ接続するために新しい仮想スイッチを作成していきます。

- [仮想スイッチマネージャー画面への遷移](#仮想スイッチマネージャー画面への遷移)
- [外部接続用仮想スイッチの作成](#外部接続用仮想スイッチの作成)

## 仮想スイッチマネージャー画面への遷移
検索ボックス等で「**コントロールパネル**」を開き、「**システムとセキュリティ**」→「**Windowsツール**」から「**Hyper-Vマネージャー**」を起動します。

![Monosnap_20240203_190426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/f165755e-26de-f41a-774f-a799331735ce.png)

上部バーか、ウィンドウ右の「**操作**」メニューから「**仮想スイッチマネージャー**」を選択。

![Monosnap_20240203_190743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/fd0f2635-1418-ca1e-b490-58dcd89e1704.png)

デフォルトで作成されている仮想スイッチを見ると、以下のように接続の種類が「**内部ネットワーク**」で`NAT`モードになっていることが確認できます。

![Monosnap_20240203_191124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/4144e25d-4ac1-b57f-88cd-c617958523d6.png)

`WSL2`を使用する場合、何もしなければデフォルトの仮想スイッチを使用して外部と通信することになるため、外部と通信する際には`NAT`で通信することになり、また、接続の種類が内部ネットワークになっているため、外部のクライアントからの接続は行えないようになっています。

そのため、通常は`WSL2`を動かしている`Windows`ホストからしか接続できず、`Windows`ホストから接続する際にも`Windows`ホスト側でポートフォワーディングを行って`WSL2`側のサービスと紐付ける必要があったわけです。

以下より新たに外部からの接続が行えるように新しくスイッチを作成して設定していきます。

## 外部接続用仮想スイッチの作成
「**新しい仮想ネットワークスイッチ**」から「**外部**」を選択し、「**仮想スイッチの作成**」を選択します。

![Monosnap_20240203_193104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b72ff078-9f1e-34e7-4147-d03fbfa90584.png)

スイッチに適当な名前（今回は`External Switch`）を入力し、接続の種類で「**外部ネットワーク**」、「**ネットワークアダプターの共有を許可**」にチェックを行い、「**適用**」→「**OK**」と選択します。

![Monosnap_20240203_195831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/09c1c91a-90e4-fb5f-290f-be5e63d8eca7.png)

適用時、以下のようなポップアップが表示されたら、「**はい**」を選択します。

![Monosnap_20240203_193327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/9af07367-60e5-0185-9c78-e15e982609a2.png)

# 接続する仮想スイッチの変更
外部接続用の仮想スイッチは作成したので、`WSL2`が使用している仮想スイッチをデフォルトの仮想スイッチから外部接続用の仮想スイッチに以下手順で切り替えます。

- [.wslconfigの作成](#wslconfigの作成)
- [Ubuntuの再起動](#ubuntuの再起動)
- [IPアドレスの確認](#ipアドレスの確認)

## .wslconfigの作成
`WSL2`が使用している仮想スイッチを切り替えるためにはネットワーク設定を書き込んだ`.wslconfig`というファイルをメモ帳等で新たに作成して`Windows`ホスト側の「**C:¥Users¥[username]**」配下に置く必要があります。

```bash:C:¥Users¥username¥.wslconfig
[wsl2]
networkingMode=bridged
vmSwitch="External Switch"
dhcp=true
ipv6=true
```

`vmSwitch`は先程作成した外部接続用仮想スイッチの名前（今回は`External Switch`）を入力してください。

## Ubuntuの再起動
仮想スイッチの切り替えには`WSL2`で動かしている仮想マシンの再起動が必要となるため、`PowerShell`で`wsl -l -v`コマンドを実行し、`Running`状態であれば、シャットダウンを行います。

```powershell:仮想マシンの状態確認
> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

シャットダウンするには、`NAME`で表示されている名前（今回は`Ubuntu`）を指定すればOKです。

```powershell:仮想マシンのシャットダウン
wsl --shutdown Ubuntu
```

シャットダウン後、Windowsターミナルから`Ubuntu`のウィンドウを立ち上げれば起動してきます。

## IPアドレスの確認
仮想マシン起動後、仮想マシン側で外部ネットワークのアドレスが割り振られているか`ip a`等のコマンドで確認します。

```bash:IPアドレスの確認
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 5e:bb:f6:9e:ee:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.15/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2400:4051:e01:d500:xxxx:xxxx:xxxx:xxxx/64 scope global tentative dynamic mngtmpaddr
       valid_lft 2591993sec preferred_lft 604793sec
    inet6 fe80::5cbb:f6ff:fe9e:eefa/64 scope link
       valid_lft forever preferred_lft forever
```

ここまでの設定で`WSL2`側は外部接続用仮想スイッチに接続を切り替えた構成になるため、イメージとしては以下のような接続となっています。

![VirtualSwitch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b0df3972-077f-bc6a-3c4d-a0b4b1b45b9b.png)

# 外部からの接続確認
外部接続用の仮想スイッチに繋いだことで`WSL`を動作させている`Windows`ホスト以外からも接続できるようになったので、別のクライアントから接続できるか確認してみます。

外部のクライアントでリモートデスクトップ接続を立ち上げ、「**[IPアドレス]:13389**」を指定して接続します。

なお、`Windows`ホスト側でファイアウォール等の設定を行っている場合はあらかじめ許可しておきましょう。

`Windows`ホストで接続したときと同様に接続できれば成功です。

なお、ブリッジ接続を行ったことで`WSL2`の仮想マシンに外部IPアドレスが割り振られて、直接外部から接続できるようになったことから、リモートデスクトップ接続時のポート番号を分ける必要がなくなったので、`13389`ポートに変更していたポート番号は、デフォルトの`3389`ポートに戻してもOKです。

# おわりに
`WSL2`の仮想マシンに外部から接続するという需要があるかはともかく、手元のPCで手軽に設定できるのでちょっとしたテストを行うのに便利だと思いました。