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


161

Ho trovato questa domanda , ma mi dispiace non capire bene le impostazioni delle due variabili ServerAliveIntervale ClientAliveIntervalmenzionate 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 non sospendo il mio laptop con la risposta Write failed: Broken pipee altre no. Come posso configurare correttamente un SSH locale in modo che non falliscano con una pipe rotta?

Risposte:


202

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 funzionalità, 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 di 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.

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


Ok, quindi interpreterei zero secondi per implicare che "non tieni in vita" ed è per questo che non esegue il polling del client / server?
M. Tibbits,

3
yup 0 = non inviare un pacchetto null. Un altro diverso sarebbe che ServerAliveInterval è impostato nella configurazione del client mentre ClientAliveInternal è impostato nella configurazione del server.
Barthelemy,

8
Questo sembra un buon consiglio per prevenire la pigrizia che causa i timeout, ma non capisco come si collega alla domanda di OP di prevenire tubi rotti quando il cliente sospende. Durante il sonno, il client non sarebbe in grado di inviare un pacchetto null, quindi sicuramente questa impostazione è controversa?
Sparhawk,

La parte ServerAlive è, certamente. ClientAliveInterval / ClientAliveCountMax è ciò che potrebbe aiutare qui.
javawizard,

1
Guardando indietro a questa vecchia risposta, credo che abbia risposto alla domanda nel titolo e non alla domanda nel secondo paragrafo, quindi i commenti su ServerAliveInternal non sono stati utili per la sospensione, con cui sono d'accordo. @JonasWielicki ClientAliveInterval potrebbe essere errato in caso di sospensione perché il client sospeso non risponderebbe al server e il server alla fine disconnetterebbe il client dopo ClientAliveCountMax.
Barthelemy,

18

Questo è spiegato nel sshd_configmanuale ( 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. Il valore predefinito è 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 ClientAliveCountMaxviene lasciato sul valore predefinito, i client SSH che non rispondono 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, sshinvierà un messaggio attraverso il canale crittografato per richiedere una risposta dal server. Il valore predefinito è 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 ServerAliveCountMaxviene lasciato sul valore predefinito, se il server non risponde, sshsi 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 su valori sufficientemente alti da evitare errori di pipe interrotte .


Post utile. Ma sono così frustrato da questo. Sto impostando ampi intervalli in tutto il luogo e la mia connessione si interrompe ancora dopo pochi minuti. (usando openssh su Ubuntu, non sono sicuro che sia pertinente)
Sridhar Sarnobat,

1
@ user7000 Configurare sia il client (ssh) che il server (sshd). Questo può essere d'aiuto: Come risolvere i problemi con "La connessione SSH è stata inaspettatamente chiusa dall'estremità remota" .
Kenorb,

Penso che sto arrivando da qualche parte. È possibile che non stia inserendo uno spazio ServerAliveIntervalnel mio file di configurazione.
Sridhar Sarnobat,

16

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 / ibernazione tutte le connessioni TCP vengono chiuse con FIN. Non c'è modo di superarlo.

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.


1
Questa è in effetti l'unica e unica risposta alla domanda.
Calimo,

1
Questa è in effetti una terribile soluzione di sicurezza, non farlo mai.
jahrichie,

14

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

Dal momento che GNU Screen sarà in uso sul lato server, il ricollegamento mi porta dove ero prima.

Puoi farlo ascoltare 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 SSH ServerAliveInterval/ ServerAliveCountMax.

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


5

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

per esempio

$ nohup tar -xzf some_huge.tar.gz &

Il &è, credo, non è necessario, ma è conveniente dal momento che fa girare 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.


Nota nohup su zsh non funziona correttamente!
Sridhar Sarnobat,

@ user7000 cosa non è corretto al riguardo?
Buttle Butkus,

Non ricordo, penso che fondamentalmente non abbia mantenuto il processo in esecuzione dopo la disconnessione del client. È stato qualche anno fa e ho smesso di usare Nohup e invece ho usato il disown.
Sridhar Sarnobat,

2
Immagino che gli zshutenti dovrebbero attenersi a disown -hinvece di nohup, a meno che il problema non sia stato risolto da allora.
Buttle Butkus,

0

Inserisci la tua 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


Mi chiedo quale percentuale di persone che suggeriscono che lo schermo lo usi effettivamente da solo.
Sridhar Sarnobat

Penso che tmux sia un suggerimento migliore, controlla la data di modifica del codice github.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.