it-swarm.it

Quali opzioni `ServerAliveInterval` e` ClientAliveInterval` in sshd_config fanno esattamente?

Ho trovato questa domanda , ma mi dispiace non capire bene le impostazioni delle due variabili ServerAliveInterval e ClientAliveInterval menzionate nella risposta accettata. Se il mio server locale sta scadendo, devo impostare questo valore su zero? Non andrà mai in timeout? Dovrei invece impostarlo su 300 secondi o qualcosa del genere?

La mia domanda è semplicemente, alcune delle mie connessioni scadono quando sospendo e quindi sospendo il mio laptop con la risposta Write failed: Broken pipe e alcuni no. Come posso configurare correttamente un SSH locale in modo che non falliscano con una pipe rotta?

177
M. Tibbits

ServerAliveInterval : numero di secondi che il client attenderà prima di inviare un pacchetto null al server (per mantenere attiva la connessione) .

ClientAliveInterval : numero di secondi che il server attenderà prima di inviare un pacchetto null al client (per mantenere attiva la connessione) .

L'impostazione di un valore pari a 0 (impostazione predefinita) disabiliterà queste funzioni, in modo che la connessione potrebbe interrompersi se è inattiva per troppo tempo.

ServerAliveInterval sembra essere la strategia più comune per mantenere attiva una connessione. Per evitare il problema del tubo rotto, ecco la configurazione ssh che uso nel mio file .ssh/config:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

L'impostazione sopra funzionerà nel modo seguente,

  1. Il client attenderà inattivo per 60 secondi (tempo ServerAliveInterval) e invierà un "pacchetto null no-op" al server e si aspetterà una risposta. Se non arriva alcuna risposta, continuerà a provare il processo sopra descritto fino a 10 (ServerAliveCountMax) volte (600 secondi). Se il server continua a non rispondere, il client disconnette la connessione ssh.

Anche ClientAliveCountMax sul lato server potrebbe essere d'aiuto. Questo è il limite per quanto tempo a un client è consentito non rispondere prima di essere disconnesso. Il valore predefinito è 3, come in tre ClientAliveInterval.

227
Barthelemy

Questo è spiegato in sshd_config manuale (man sshd_config):

ClientAliveInterval

Imposta un intervallo di timeout in secondi dopo il quale se non sono stati ricevuti dati dal client, sshd invierà un messaggio attraverso il canale crittografato per richiedere una risposta dal client. L'impostazione predefinita è 0, a indicare che questi messaggi non verranno inviati al client. Questa opzione si applica solo alla versione 2 del protocollo.

ClientAliveCountMax

Il valore predefinito è 3. Se ClientAliveInterval (vedere di seguito) è impostato su 15 e ClientAliveCountMax viene lasciato sul valore predefinito, i client SSH non rispondenti verranno disconnessi dopo circa 45 secondi. Questa opzione si applica solo alla versione 2 del protocollo.

Per le opzioni del client, vedere la spiegazione in man ssh_config:

ServerAliveInterval

Imposta un intervallo di timeout in secondi dopo il quale, se non sono stati ricevuti dati dal server, ssh invierà un messaggio attraverso il canale crittografato per richiedere una risposta dal server. L'impostazione predefinita è 0, a indicare che questi messaggi non verranno inviati al server. Questa opzione si applica solo alla versione 2 del protocollo.

ServerAliveCountMax

Il valore predefinito è 3. Se, ad esempio, ServerAliveInterval è impostato su 15 e ServerAliveCountMax viene lasciato sul valore predefinito, se il server non risponde, ssh si disconnetterà dopo circa 45 secondi. Questa opzione si applica solo alla versione 2 del protocollo.

In base a quanto sopra, 0 significa che è disabilitato. Pertanto, è necessario impostare questi valori abbastanza alti da evitare l'errore Broken pipe.

29
kenorb

La risposta di Barthelemy è interessante ma non arriva davvero alla radice del problema. Sospendi il tuo computer e desideri che la sessione SSH sia ancora attiva all'avvio del computer.

Non esiste una configurazione simile per ssh che mantenga viva la connessione in quel modo. SSH utilizza TCP, per iniziare è necessario l'handshake a tre vie e quindi rimanere in vita dopo qualche tempo di inattività. Quando si spegne/iberna tutte le proprie TCP vengono chiuse con FIN. Non c'è modo di superarle.

Per una soluzione temporanea è possibile utilizzare VPS o un'altra casella online con schermo per mantenere la connessione. Il mio consiglio non lo fa per motivi di sicurezza.

20
3h4x

Poiché non è possibile garantire che una connessione SSH (essendo TCP) rimarrà attiva una volta che un'estremità smette di inviare ACK ai pacchetti ricevuti, io personalmente uso http://www.harding.motd.ca/autossh/ = per riavviare tutte le mie connessioni SSH non appena sospendo.

Dato che GNU lo schermo sarà in uso sul lato server, il ricollegamento mi porta dove ero prima.

Puoi ascoltarlo su porte extra in modo che controlli continuamente che le connessioni siano ancora attive, ma personalmente trovo che funzioni abbastanza bene con quello disabilitato e basandosi solo su ServerAliveInterval/ServerAliveCountMax di SSH.

Un'altra opzione è http://mosh.mit.edu/ che utilizza UDP e recupera senza problemi dalla mancanza di connettività a lungo termine.

16
grifferz

È inoltre possibile eseguire comandi con Nohup se si desidera che vengano eseguiti indipendentemente dalla connessione SSH.

per esempio.

$ Nohup tar -xzf some_huge.tar.gz &

Il & è, penso, non necessario, ma è conveniente poiché fa funzionare il processo in background in modo da poter fare altre cose.

Uso sempre Nohup per qualsiasi processo che richiede un po 'di tempo, in modo da non dover ricominciare da capo se perdo la connessione per qualsiasi motivo - interruzione di corrente (nella mia posizione remota, ovviamente non nell'host), interruzione di rete, qualunque cosa.

5
Buttle Butkus

Inserisci la sessione di lunga durata all'interno dello schermo Vedi lo schermo -h per i dettagli

In questo modo è possibile riconnettersi alla macchina usando ssh e ricollegarsi alla sessione dello schermo

1
user180529