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つを行うバッチファイルを作成しました。
- Podman.exeのマシンとポッドを起動する
- マシンのIPアドレスを調べ、ポートフォワードを設定する
- ポットで使用している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つを変更して下さい。
- 起動するポッド名nc-pod
- ポート番号8090
- 最終行のpauseで一時停止
ファイル名は「start_wsl_portforward.bat」にしてみました。
実行は、ファイルを右クリックして「管理者として実行」を選択します。
PCの再起動後、ポッドを使いたい場合、バッチファイルを管理者として実行する、という使い方になります。
実行結果の確認のため、バッチファイルの最終行に「pause」を入れて一時停止させています。
実行結果は次のような流れです。
- Podmanマシンを起動
- nc-podポッドを起動
- FOR構文でマシンからIPアドレスを抽出し、環境変数IPADRにセット
- netsh interfaceでポートフォワードを有効化
- 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を管理する仕組みの影響なのか、ビジネス上の戦略なのかは不明です・・・(憶測
さて。次回はポッドのバックアップやリストアをどうするか、そのあたりを調べてみたいと思います。
ではまたお会いしましょう。