Come funziona tcp-keepalive in ssh?


85

Sto cercando di codificare uno script di shell che utilizza una connessione ssh per fare "battiti del cuore". Voglio terminare il lato client e server di quella connessione dopo un certo timeout (dopo che la connessione si interrompe).

Quello che ho trovato finora:

  • TCPKeepAlive sì / no per ssh e sshd
  • ClientAliveCountMax per sshd
  • ClientAliveInterval per sshd
  • ServerAliveCountMax per ssh
  • ServerAliveInterval per ssh

Per cambiare "ClientAliveCountMax" dovrei modificare sshd_config su ogni macchina target (questa opzione è disabilitata di default).

Quindi la mia domanda è: posso usare "TCPKeepAlive" anche per i miei scopi (senza cambiare nient'altro sui computer di origine / destinazione)?

Il sistema operativo di destinazione è SLES11 SP2, ma non credo sia rilevante qui.


Tali parametri sono tutti pensati per le situazioni in cui un firewall o un dispositivo intermedio lungo la connessione interromperà la connessione. Tali parametri servono per l'invio di dati periodici per mantenere attiva la connessione e anche per la chiusura della connessione quando sono presenti X risposte in sospeso. Puoi fornire qualche dettaglio in più di quello che stai facendo? Stai usando l' ControlMasteropzione e stai usando le connessioni slave?
Patrick

Voglio solo costruire un mezzo per determinare se un altro nodo è "inattivo" usando diverse connessioni ssh-network con diverse linee fisiche. Lo faccio semplicemente aprendo una sessione ssh (che più o meno fa un ciclo infinito). Voglio che quella sessione termini se si interrompono le connessioni. Mi chiedo quale sia l'intervallo / conteggio per TCPKeepalive.
Nils,

Risposte:


104

Probabilmente vuoi usare le impostazioni ServerAlive per questo. Non richiedono alcuna configurazione sul server e, se lo si desidera, possono essere impostati sulla riga di comando.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Questo invierà un messaggio keepshive ssh ogni 5 secondi e se arriva il momento di inviare un altro keepalive, ma non è stata ricevuta una risposta all'ultimo, la connessione viene interrotta.

La differenza critica tra ServerAliveIntervale TCPKeepAliveè il livello in cui operano.

  • TCPKeepAliveopera sul livello TCP. Invia un pacchetto TCP ACK vuoto. I firewall possono essere configurati per ignorare questi pacchetti, quindi se si passa attraverso un firewall che interrompe le connessioni inattive, queste potrebbero non mantenere attiva la connessione.
  • ServerAliveIntervalopera sul livello ssh. In realtà invierà i dati tramite ssh, quindi il pacchetto TCP ha dati crittografati e un firewall non può dire se è un pacchetto keepalive o legittimo, quindi funzionano meglio.

1
Penso che questa sia la direzione giusta. I test iniziali hanno dimostrato che funzionerà: terminerà l'invio e la ricezione dei sottoprocessi ssh / sshd negli ultimi 5 secondi dopo l'interruzione della connessione. Immagino che TCPKeepalive utilizzi semplicemente i valori predefiniti dello stack TCP, quindi è anche più difficile da configurare.
Nils,

Questo risolve anche il problema dell'utente fantasma. Credo che ciò possa essere fatto anche nelle impostazioni di PuTTY , passando Seconds between keepalivesa 1800 in Impostazioni | Connessione.
Bob Stein,

7

L' TCPKeepAliveopzione è in realtà un metodo molto diverso per mantenere attive le connessioni dalle opzioni simili a ClientAlive o simili a ServerAlive.

Sono per pagina di manuale BSD SSH , possiamo leggere che:

I messaggi attivi del client vengono inviati attraverso il canale crittografato e pertanto non saranno falsificabili. L'opzione keepalive TCP abilitata da TCPKeepAliveè spoofable. Il meccanismo attivo del client è prezioso quando il client o il server dipendono dal sapere quando una connessione è diventata inattiva.

Il TCPKeepAliveassicurarsi se il sistema deve inviare messaggi TCP keepalive all'altro lato. L'opzione predefinita è sempre abilitata.

Se stai usando ClientAliveInterval, puoi disabilitare TCPKeepAlive. Questa opzione invierà un messaggio attraverso il canale crittografato per richiedere una risposta dal client (il valore predefinito è 0, quindi nessun messaggio viene inviato al client) e ClientAliveCountMaximposta il numero di messaggi attivi del client prima che sshd disconnetterà il client, terminando il comando sessione.

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.