WSL2 に外部からアクセスする
WSL2 内に建てた sshd や Webサーバには WindowsホストからIPアドレスなら 127.0.0.1、ホスト名なら localhost で到達することができます。しかし、Webサーバを開発しているなら外部から WSL2 の中に接続したいこともあると思います。しかし、WSL2 のネットワークはホストWindowsマシンのネットワークとは切り離されています。したがって、外部のPCからWindowsに接続しても、普通にはWSL2の中にまで接続されません。そこで、WindowsからWSL2にポートフォワードしておくアプローチが取られます。
IPを知る
ポートフォワードするためにWSL2のIPが必要ですね。
WSL2のIP
WSL2のシェルで ifconfig
コマンドを打ちます。
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.28.86.85 netmask 255.255.240.0 broadcast 172.28.95.255
このIPはWSL2が起動されるたびに変わります。
ポートフォワードする
シェルを管理者権限で起動する
WindowsホストからWSL2にポートフォワードするには管理者権限で起動したシェルが必要です。
シェルを管理者権限で起動するには、シェルアイコンを選択した状態で Ctrl + Shift + Enter を押して起動するか、以下の手順でショートカットを押すと起動できます。
- Windowsキー + X
- A キー
WindowsホストからWSL2にポートフォワード
以下のようなコマンドを打つ。port/IP/Hostは適宜変更する。
$ netsh.exe interface portproxy add v4tov4 listenaddress=* listenport=22 connectaddress=172.28.86.85 connectport=22
ポートフォワードされていることの確認。
$ netsh interface portproxy show all
Listen on ipv4: Connect to ipv4:
Address Port Address Port
--------------- ---------- --------------- ----------
* 22 172.28.86.85 22
ポートフォワードの停止
$ netsh interface portproxy delete v4tov4 listenport=22 listenaddress=*
IP Helper の起動
ブート時にiphlpsvc起動
$ sc.exe config iphlpsvc start=auto
[SC] ChangeServiceConfig SUCCESS
単なるiphlpsvcの起動
$ sc.exe start iphlpsvc
Windowsファイアウォールの設定
おそらく、デフォルトでは Port:22 が疎通できないと思われるので、以下のコマンドで開放する。
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP
このコマンドも管理者権限で起動したシェルである必要がある。 設定した内容は、GUI Windows Defender ファイアウォールの詳細設定などでも参照、編集が可能です。
ルータからWindows PCまでの経路設定
外部から22番ポートへのアクセスがグローバルIPに流れてきた後、ルータから先のルーティングをルータで設定する必要がある。これはルータによって異なるが、例えばBuffalo製品だと ポート変換
というメニューでインターネットから来たIPをWindows PCのプライベートIPに流すように設定すれば良い。ポート変換というメニュー名であっても、ポート番号が変わらないといけないわけではなく、インターネット側の22に来たものをWindows PCの同じ22に流すように設定すれば良い。(ちなみに、DMZ
にしたり、IPフィルター
で22番ポートを通過する設定が必要に思えるかもしれないが、ポート変換以外は必要ない。)
Windows 10での疎通確認
外部からWSL2のsshdなりwebサーバに到達するまでに、ホストPCを経由するわけですが、Windows 10で通信を見るアプリと言えば、やっぱりwiresharkです。便利。