跳轉主機:多跳 SSH

建造一個三虛擬機器實驗室,並透過 Mac 上的兩個 SSH 跳轉主機連接到目標。

執行前須知

使用私有測試環境。將範例 IP 位址替換為實際 VM 位址。在信任每個 SSH 主機金鑰之前,請透過 Multipass 驗證它。 ProxyJump 驗證來自 Mac 的每一跳;它不需要跳轉主機上的私鑰。跳轉主機必須允許 TCP 轉發,且每一跳必須能夠到達下一跳。在更改防火牆規則之前保持恢復會話可用。

使用範例

安裝Multipass,建立三個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

僅將公鑰複製到每個虛擬機器。這些命令在每個 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

透過Multipass取得每個伺服器主機金鑰指紋。在接受新的主機金鑰之前,請將其與 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中,為目標連線配置相同的兩個跳轉主機。

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位址的兩個規則,然後再次驗證存取。

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 日