🌉

WSL2 で外部からアクセス可能にするために bridge mode を有効にする

2023/02/27に公開
1

最新の WSL2 ではネットワークのブリッジモードがサポートされており、有効化するとホストである Windows へのポートフォワードはそのままに、外部へ直接接続する(ルータから DHCP で IP を振り分けてもらえる)ようになり、つまり LAN からアクセス可能となる。
ただしこの方法は現在 Professional Edition でないと動作しない
(Hyper-V を操作する必要がある。Hyper-V 無しでもブリッジの設定ができるようになると、 Home でも動作すると思われる。

手順

  1. Hyper-V で外部との通信用の仮想スイッチを作成する

WSL を有効化した際に標準で存在するスイッチはいずれも ホスト(Windows) <-> ゲスト(WSL) の通信のためのものであるため、外部と通信する仮想スイッチを設定する。
仮想スイッチマネージャを開き、新しい仮想ネットワークスイッチを作成する。 接続の種類 から外部ネットワークを選択し、 NIC を選択する。(複数の NIC を使う場合は NIC ごとに設定が必要と思われる)
よくわからない場合は、有線と思われるものを選択することを推奨する。(Wi-Fi の場合接続が不安定になるという報告を見た)

  1. ホストの ~/.wslconfig に設定を追記する

以下のように設定を書く。
vmSwitch の欄は先程設定した仮想スイッチの名前を指定する。

~/.wslconfig
[wsl2]
networkingMode=bridged
vmSwitch=External
dhcp=true

余談だが、ここに ipv6=true を指定すると ipv6 が使用できる。

  1. WSL を再起動する

ゲストマシンの再起動ではなく WSL2 の機構自体を再起動するため、ホスト側で wsl.exe --shutdown を実行する。
続けて wsl.exe を実行すると WSL2 が立ち上がる。
普段使いのターミナルからも起動できるが、エラー時にメッセージが出る場合があるため、疎通確認時はホストのターミナルから起動することを推奨する。

  1. 疎通確認をする

ゲストから LAN やインターネットへ、ホストや LAN からゲストへの疎通を確認する。

$ ping <default gateway の IP>
$ ping 8.8.8.8
$ ping google.com

default gateway の IP は、ホストで ipconfig をすることで確認できる。よくわからない場合、 192.168.0.110.0.0.1 であることが多いと思われるのでそれを試して欲しい。
DNS の設定をしていない場合 (自動生成にしていた場合)、 /etc/resolv.conf の自動生成を無効化し、設定を記述する必要がある。

/etc/wsl.conf
[network]
generateResolvConf=false
/etc/resolv.conf
nameserver 8.8.8.8

続いて、ゲストで適当なサーバを立ち上げホストや LAN からの疎通確認を行う。
何かしらのアプリケーションがある場合それでも良いが、外部からの接続の場合は bind 対象を localhost ではなく 0.0.0.0 にする必要がある。
よくわからない場合、 python -m http.server 8000 とすることを推奨する。
ホストからは http://localhost:8000 でアクセスできる。

ゲストの IP がただしく DHCP で振り分けられている場合、 ip a により確認できるネットワーク内の eth0 に ipv4 が割り当てられているはずである。
LAN 内の別マシンやスマートフォン等から http://<ゲストの ipv4>:8000 へアクセスし、疎通が確認できれば完了となる。

参考

https://qiita.com/shigeokamoto/items/6ee87229dda7c3f41765
https://qiita.com/shigeokamoto/items/6a79cd47a65bf2ab7b1e

Discussion