Host salto: SSH multi-hop

Costruisci un lab da tre VM e connettiti a una destinazione tramite due host jump SSH dal tuo Mac.

Prima di eseguire

Utilizza un ambiente di test privato. Sostituisci gli indirizzi IP di esempio con gli indirizzi VM effettivi. Verifica ciascuna chiave host SSH tramite Multipass prima di considerarla attendibile. ProxyJump autentica ogni salto dal tuo Mac; non richiede una chiave privata su un host di salto. Gli host di salto devono consentire l'inoltro TCP e ogni hop deve essere in grado di raggiungere quello successivo. Mantenere disponibile una sessione di ripristino prima di modificare le regole del firewall.

Esempi

Installa Multipass, crea tre VM Ubuntu e registra i loro indirizzi IP effettivi.

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

Crea una chiave dedicata sul Mac. Scegli una passphrase e non sovrascrivere una chiave esistente.

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

Copia solo la chiave pubblica su ciascuna VM. Questi comandi creano il file temporaneo securepipes-lab.pub in ciascuna directory home di Ubuntu; verificare che non esista già prima di eseguirli.

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

Confronta l'impronta digitale della tua chiave pubblica con le chiavi installate. Il file Authorized_keys può contenere anche altre chiavi.

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

Ottieni l'impronta digitale della chiave host di ciascun server tramite Multipass. Confrontala con l'impronta digitale mostrata da SSH prima di accettare una nuova chiave host.

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

Aggiungi queste voci a ~/.ssh/config sul tuo Mac utilizzando gli IP effettivi della VM. Conservare le voci esistenti; posizionali prima di qualsiasi valore predefinito Host * corrispondente. Modifica IdentityFile se hai scelto un altro percorso chiave.

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

Testare prima l'accesso diretto, quindi connettersi tramite entrambi gli host jump. Accettare una chiave host solo dopo aver verificato la sua impronta digitale. In Secure Pipes configurare gli stessi due host jump in ordine per la connessione di destinazione.

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

Test facoltativo di laboratorio controllato: solo se la destinazione è in grado di distinguere l'IP di origine del Mac da jump2 e una policy UFW esistente consente SSH, consentire jump2 prima di negare l'IP di origine del Mac effettivo. Sostituisci entrambi i segnaposto. Non abilitare o modificare un firewall di produzione in base a questo esempio; mantenere l'accesso alla console e rimuovere le regole dopo il test.

# 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

Dopo le regole firewall opzionali, SSH diretto dovrebbe fallire mentre ProxyJump ha esito positivo. Rimuovi le due regole utilizzando gli stessi indirizzi IP effettivi, quindi verifica nuovamente l'accesso.

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

Riferimenti ufficiali

Verificato il 27 ottobre 2026