WSL2 で外部からアクセス可能にするために bridge mode を有効にする
最新の WSL2 ではネットワークのブリッジモードがサポートされており、有効化するとホストである Windows へのポートフォワードはそのままに、外部へ直接接続する(ルータから DHCP で IP を振り分けてもらえる)ようになり、つまり LAN からアクセス可能となる。
ただしこの方法は現在 Professional Edition でないと動作しない。
(Hyper-V を操作する必要がある。Hyper-V 無しでもブリッジの設定ができるようになると、 Home でも動作すると思われる。
手順
- Hyper-V で外部との通信用の仮想スイッチを作成する
WSL を有効化した際に標準で存在するスイッチはいずれも ホスト(Windows) <-> ゲスト(WSL)
の通信のためのものであるため、外部と通信する仮想スイッチを設定する。
仮想スイッチマネージャを開き、新しい仮想ネットワークスイッチを作成する。 接続の種類
から外部ネットワークを選択し、 NIC を選択する。(複数の NIC を使う場合は NIC ごとに設定が必要と思われる)
よくわからない場合は、有線と思われるものを選択することを推奨する。(Wi-Fi の場合接続が不安定になるという報告を見た)
- ホストの
~/.wslconfig
に設定を追記する
以下のように設定を書く。
vmSwitch
の欄は先程設定した仮想スイッチの名前を指定する。
[wsl2]
networkingMode=bridged
vmSwitch=External
dhcp=true
余談だが、ここに ipv6=true
を指定すると ipv6 が使用できる。
- WSL を再起動する
ゲストマシンの再起動ではなく WSL2 の機構自体を再起動するため、ホスト側で wsl.exe --shutdown
を実行する。
続けて wsl.exe
を実行すると WSL2 が立ち上がる。
普段使いのターミナルからも起動できるが、エラー時にメッセージが出る場合があるため、疎通確認時はホストのターミナルから起動することを推奨する。
- 疎通確認をする
ゲストから LAN やインターネットへ、ホストや LAN からゲストへの疎通を確認する。
$ ping <default gateway の IP>
$ ping 8.8.8.8
$ ping google.com
default gateway の IP は、ホストで ipconfig
をすることで確認できる。よくわからない場合、 192.168.0.1
や 10.0.0.1
であることが多いと思われるのでそれを試して欲しい。
DNS の設定をしていない場合 (自動生成にしていた場合)、 /etc/resolv.conf
の自動生成を無効化し、設定を記述する必要がある。
[network]
generateResolvConf=false
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
へアクセスし、疎通が確認できれば完了となる。
参考
Discussion
大変わかりやすい解説をありがとうございます。
以下の方法でHyper-Vをインストールしたら、Windows11 homeでもWSL2がブリッジ接続できました。