WSLに構築したサーバへ外部の端末からアクセスする。

結論からいえば、ホストのWindowsのアドレスとポートへのアクセスをWSLのアドレスとポートを指定して、ポートフォワーディングすればよい。(する必要がある)

ここでは、ホストのWindowsのポート3000をWSL上のポート3000にポートフォワーディングするとする。

  1. cmdを立ち上げてipconfigを実行し、ホストのIPアドレスを確認する。
イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: xxxx
   IPv4 アドレス . . . . . . . . . . . .: 192.168.xxx.1

   サブネット マスク . . . . . . . . . .: 255.255.xxx.xxx
   デフォルト ゲートウェイ . . . . . . .:

(中略)

Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .: lan
   リンクローカル IPv6 アドレス. . . . .: yyyy
   IPv4 アドレス . . . . . . . . . . . .: 192.168.yyy.yyy
   サブネット マスク . . . . . . . . . .: 255.255.yyy.0
   デフォルト ゲートウェイ . . . . . . .: 192.168.yyy.255

Wi-FiでLANに接続している場合、WSLのIPではなくて、Wi-Fiの方のIPv4192.168.yyy.yyyが(外部から見た)ホストのIPアドレス

  1. WSLでifconfigを実行して、WSLのIPを確認する。
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.yyy.yyy netmask 255.255.yyy.0  broadcast 192.168.yyy.255
(略)

この例の場合、inet 192.168.yyy.yyyがWSLのIP。

  1. ポートフォワーディングを設定する。

cmdから以下を実行すれば設定できる。転送元、転送先のポートに特権ポート(1024未満のポート)を設定する場合はほかにも設定がいるかもしれない。

netsh.exe interface portproxy add v4tov4 listenaddress=<ホストのIP> listenport=3000 connectaddress=<WSLのIP> connectport=3000

設定状況は以下で確認できる。

netsh.exe interface portproxy show v4tov4

以下のような感じ。

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
<ホストのIP>   80          <WSLのIP>   3000

ホストのWindowsのブラウザから、ホストのIPをたたいて、WSLに接続できればポートフォワーディングの設定はできているといえる。 設定していないときには、WSLのサーバにはlocalhost127.0.0.1などでないとアクセスできないので。

  1. ホストのファイアーウォールで、転送したいポートへのアクセスを許可するように設定する。

外部のマシンからアクセスするには、ホストのWindowsFirewallでポートも開けておかないといけない。

(この説明は省略。)

手順は以上。

ポートフォワーディングの設定は再起動しても残る。 だが、ホストのWindowsDHCPでLANに接続している場合は、接続の度にIPが変わるので、再設定が必要。

設定削除は以下。

netsh.exe interface portproxy delete v4tov4 listenaddress=<ホストのipアドレス> listenport=3000