WSL2版Podman.exeのWebアプリにスマートフォンや他のPCからアクセスするには

Windows 10 PCへ、WSL2に対応したPodman.exeをインストールして。

Nextcloudを動かしてみました。

スマートフォンからアクセスできるように。

PC起動後、Podmanマシンとポッドを起動、ポートフォワーディングとファイアウォール設定を行う手順を記録しておこうと思います。


Windows版Podman.exeインストール手順はこちら

Podman.exeのインストール手順はこちらです。

Podman.exeをインストール、ベアメタルであるFedora 36を初期化しました。

ポッドはNextcloudで試してみました。

アクセスに使用するURLですが、localhostと127.0.0.1はOKですが、192.168・・・はブロックされてしまいます。

しかし、WSL1の頃と異なり、WSL2では他のPCからアクセスはできません。

その解決のため、まずはベアメタルであるPodmanマシンのIPアドレスを調べてみました。


Podman.exeのPodmanマシンのIPアドレスの調べ方はこちら

こちらの記事で作成した、podmanマシン内部の/proc/net/fib_trieファイルから抽出したIPアドレスを使用します。

このIPアドレス抽出コマンドを使用して、追ってPodmanマシンとポッド起動用のバッチファイルを作成したいと思います。


Windows PC再起動後に行うべきことは3つ

Podmanのポッドですが。Windows PCをシャットダウンすると、停止状態になります。

Windows PCを起動しても、ポッドは自動起動しないようです。

このため、再起動後にポッドを起動し、さらにスマートフォンや外部のPCからポッドの中で動かしているWebアプリにアクセスできるよう、次の3つを行うバッチファイルを作成しました。

  1. Podman.exeのマシンとポッドを起動する
  2. マシンのIPアドレスを調べ、ポートフォワードを設定する
  3. ポットで使用しているTCPポートのファイアウォールを解除する

必要があればWindows PCに静的IPアドレスを割り当て

この記事の最後では、Windows PCのIPアドレスを使って、ポッドの中で動かしているWebアプリにアクセスできるようになります。

よって、必要な場合、Windows PCのIPアドレスを静的なアドレスに変更しておいて下さい。

VPN等の別のネットワークセグメントからアクセスしたい場合は、基本的に静的IPアドレスが必要です。

同一セグメントのネットワーク内のみ使用する場合、さらにmDNSに対応したPC(Windows 10、iPhone、iPad及びAvahiをインストールしたLinux)の場合、ホスト名.localでアクセスが可能のため、動的IPアドレスでも大丈夫です。


Podman.exeのポッド起動・ポートフォワード有効化バッチファイル

以上の材料から。

いよいよバッチファイルを作成したいと思います。

※22.11.25修正:IPアドレスを取り出す構文に不具合がありましたので修正しました。不具合の内容:IPアドレスが0で終わる場合、正しく取り出せませんでした。構文に\.を追加しました。

※22.12.8追記:ファイアウォールのルールが無限に追加されてしまうため、ルールが存在するか判定するIF文を追加しました。

rem podmanマシン起動
podman machine start

rem podmanマシンのIPアドレス取得
FOR /F %%i in ('podman.exe machine ssh "cat /proc/net/fib_trie | sed -e 's/^[ \-\|\+]*[ \-]*//' | grep '[\d]*\.' |grep -v -e '0.0.0.0' -e '^127\.[\d]*' -e '\/' -e '0$' -e '255$'"') DO set IPADR=%%i

rem ポッド起動
set pod=nc-pod
podman pod start %pod%

rem ポートフォワード
set PTNB=8090
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=%PTNB% connectaddress=%IPADR% connectport=%PTNB%

rem 受信ルール
netsh advfirewall firewall show rule name= "TCP %PTNB%" dir=in
IF %ERRORLEVEL% GEQ 1 (
netsh advfirewall firewall add rule name= "TCP %PTNB%" dir=in action=allow protocol=TCP localport=%PTNB%
)

rem 送信ルール
netsh advfirewall firewall show rule name= "TCP %PTNB%" dir=out
IF %ERRORLEVEL% GEQ 1 (
netsh advfirewall firewall add rule name= "TCP %PTNB%" dir=out action=allow protocol=TCP localport=%PTNB%
)

必要に応じて、次の3つを変更して下さい。

  1. 起動するポッド名nc-pod
  2. ポート番号8090
  3. 最終行のpauseで一時停止

ファイル名は「start_wsl_portforward.bat」にしてみました。

実行は、ファイルを右クリックして「管理者として実行」を選択します。

PCの再起動後、ポッドを使いたい場合、バッチファイルを管理者として実行する、という使い方になります。

実行結果の確認のため、バッチファイルの最終行に「pause」を入れて一時停止させています。

実行結果は次のような流れです。

  1. Podmanマシンを起動
  2. nc-podポッドを起動
  3. FOR構文でマシンからIPアドレスを抽出し、環境変数IPADRにセット
  4. netsh interfaceでポートフォワードを有効化
  5. netsh advfirewallで該当のTCPポート番号を開放

実行完了後、他のPCやスマートフォンから該当のTCPポートにアクセスできるようになります。

Webアプリによっては、アプリ側の設定を調整しないと、他のPCからアクセスできない場合もあります。

Nextcloudのログイン画面ではなく警告が表示されているのは、Nextcloudコンテナ内の設定の問題になります。詳細はこちらになります。


TCPポートフォワードの設定値の確認

設定したTCPポートフォワードの状態は、下記のコマンドで確認できるようです。

netsh interface portproxy show v4tov4

左側リッスンアドレス(0.0.0.0)・リッスンポート(8090)に着信したIPv4パケットを

右側コネクションアドレス(172.26.31.56)・コネクションポート(8090)

に転送する内容です。

コネクションアドレス(172.26.31.56)は、Podman.exeのマシンのIPアドレスです。正しく値が抽出されているようです。


まあ正しい方法であるかは、正直よくわからないのですが。

以上で、WSL2版Podman.exeで構築したポッドに、スマートフォンや他のPCからアクセスできるようになりました。

Podman.exeのマシンに割り当てるIPアドレスを静的にすれば、もっと簡単では?と思いましたが、どうもそれは難しいようです。

これはPodman.exeの問題ではなく、WSL側の問題で、クローズしていない状況です。※22.10.27現在

Podman.exeに限らず、WSL2を使用したVM・・・UbuntuやOracle Linux等のディストリビューションすべて、動的な毎回変わるIPアドレスが割り当てられているのだと思います。

動的にVMを管理する仕組みの影響なのか、ビジネス上の戦略なのかは不明です・・・(憶測

さて。次回はポッドのバックアップやリストアをどうするか、そのあたりを調べてみたいと思います。

ではまたお会いしましょう。

スポンサーリンク

フォローする

スポンサーリンク