アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

WSL2へ外部PCからアクセスする

※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アドレス

f:id:matsudamper:20200416043145p:plain
「172.17.135.117」 でWSL2に接続できます。
このインターフェースのIPv6アドレスでも接続できます。

Windows側から見えるIPアドレス

f:id:matsudamper:20200416043208p:plain
「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」でも接続できませんでした。

WindowsIPv6

WindowsIPv6アドレスを使用してアクセスするとESETにこのようなログがありました

ポートでリスンしているアプリケーションはありません

上記の通り、WSL2をホストしているWindowsIPv6アドレスを入力してもフォワーディングしてくれなかったのでこれは納得です。

それではWSL2側から見られたIPv6アドレスではどうでしょう、これはホストしているWindows側からはアクセスできました。

結果は、接続できない上に、そもそもESETにログすら残っていませんでした。これはホストしているWindowsの内部にWSL2は居るので、見つけられなかったのではと考えています。

WindowsIPv4

WindowsIPv4アドレスでアクセスした場合は何故繋がらなかったのでしょうか。

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からアクセスするという目的は達成しましたが、WindowsLinuxやWSL、IPやIPv6についての深い知識があるわけでは無いので、間違いや詳細がわかる方はブログを書くかコメントで指摘を貰えると非常に助かります。

参考文献