WSL2のためのポート・フォワーディング

WSL2でネットワークまわりが変わった。ローカル・ネットワークの他のコンピューターから、WSL2の仮想マシンで立てたウェブサーバーへ気軽にアクセスしようとすると、ポート・フォワーディングを設定しなくてはならない。WSL2でUbuntuを使っているなら、hostnameコマンドを使うとIPアドレスだけがわかるので、これとnetsh interface portproxyコマンドを使って、バッチファイルを書く。

@echo off

for /f "tokens=* usebackq" %%F in (`wsl --distribution Ubuntu --exec hostname --all-ip-addresses`) do set IP=%%F
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=%IP%

このバッチファイルを管理者権限で実行すると設定される。WSL2をホストしているコンピューターのローカル・ネットワークでのIPアドレスが192.168.11.11とすると、他のコンピューターから192.168.11.11:8080へのアクセスが、Ubuntu仮想マシン上で動いている(8080で待機している)ウェブサーバーに届く。

Windows 10では、Windows Defenderファイアウォールという別の問題もきっとある。初回アクセス時に聞かれるんじゃないかと思う。


netsh interface portproxyコマンドのaddやremoveは要管理者権限なので、バッチファイルの実行にもちょっとだけ工夫が必要になる。まともにやるとするなら、バッチファイルを右クリックして「管理者として実行」を選択する。僕はnircmdのelavateサブコマンドを使ってWindows Terminalから実行しているが、まったくおすすめはしない。

スタート・メニューからportforwarding.batを探した結果

スタート・メニューの検索機能を利用するのが安全だと思う。バッチファイルを検索パスの通ったところに置いておくと、スタート・メニューからファイル名で検索できるようになる。スタート・メニューの検索結果では、スクリーンショットのように「管理者として実行」が出てくる。→↓とキーを押せばキーボードだけで選択でき、そこそこ手軽に実行できる。