跳板机:多跳 SSH

创建三台虚拟机,在 Mac 上通过两台 SSH 跳板机连接目标服务器。

执行前须知

请在独立的测试环境中操作,将示例 IP 替换为虚拟机的实际地址。首次信任 SSH 主机密钥前,通过 Multipass 核对指纹。ProxyJump 由 Mac 分别向各跳进行身份验证,无需在跳板机上创建私钥。跳板机必须允许 TCP 转发,并能访问下一跳。修改防火墙规则前,请保留可用于恢复的会话。

使用示例

安装 Multipass,创建三台 Ubuntu 虚拟机,并记录它们的实际 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

将以下条目添加到 Mac 的 ~/.ssh/config,填入实际虚拟机 IP。保留现有配置,并将这些条目放在匹配的 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 的 IP,且现有 UFW 策略允许 SSH 时,先允许 jump2,再拒绝 Mac 的实际来源 IP。替换两个占位符;不要据此更改生产防火墙。保留控制台访问,并在测试后删除规则。

# 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 日