2020/11/21

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 を押して起動するか、以下の手順でショートカットを押すと起動できます。

  1. Windowsキー + X
  2. 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です。便利。

サイト内検索