ジャンプホスト: マルチホップ SSH

3 つの VM ラボを構築し、Mac から 2 つの SSH ジャンプ ホストを介してターゲットに接続します。

実行前の確認

プライベート テスト環境を使用します。サンプルの IP アドレスを実際の VM アドレスに置き換えます。各 SSH ホスト キーを信頼する前に、Multipass を通じて検証してください。 ProxyJump は Mac からの各ホップを認証します。ジャンプ ホストに秘密キーは必要ありません。ジャンプ ホストは TCP 転送を許可する必要があり、各ホップが次のホップに到達できる必要があります。ファイアウォール ルールを変更する前に、回復セッションを利用できるようにしてください。

使用例

Multipass をインストールし、3 つの Ubuntu VM を作成し、実際の IP アドレスを記録します。

brew install --cask multipass
multipass launch --name jump1
multipass launch --name jump2
multipass launch --name target
multipass list

Mac 上で専用のキーを作成します。パスフレーズを選択し、既存のキーを上書きしないでください。

ssh-keygen -t ed25519 -f ~/.ssh/securepipes_lab_ed25519

公開キーのみを各 VM にコピーします。これらのコマンドは、各 Ubuntu ホーム ディレクトリに一時ファイル securepipes-lab.pub を作成します。実行する前に、それがまだ存在しないことを確認してください。

for vm in jump1 jump2 target; do
  multipass exec "$vm" -- test ! -e /home/ubuntu/securepipes-lab.pub || break
  multipass transfer ~/.ssh/securepipes_lab_ed25519.pub "${vm}:/home/ubuntu/securepipes-lab.pub" || break
  multipass exec "$vm" -- sh -c 'umask 077; mkdir -p "$HOME/.ssh"; chmod 700 "$HOME/.ssh"; cat "$HOME/securepipes-lab.pub" >> "$HOME/.ssh/authorized_keys" && chmod 600 "$HOME/.ssh/authorized_keys" && rm "$HOME/securepipes-lab.pub"' || break
done

公開キーのフィンガープリントをインストールされているキーと比較します。 authorized_keys ファイルには他のキーも含まれる場合があります。

ssh-keygen -lf ~/.ssh/securepipes_lab_ed25519.pub
multipass exec jump1 -- ssh-keygen -lf /home/ubuntu/.ssh/authorized_keys
multipass exec jump2 -- ssh-keygen -lf /home/ubuntu/.ssh/authorized_keys
multipass exec target -- ssh-keygen -lf /home/ubuntu/.ssh/authorized_keys

マルチパスを通じて各サーバーのホスト キーのフィンガープリントを取得します。新しいホスト キーを受け入れる前に、SSH によって表示されるフィンガープリントと比較します。

multipass exec jump1 -- sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
multipass exec jump2 -- sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
multipass exec target -- sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

実際の VM IP を使用して、これらのエントリを Mac の ~/.ssh/config に追加します。既存のエントリを保持します。これらを、一致する Host * デフォルトの前に配置します。別のキー パスを選択した場合は、IdentityFile を調整します。

Host jump1
  HostName 192.168.252.2
  User ubuntu
  IdentityFile ~/.ssh/securepipes_lab_ed25519
  IdentitiesOnly yes

Host jump2
  HostName 192.168.252.3
  User ubuntu
  IdentityFile ~/.ssh/securepipes_lab_ed25519
  IdentitiesOnly yes

Host target
  HostName 192.168.252.4
  User ubuntu
  IdentityFile ~/.ssh/securepipes_lab_ed25519
  IdentitiesOnly yes

まず直接アクセスをテストしてから、両方のジャンプ ホスト経由で接続します。ホスト キーは、指紋を検証した後にのみ受け入れてください。 Secure Pipes で、ターゲット接続用に同じ 2 つのジャンプ ホストを順番に設定します。

ssh jump1
ssh jump2
ssh target
ssh -J jump1,jump2 target

オプションの管理されたラボ テスト: ターゲットが Mac ソース IP を Jump2 と区別でき、既存の UFW ポリシーで SSH が許可されている場合にのみ、実際の Mac ソース IP を拒否する前に Jump2 を許可します。両方のプレースホルダーを置き換えます。この例に基づいて運用ファイアウォールを有効にしたり変更したりしないでください。コンソールへのアクセスを維持し、テスト後にルールを削除します。

# On the target VM, replace the placeholders first:
sudo ufw status numbered
sudo ufw insert 1 allow from <JUMP2_IP> to any port 22 proto tcp
sudo ufw insert 2 deny from <MAC_SOURCE_IP> to any port 22 proto tcp

オプションのファイアウォール ルールの後は、直接 SSH は失敗しますが、ProxyJump は成功します。同じ実際の IP アドレスを使用する 2 つのルールを削除し、アクセスを再度確認します。

ssh target
ssh -J jump1,jump2 target
# On target, remove the lab rules:
sudo ufw delete deny from <MAC_SOURCE_IP> to any port 22 proto tcp
sudo ufw delete allow from <JUMP2_IP> to any port 22 proto tcp

公式リファレンス

確認日:2026年10月27日