Multiplexing SSH con ControlMaster e ControlPersist

Aggiungi ControlMaster auto, ControlPath ~/.ssh/cm/%C e ControlPersist 10m a un blocco Host in ~/.ssh/config e crea la cartella con mkdir -m 700 ~/.ssh/cm. Il primo ssh apre la connessione e i successivi la riusano senza fare di nuovo il login. ssh -O check server mostra se è attiva e ssh -O exit server la chiude.

Aggiornata il . Client OpenSSH 10.0 verso OpenSSH 10.0 su Debian 13 in container usa e getta.

La configurazione

mkdir -m 700 ~/.ssh/cm
Host server
  HostName example.com
  User user
  ControlMaster auto
  ControlPath ~/.ssh/cm/%C
  ControlPersist 10m
  • ControlMaster auto usa una connessione esistente se c'è, altrimenti ne apre una nuova che gli altri possono condividere.
  • ControlPath è il file socket che le sessioni usano per trovare la connessione. %C è un hash di host locale, host remoto, porta, utente e jump host, così login diversi non si confondono.
  • ControlPersist 10m tiene aperta la connessione per 10 minuti dopo la fine dell'ultima sessione. Con no, il valore predefinito, la connessione vive dentro il primo ssh che hai avviato, che resta aperto finché non sono finite tutte le sessioni che la usano. Con yes, resta aperta finché non la chiudi.

Nel nostro test, tra due container sulla stessa macchina, il primo ssh server true ha impiegato 74 ms e il secondo 3 ms. Il secondo salta lo scambio di chiavi e il login, quindi non compare nemmeno una nuova richiesta di password o passphrase. Su una rete reale il primo login è più lento, quindi il divario è maggiore.

Lo stesso blocco può contenere le altre impostazioni dell'host. Per saperne di più, vedi esempi del file config di SSH.

Controllare la connessione

ComandoCosa fa
ssh -O check serverStampa Master running (pid=1534), codice di uscita 0
ssh -O conninfo serverMostra gli indirizzi e gli algoritmi della connessione
ssh -O forward -L 8080:localhost:80 serverAggiunge un inoltro di porta alla connessione aperta
ssh -O cancel -L 8080:localhost:80 serverRimuove quell'inoltro
ssh -O stop serverNon accetta nuove sessioni, quelle in corso continuano
ssh -O exit serverChiude la connessione e tutte le sessioni che passano da lì
ssh -S none serverApre una connessione separata e ignora quella condivisa

Quando non c'è nulla in esecuzione, -O check esce con codice 255:

Control socket connect(/home/user/.ssh/cm/936446a2...): No such file or directory

Limiti e trappole

Tutte le sessioni hanno lo stesso destino

Se la connessione muore, muoiono tutte le sessioni che la usano. Nel nostro test, ssh -O exit ha terminato una sessione in corso con codice di uscita 255. Anche la sequenza di escape ~. termina tutte le sessioni della connessione, come dice lo stesso ssh nel suo elenco ~?.

Il server limita le sessioni per connessione

MaxSessions in sshd_config vale 10 per impostazione predefinita. Abbiamo aperto 12 sessioni insieme e le ultime 2 sono fallite con:

mux_client_request_session: session request failed: Session open refused by peer

Quei comandi sono falliti del tutto. Non sono passati a una nuova connessione, quindi gli script che lanciano molti comandi in parallelo hanno bisogno di un limite più alto o di -S none.

Il percorso del socket può essere troppo lungo

I percorsi dei socket Unix hanno un limite di lunghezza ridotto. Un percorso troppo lungo blocca la connessione:

unix_listener: path "/very/long/path/..." too long for Unix domain socket

Una cartella corta con %C evita il problema. L'hash ha una lunghezza fissa, a differenza di %r@%h:%p.

Il socket dà accesso senza login

Chiunque possa usare il file socket può aprire sessioni sulla tua connessione senza password. Tienilo in una cartella in cui solo tu puoi scrivere, ed è per questo che ~/.ssh/cm ha modo 700. Anche il manuale lo segnala.

I tunnel di lunga durata dovrebbero avere una connessione propria

Un inoltro avviato tramite una connessione condivisa appartiene al master. Nel nostro test, con il multiplexing attivo, un secondo ssh -f -N -o ExitOnForwardFailure=yes -R 2222:localhost:22 server su una porta già in uso ha restituito codice di uscita 0. Senza multiplexing, lo stesso comando ha stampato un errore e ha restituito 255. Per un tunnel da cui dipendono degli script, aggiungi -S none.

Un master terminato a forza lascia un socket orfano

Dopo un kill -9 sul master, il file socket resta e -O check segnala Connection refused. Nel nostro test il successivo ssh server normale ha funzionato lo stesso e ha sostituito il socket. Se mai si blocca, elimina il file in ~/.ssh/cm.

Domande

Il multiplexing SSH è sicuro?

Sì, se il socket sta in una cartella in cui puoi scrivere solo tu, come ~/.ssh/cm con permessi 700. Chiunque possa usare il socket può aprire sessioni sulla tua connessione senza accedere.

ControlMaster funziona con il client OpenSSH di Windows?

Il client OpenSSH incluso in Windows non supporta ControlMaster, perché si basa sui socket di dominio Unix. Funziona in WSL.

Come chiudo una connessione SSH condivisa?

Esegui ssh -O exit con il nome dell'host. Chiude la connessione e tutte le sessioni che la usano. ssh -O stop rifiuta nuove sessioni e lascia finire quelle in corso.

Fonti

Altro in Configurazione e tanti server

Tutte le guide