Parecchi server di produzione non sono raggiungibili da internet, punto. Stanno su una rete privata, e l’unica porta è una macchina blindata che non fa nient’altro: il bastion, o jump host. Ti colleghi al bastion, e da lì al server che ti interessa davvero.
Da riga di comando è un problema risolto — una riga di configurazione ssh e te ne dimentichi. In un client grafico per il trasferimento file di solito non lo è, ed è il motivo per cui chi sta dietro un bastion finisce per fare tutto da terminale anche quando preferirebbe trascinare una cartella.
Cosa fa davvero ProxyJump
ProxyJump dice a SSH: prima di parlare con la destinazione, apri una connessione verso quest’altro host e passa attraverso di lui. SSH apre una sessione verso il bastion, gli chiede di inoltrare una connessione TCP verso la porta 22 della destinazione, e poi esegue un handshake SSH del tutto normale con la destinazione dentro quel tunnel.
La conseguenza importante è che il bastion non vede mai il tuo traffico in chiaro. Inoltra byte cifrati. La tua autenticazione con la destinazione, e la host key della destinazione, vengono negoziate da un capo all’altro — il bastion è un tubo, non un uomo nel mezzo.
Il lato ssh config
In ~/.ssh/config descrivi il bastion come un host normale, poi ci fai puntare la destinazione:
Host bastion
HostName bastion.esempio.it
User jump
IdentityFile ~/.ssh/id_ed25519
Host app-prod
HostName 10.0.4.21
User deploy
IdentityFile ~/.ssh/id_ed25519
ProxyJump bastion
Puoi anche incontrare la forma più vecchia, ancora molto diffusa: ProxyCommand ssh -W %h:%p bastion. Fa lo stesso lavoro; %h e %p sono host e porta della destinazione.
Provalo dal terminale prima di coinvolgere qualsiasi altro strumento:
ssh app-prod
Se funziona, qualsiasi strumento basato su SSH sul tuo Mac può essere fatto funzionare. Se non funziona, nessun client grafico ti salverà — sistema prima la configurazione.
Le catene, e perché l’ordine conta
ProxyJump accetta più di un salto. ProxyJump edge,inner significa passare prima da edge, poi da inner, poi arrivare alla destinazione. Ogni salto viene aperto dentro il precedente, quindi la catena si costruisce verso l’esterno partendo dal tuo Mac.
Questo significa anche che ogni salto si autentica separatamente. Se il primo bastion accetta la tua chiave e il secondo no, il fallimento avviene a metà strada — vale la pena saperlo, perché l’errore che vedrai riguarderà il secondo salto, non il primo.
La parte che si sbaglia più spesso: le host key
Ogni salto ha la propria host key, e ogni salto va verificato contro la propria voce nei known hosts. Per un client è allettante verificare solo la destinazione finale — in fondo è lì che vanno i tuoi file — ma è un falso senso di sicurezza: un bastion compromesso potrebbe a quel punto presentarsi come la destinazione e leggere tutto.
Se uno strumento ti chiede di fidarti di un’impronta mentre ti colleghi attraverso un bastion, controlla di quale host stia parlando. Dovrebbe nominare il salto che sta aprendo in quel momento, non sempre la destinazione.
Farlo da un client per Mac
Upstream (FULL) legge ProxyJump direttamente dal tuo ssh config: importa ~/.ssh/config e il bastion viene creato come sito salvato a sé stante e collegato automaticamente alla destinazione. Puoi anche impostarlo a mano — apri il sito, scegli il jump host sotto “Connetti attraverso”, e collegati come sempre.
Ogni salto viene verificato contro la propria voce nei known hosts, e gli errori di connessione dicono quale salto è fallito: “jump host irraggiungibile” e “destinazione irraggiungibile attraverso il bastion” sono problemi diversi con soluzioni diverse.
Passo per passo
- Descrivi il bastion in ~/.ssh/config — aggiungi un blocco Host per il bastion con HostName, User e IdentityFile, esattamente come se dovessi collegarti direttamente a lui.
- Fai puntare la destinazione con ProxyJump — nel blocco Host della destinazione aggiungi
ProxyJump <alias-del-bastion>. Provalo dal terminale conssh <alias-destinazione>prima di coinvolgere altri strumenti. - Importa la configurazione nel client — in Upstream usa Importa ▸ Da ~/.ssh/config. Vengono importati entrambi gli host e la relazione di salto viene mantenuta.
- Autorizza la chiave privata una volta — per via della sandbox di macOS un’app non può leggere
~/.sshda sola. Alla prima connessione Upstream ti chiede di selezionare la chiave a cui punta la configurazione; da lì in poi resta nel tuo Keychain. - Connettiti — collegati alla destinazione come sempre. Upstream apre prima il bastion, poi crea il tunnel verso la destinazione, verificando ogni host key lungo il percorso.
Domande frequenti
Un bastion è la stessa cosa di una VPN?
No. Una VPN mette l’intera macchina sulla rete remota; un bastion inoltra una singola connessione verso un singolo host. Un bastion è più stretto, ed è esattamente per questo che i team di sicurezza lo preferiscono per l’accesso ai server.
Il bastion vede i miei file?
No. Inoltra traffico cifrato. La tua sessione con la destinazione è negoziata da un capo all’altro, dentro il tunnel.
Posso concatenare più di un bastion?
Sì. ProxyJump accetta un elenco separato da virgole e ogni salto viene aperto dentro il precedente. Upstream segue catene di qualsiasi lunghezza.
Funziona con l’FTP semplice?
No, e non è un limite del client. ProxyJump è una funzionalità di SSH, quindi vale per SFTP. FTP e FTPS non hanno nulla di equivalente.