※19041.207を使用しました。
WSL2へ外部PCからアクセスするのにかなり苦労しました。一つずつ挙動を追っていきます。
WSL1とWSL2のIPアドレス違い
WSL1ではWindowsと全く同じIPアドレスを持っていましたが、WSL2では違うIPアドレスを持つようになりました。ディストリビューションをexportしてimportして複製して使っていますが、WSL2なら全て同じIPアドレスを持っていました。
WSL2でlistenしたポートはWindows側でwslhost.exeがlistenして、WSL2側へポートフォワーディングしてくれます。
WSL2のIPアドレス
WSL2で立ち上げたサーバーにアクセスしてみました。(port:8080)
WSL2側から見えるIPアドレス
「172.17.135.117」 でWSL2に接続できます。
このインターフェースのIPv6アドレスでも接続できます。
Windows側から見えるIPアドレス
「172.17.128.1」でWSL2に接続できます。
しかし、このインターフェースのIPv6アドレスでは接続できません。
その他
「.wslconfig」で設定するとWSLへのポートフォワーディングを切ることができ、「localhost」でも「::1」でも接続できなくすることはできます。※未確認
因みに、全てpingは通りました。
別のPCからWSL2にアクセスする
※ファイアウォールの設定は完了しているものとする
自分はESETを使用して、そちらからアクセスできるようにしました。
プライベートネットワーク内の別のPCからWSL2へアクセスしようとした時に問題が発生しました。
IPv4のアドレスでもIPv6のアドレスでもWSL2で立ち上げたサーバーへアクセスできないのです。「IPv6 Address」でも「Temporary IPv6 Address」でも「Link-local IPv6 Address」でも接続できませんでした。
WindowsのIPv6
WindowsのIPv6アドレスを使用してアクセスするとESETにこのようなログがありました
ポートでリスンしているアプリケーションはありません
上記の通り、WSL2をホストしているWindowsのIPv6アドレスを入力してもフォワーディングしてくれなかったのでこれは納得です。
それではWSL2側から見られたIPv6アドレスではどうでしょう、これはホストしているWindows側からはアクセスできました。
結果は、接続できない上に、そもそもESETにログすら残っていませんでした。これはホストしているWindowsの内部にWSL2は居るので、見つけられなかったのではと考えています。
WindowsのIPv4
WindowsのIPv4アドレスでアクセスした場合は何故繋がらなかったのでしょうか。
127.0.0.1でWSL2にアクセスできなかった事と関係しているのではないかと考えています。
解決方法
IPv4でアクセスしたものをIPv6に変換してしまえば良いと考えました。「192.168.0.10」を「::1」に変換するのです。
以下のnetsh.exeコマンドを使用します。
https://matsudamper.hatenablog.com/entry/2020/04/16/022605
WSL2のIPv4にしても良いのですが、IPアドレスは毎回変わるので、IPv6の「::1」に転送してしまったほうが楽です。ポートは任意のポートを指定してください。
netsh interface portproxy add v4tov6 listenport=8080 connectaddress=::1 connectport=8080
netsh interface portproxy add v6tov6 listenaddress=[WindowsのIPv6 Address] listenport=8080 connectaddress=::1 connectport=8080
おわりに
外部PCからアクセスするという目的は達成しましたが、WindowsやLinuxやWSL、IPやIPv6についての深い知識があるわけでは無いので、間違いや詳細がわかる方はブログを書くかコメントで指摘を貰えると非常に助かります。
参考文献
- Windows Subsystem for Linux 2におけるネットワークの改良 https://ascii.jp/elem/000/001/909/1909920/