💬

WSL2上のリモートPodmanにWindowsから接続: ポッドマンが倒せない(2)

2022/01/31に公開

お前の公開鍵はもう古い

テレッテレーレー

関連記事:
WSLにDocker代替のPodmanを入れてみる: ポッドマンが倒せない(1)
Distrodを使ってWSLでsystemdを動かす

------------------- ↓ 本題はここから ↓-------------------

前回の記事でWSL上にPodmanをインストールした。
dockerコマンドと互換があるので、
使い勝手に申し分はない。

ただ、Docker Desktopの代替となると、
Windowsや他のWSL上から接続して、
Linux側にログインしなくても使えるようにして置きたい。

Podmanはデーモンレスが売りの一つ。
dockerdやcontainerdのようなサーバーが必要ないということだ。
それからルートレス動作も魅力の一つ。

ルートレスでデーモンレスとなると、
障害に対して強くなる半面、
イメージやコンテナ管理は個人アカウントの管理となるので、
シェアするのは逆に難しくなる。

Linux同士を接続する方法がどうにもなさそうなので、
メインで使ってるOSに追加で載せる方向にする。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

Hubサーバーの準備

LinuxOS上にSSHDをインストールして、
SSH経由でコンテナをシェアする。
通常のLinuxであればSSHDを入れるだけでいいのだが、
WSLとなるとsystemdを稼働させる必要がある。

WSLゲストOSにアカウントを用意

Distrodを使ってsystemdを設置しハブ用アカウントを用意。
本稿では新規にOSインストールしているが、
既存のOS利用の場合は以下を参照のこと

Distrodを使ってWSLでsystemdを動かす

distrod_wsl_launcherを使ってゲストOSをインストールする。
Dist名を podman とすると。

powershell
distrod_wsl_launcher -d podman

今回はFedora35を選択。
(Podmanの開発はRedHadだし)
アカウント名を airman とする。
パッケージを最新版に変更

sudo dnf upgrade -y

systemdを有効にしておく

sudo /opt/distrod/bin/distrod enable

SSHDをインストール

特定アカウントへの接続はSSHとなるので、
SSHDは必要になる。
公開鍵認証が有効かどうかを確認しておく。

sudo dnf install -y openssh-server
echo 'port 2222' | sudo tee -a /etc/ssh/sshd_config.d/port.conf
sudo systemctl enable --now sshd
sudo sshd -T | grep -E "pub|pass|port"
  port 2222
  pubkeyauthentication yes
  passwordauthentication yes

Podmanのインストール

サーバーの用意ができたのでPodmanを入れる
パーミッションも調整が必要なので追加で実行

sudo dnf install -y shadow-utils podman
sudo chmod u+s $(which newuidmap)
sudo chmod u+s $(which newgidmap)
podman info
  arch: amd64
  buildahVersion: 1.23.1
  ・・・
podman pull busybox  

Podmanをsystemdに登録

sudo loginctl enable-linger $(id -un)
echo 'XDG_RUNTIME_DIR=/run/user/'$(id -u) | tee -a .bashrc
systemctl --user enable --now podman

これでHUBサーバのできあがり

(-。-)y-゜゜゜ 簡単ですね

クライアントのインストール

windows側、他のWSL側から接続するため各環境にPodmanをインストールする。
Linux版はインストール方法は以前の記事と同じなのでそちらを参照。
こちらではWindows用について記述する

アプリインストーラー(winget)を使ってPodmanをインストール

winget install RedHat.Podman

公開鍵を作成

Windows10にいつの間にかopensshがインストールされていた。
C:\Windows\System32\OpenSSH これがない人は別途インストールが必要かもしれない。

ssh-keygen -t ed25519
podman system connection add podman --identity ~\.ssh\id_ed25519 ssh://airman@localhost:2222/run/user/100
0/podman/podman.sock
podman info
host:
  arch: amd64
  buildahVersion: 1.23.1
  ・・・
  remoteSocket:
    exists: true
    path: /run/user/1000/podman/podman.sock
podman images
  REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
  docker.io/library/busybox  latest      beae173ccac6  16 hours ago  1.46 MB

------------------- ↓ 後書きはここから ↓-------------------

途中まではスムーズだったけど、
SSH接続で詰まって、
結局時間を使いまくった。
本当はpodmanのHUBをWindows側に持たせたかったけど、
Windows版のPodmanにはクライアントの機能しかないっぽいので、
今後のバージョンアップに期待・・・Redhatだから無理か。

トラブルシューティング

Windows再起動するとIPが変わってしまう

環境を整備して運用始めようとしたときに、
PCを再起動したら接続ができなくなった。
もちろんip調べて再接続すればいけるんだが。

調べてみるとSSH-Agentを立てて、
WSLとWindowsを橋渡しするツールを仕込む方法があるっぽいが。。。

('Д') メンドクセ

WSL2にはlocalhostでWebにアクセスすることができるようになった。
ならばSSHでもいけるんじゃね?
試してみると

ssh airman@localhost -p 2222
The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established.
ECDSA key fingerprint is SHA256:X1o3J37OnDe1cKpdVjkf3H/tEVvAwZc8mrlcIi06Vl0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ECDSA) to the list of known hosts.
Last login: Sat Jan  1 09:05:24 2022 from 172.29.208.1

なんか行けそうだわ。
たぶんポート22とか80とか3桁以内じゃなければ通るんだと思うので、
ポートを2222とか10022とか適当設定すればいい。

ポートを 2222 とすると

WSL側
echo 'port 2222' | sudo tee -a /etc/ssh/sshd_config.d/port.conf
sudo systemctl restart sshd
sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
     ・・・・
  Jan 01 08:59:25 WARDOG sshd[412]: Server listening on 0.0.0.0 port 2222.
  Jan 01 08:59:25 WARDOG sshd[412]: Server listening on :: port 2222.

ポートが2222に変わったのを確認

Windows側
podman system connection add podman --identity ~\.ssh\id_ed25519 ssh://airman@localhost:2222/run/user/1000/podman/
podman.sock
podman images
  REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
  docker.io/library/busybox  latest      beae173ccac6  29 hours ago  1.46 MB

('ω')ノ通ったよー

認証が通らない

windowsクライアントを設置して、
コネクション設定をして情報を取ろうとすると
以下のようなエラーが発生。

podman.exe system connection add podman --identity ~\.ssh\id_rsa ssh://airman@172.20.243.205/run/user/1000/podman/
podman.sock
podman.exe info
Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM
Error: unable to connect to Podman. failed to create sshClient: Connection to bastion host (ssh://airman@172.20.243.205:22/run/user/1000/podman/podman.sock) failed.: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

(゜-゜) 接続できてない?

試しに普通にssh接続してみる

ssh.exe airman@172.20.243.205
The authenticity of host '172.20.243.205 (172.20.243.205)' can't be established.
ECDSA key fingerprint is SHA256:X1o3J37OnDe1cKpdVjkf3H/tEVvAwZc8mrlcIi06Vl0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.20.243.205' (ECDSA) to the list of known hosts.
Last login: Fri Dec 31 20:20:16 2021 from 127.0.0.1

(@_@;) 接続できた。。。だと❗❓

普通にsshで接続すると問題なく接続できる。
あーだこーだ調べてみたが、
どうやら公開鍵が古すぎるようだ。
RSA は非対応になっていて ED25519 などにしておく必要がある。

ssh-keygen -t ed25519
 ~/.ssh/id_ed25519
 ~/.ssh/id_ed25519.pub

使い方は普通のカギと同じ。
公開鍵をリモート側の ~/.ssh/authorized_keys に登録する

Discussion