WSL1の時は、特に設定は必要なく。
WSLを動かしているPC(WSLホスト)のTCPポートに接続すると、普通にサービスにアクセスできましたね。
WSL2は、WSLホストのlocalhostや127.0.0.1ではアクセス可能なのですが、他のPCからアクセスすると弾かれてしまいます。
WSL2でもアクセス可能になる設定手順を記録しておこうと思います。
※22.10.27追記:
WSL2版Podman.exeの場合、こちらのバッチファイルで、ポッドの起動・ポートフォワード・ファイアウォールの開放が可能になりました。
以下、Ubuntuの場合の例になります。
目次
WSL2で構築したネットワーク・アプリの他PCアクセス設定手順
ずばり。こちらの記事になります。
その前に、少し状況を整理しておきたいと思います。
WSLホストPC側のvEthernetネットワークの確認
前提条件ですが。
このような形で、WSLホストPCにvEthernetが存在し、使用できる状況であることが前提です。上図では、「172.19.16.1」というIPアドレスが割り当てられています。
これは、WSLホスト(Windows PC)側のIPアドレスになります。
スマホや他のPCから、WSLゲストへアクセスする場合、Wi-FiやLANケーブルを通じてWSLホストPCへパケットが入ってきます。
おうちLAN等では、192.168.xxx.xxxのようなIPアドレスが一般的かと思います。
この192.168.xxx.xxxに入ってきたパケットが、172.19.16.xxxのvEthernetにルーティングされま・・・され・・・され?・・・されてないから問題なのでしょうね。
アクセスできない原因がわかったところで、具体的に設定を進めたいと思います。
WSLゲスト側のvEthernetネットワークのIPアドレスを調べる
まずは、公開したいWSLゲスト(Ubuntu等)のIPアドレスを調べておきます。
少し古めのUbuntu 20.04での実行例ですが、次のコマンドでIPアドレスを調べます。
ip addr
上図では、「172.19.19.51」というIPアドレスが割り当てられている状況です。
実は、このIPアドレスが毎回変わるのが問題で・・・というのは後で。
今、WSLを再起動するまでは、このIPアドレスである、という意味になります。
※22.10.27追記:
WSL2のゲストOSのIPアドレスを調べるコマンドを作ってみました。
「/proc/net/fib_trieファイルからIPアドレスを得る」コマンドは、Ubuntuでも実行可能です。
WSLゲスト側の公開したいサービスのポート番号を調べる
たとえばWordPressやNextCloud等のネットワーク・アプリを、aptコマンドでネイティブに構築/snap/Docker/podman等のコンテナ化等で構築するかと思います。
podmanで構築する場合、こちらの手順になります。
たとえば上記リンクの中のNextcloudは、TCPポート番号8081で動かしています。
このように、TCP/UDPのポート番号いくつであるか、公開したいアプリケーションのポート番号を調べておきます。
外部から来たパケットをルーティングする設定
以上、公開したいWSLゲストのIPアドレスと、TCP/UDPのポート番号から、下記のコマンドを作成しておきます。
netsh interface portproxy add v4tov4 listenport=<ポート番号> listenaddress=0.0.0.0 connectport=<ポート番号> connectaddress=<WSLゲストのIPアドレス>
あとはこちらを、管理者権限で実行します。
これでWSLホストPC側の準備が整いました。
スマホ(iPhone)からアクセスする場合、同一セグメントでしたら、次のようなURLでアクセスできました。
https://<ホスト名>.local:8081
ホスト名.localは、mDNSによる名前解決で、Windows同士やiPhone、iPad等で使用可能です。
Linuxの場合はavahiをインストールすると使用できるようになります。(よってAndroidで使用できるかどうかは、avahiの有無によります)
Windowsファイアウォールの設定変更
Windows Defenderファイアウォールの設定を変更しておきます。
wf.msc
受信の規則、送信の規則に、該当のポート番号を追加し、「許可」に設定しておきましょう。
ネットワーク・アプリケーション側の設定を確認
たとえば上述のNextcloudの場合、スマホからNextcloudにまだアクセスできません。
管理画面で下記のようなエラーが表示されます。
Nextcloudの場合、config.phpを編集し、アクセス可能なURLを追加する必要があります。
上記podmanで構築したNextcloudの場合、ポッド名はnc-pod、Webコンテナ名はnc-web、DBコンテナ名はnc-dbになります。
config.phpの編集は下記の流れになります。
# Webコンテナ内でbashを起動
sudo podman exec -ti nc-web bash
# テキストエディタをインストール
apt update
apt install vim -y
# config.phpを編集
vi config/config.php
アクセスエラーを確認する手段とまして、podmanで動かしたサービスは、podman logsコマンドでエラーログを表示して、何かアクセス制限がかかっていないかどうか、確認することが可能です。
Webコンテナのログを表示する場合、下記のコマンドになります。
sudo podman logs -f nc-web
ポッドのログは、すべてのコンテナのログを混ぜた内容になると思います。
こちらのログを見ながらアクセスしてみて、エラーログを参考に、アプリの設定を調整する感じでしょうか。
以上で、WSL2で構築したネットワーク・アプリに、外部のPCやスマホからアクセスできるようになりました。
しかし。
少しお話したように、WSL2ゲスト(たとえばUbuntu)のIPアドレスが変わるのですよね・・・これはゲスト側のIPアドレスの取得方法の問題と思いますので、ゲスト側で工夫が必要なのかなと思います。(推測で恐縮ですが
まあ設定は不完全ながら、技術的にはWindows 11 + WSL2 + PodmanでNextcloudやWordpressを構築して、スマホからアクセスできるようになりました。
よろしければお試しくださいませ!