結論からいえば、ホストのWindowsのアドレスとポートへのアクセスをWSLのアドレスとポートを指定して、ポートフォワーディングすればよい。(する必要がある)
ここでは、ホストのWindowsのポート3000をWSL上のポート3000にポートフォワーディングするとする。
- 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アドレス。
- 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。
- ポートフォワーディングを設定する。
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のサーバにはlocalhostや127.0.0.1などでないとアクセスできないので。
- ホストのファイアーウォールで、転送したいポートへのアクセスを許可するように設定する。
外部のマシンからアクセスするには、ホストのWindowsのFirewallでポートも開けておかないといけない。
(この説明は省略。)
手順は以上。
ポートフォワーディングの設定は再起動しても残る。 だが、ホストのWindowsがDHCPでLANに接続している場合は、接続の度にIPが変わるので、再設定が必要。
設定削除は以下。
netsh.exe interface portproxy delete v4tov4 listenaddress=<ホストのipアドレス> listenport=3000