はじめに
前回はWSL2
を動かしているWindows
ホストからWSL2
の仮想マシンに対してリモートデスクトップ接続を行いましたが、今回は外部のクライアントからWSL2
の仮想マシンに直接接続できるように、仮想ネットワークの設定を変更しようと思います。
ブリッジ接続を行うために必要なこと
WSL2
はいわゆる仮想マシンを動作させる機能となりますが、WSL2
を動かしているWindows
ホストと仮想マシン間では仮想のスイッチを介して通信を行っています。
デフォルトではWindows
ホストと仮想マシン間でしか接続できない設定となっており、また、Windows
ホストから仮想マシンに接続するにはWindows
ホスト側でポートフォワードを行う必要がありました。
外部と直接通信するためには外部と通信が行える仮想スイッチを作成する必要がありますが、仮想スイッチを作成する機能はHyper-V
のサービスを有効にする必要があり、Hyper-V
のサービスを有効にするにはWindows 11 Pro
でなければ有効にできません。
以下よりWindows 11 Pro
でブリッジ接続を行えるようにする設定を紹介していきます。
Hyper-Vサービスの有効化
ブリッジ接続を行うためにはHyper-V
サービスを有効にする必要があるため、今回はPowerShell
から有効にしていきます。
PowerShell
を特権モードで起動して以下コマンドを実行します。
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all
サービス有効化後、再起動する必要があるため、メッセージに従い再起動を行ってください。
新しい仮想スイッチの作成
ブリッジ接続するために新しい仮想スイッチを作成していきます。
仮想スイッチマネージャー画面への遷移
検索ボックス等で「コントロールパネル」を開き、「システムとセキュリティ」→「Windowsツール」から「Hyper-Vマネージャー」を起動します。
上部バーか、ウィンドウ右の「操作」メニューから「仮想スイッチマネージャー」を選択。
デフォルトで作成されている仮想スイッチを見ると、以下のように接続の種類が「内部ネットワーク」でNAT
モードになっていることが確認できます。
WSL2
を使用する場合、何もしなければデフォルトの仮想スイッチを使用して外部と通信することになるため、外部と通信する際にはNAT
で通信することになり、また、接続の種類が内部ネットワークになっているため、外部のクライアントからの接続は行えないようになっています。
そのため、通常はWSL2
を動かしているWindows
ホストからしか接続できず、Windows
ホストから接続する際にもWindows
ホスト側でポートフォワーディングを行ってWSL2
側のサービスと紐付ける必要があったわけです。
以下より新たに外部からの接続が行えるように新しくスイッチを作成して設定していきます。
外部接続用仮想スイッチの作成
「新しい仮想ネットワークスイッチ」から「外部」を選択し、「仮想スイッチの作成」を選択します。
スイッチに適当な名前(今回はExternal Switch
)を入力し、接続の種類で「外部ネットワーク」、「ネットワークアダプターの共有を許可」にチェックを行い、「適用」→「OK」と選択します。
適用時、以下のようなポップアップが表示されたら、「はい」を選択します。
接続する仮想スイッチの変更
外部接続用の仮想スイッチは作成したので、WSL2
が使用している仮想スイッチをデフォルトの仮想スイッチから外部接続用の仮想スイッチに以下手順で切り替えます。
.wslconfigの作成
WSL2
が使用している仮想スイッチを切り替えるためにはネットワーク設定を書き込んだ.wslconfig
というファイルをメモ帳等で新たに作成してWindows
ホスト側の「C:¥Users¥[username]」配下に置く必要があります。
[wsl2]
networkingMode=bridged
vmSwitch="External Switch"
dhcp=true
ipv6=true
vmSwitch
は先程作成した外部接続用仮想スイッチの名前(今回はExternal Switch
)を入力してください。
Ubuntuの再起動
仮想スイッチの切り替えにはWSL2
で動かしている仮想マシンの再起動が必要となるため、PowerShell
でwsl -l -v
コマンドを実行し、Running
状態であれば、シャットダウンを行います。
> wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
シャットダウンするには、NAME
で表示されている名前(今回はUbuntu
)を指定すればOKです。
wsl --shutdown Ubuntu
シャットダウン後、WindowsターミナルからUbuntu
のウィンドウを立ち上げれば起動してきます。
IPアドレスの確認
仮想マシン起動後、仮想マシン側で外部ネットワークのアドレスが割り振られているかip a
等のコマンドで確認します。
$ 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
側は外部接続用仮想スイッチに接続を切り替えた構成になるため、イメージとしては以下のような接続となっています。
外部からの接続確認
外部接続用の仮想スイッチに繋いだことでWSL
を動作させているWindows
ホスト以外からも接続できるようになったので、別のクライアントから接続できるか確認してみます。
外部のクライアントでリモートデスクトップ接続を立ち上げ、「[IPアドレス]:13389」を指定して接続します。
なお、Windows
ホスト側でファイアウォール等の設定を行っている場合はあらかじめ許可しておきましょう。
Windows
ホストで接続したときと同様に接続できれば成功です。
なお、ブリッジ接続を行ったことでWSL2
の仮想マシンに外部IPアドレスが割り振られて、直接外部から接続できるようになったことから、リモートデスクトップ接続時のポート番号を分ける必要がなくなったので、13389
ポートに変更していたポート番号は、デフォルトの3389
ポートに戻してもOKです。
おわりに
WSL2
の仮想マシンに外部から接続するという需要があるかはともかく、手元のPCで手軽に設定できるのでちょっとしたテストを行うのに便利だと思いました。