Come posso bloccare le mie sessioni SSH dal congelamento?


66

Ho ServerAliveIntervale, nel caso di poche macchine, anche ClientAliveIntervalimpostato su 540 nei file di configurazione client / server SSH (suppongo che impostarlo su un valore superiore a quello non sarebbe una buona idea). Lavoro con molte sessioni SSH che attualmente si bloccano dopo pochi minuti.

Come posso ripararlo? Quello che voglio è avere una sessione per non congelare affatto, quindi se apro una sessione alle 8 e non la uso per 4 ore, ad esempio, per riutilizzarla ancora alle 12 senza dover accedere di nuovo .


Per quanto tempo attualmente puoi rimanere connesso (supponendo che ciò non sia dovuto alla disconnessione della rete)? TCPKeepAlive yes?
Iyrin,

Non sono sicuro ma 10 min. al massimo. Per quanto riguarda TCPKeepAlive yes- dipende dalla macchina.
syntagma,

11
Usa solo mosh ?
Vi.

1
Oppure potresti usare autossh...
ThoriumBR,

Direi che lasciare una connessione aperta per 4 ore è un problema di sicurezza e dovresti screeninvece utilizzare . Ma sto ancora votando la tua domanda perché sto riscontrando lo stesso problema dopo solo un minuto o due.
Dale Anderson,

Risposte:


80

Le modifiche apportate /etc/ssh/ssh_confige /etc/ssh/sshd_configsono corrette ma non avranno ancora alcun effetto.

Per far funzionare la tua configurazione, apporta queste modifiche alla configurazione sul client:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval Il client invierà un pacchetto null al server ogni 100 secondi per mantenere attiva la connessione

Il pacchetto NULL viene inviato dal server al client. Lo stesso pacchetto viene inviato dal client al server. Un pacchetto TCP NULL non contiene alcun flag di controllo come SYN, ACK, FIN ecc. Perché il server non richiede una risposta dal client. Il pacchetto NULL è descritto qui: https://tools.ietf.org/html/rfc6592

Quindi configurare la parte sshd sul server.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Il server attenderà 60 secondi prima di inviare un pacchetto null al client per mantenere attiva la connessione

TCPKeepAlive È lì per garantire che alcuni firewall non lascino cadere le connessioni inattive.

ClientAliveCountMax Server invierà messaggi vivi al client anche se non ha ricevuto alcun messaggio dal client.

Infine riavvia il ssh server

service ssh restart o a service sshd restartseconda del sistema in cui ti trovi.


Penso che ServerAliveCountMaxsia necessario anche un livello elevato affinché questo sia il più affidabile possibile. E se entrambi ServerAliveIntervale ClientAliveIntervalsono abbastanza bassi, non credo che ce ne sarà bisogno TCPKeepAlive. Inoltre, se ci sono delle scatole intermedie, possono comunque perdere lo stato anche con tutte le impostazioni precedentemente menzionate configurate esattamente corrette. Può essere utile utilizzare MPTCP (se sia client che server lo supportano).
Kasperd,

All'inizio non è chiaro se intendi la configurazione sul lato client o sul lato server (eventualmente alla fine, lato client). Quindi alla descrizione ServerAliveInterval , dici "il client invierà ... al server", ma nel paragrafo successivo "Il pacchetto NULL viene inviato dal server al client". Li trovo un po 'confusi.
Craig McQueen l'

1
Dopo aver aggiunto al server ottengo: / etc / ssh / ssh_config: riga 57: opzione di configurazione errata: intervallo di mentalizzazione / etc / ssh / ssh_config: riga 59: opzione di configurazione errata: clientalivecountmax
Anders

2
@Anders Ottieni l'errore perché ClientAliveIntervale ClientAliveCountMaxsono opzioni del server SSH, quindi pensate per sshd_confige nonssh_config
Valentin Bajrami,

1
@chandresh non è necessario. Dopo aver modificato ssh_configle nuove sessioni leggerà quel file. Il /etc/environmentfile è una cosa diversa che ha il formato di VAR="value" senza spazi quindi non VAR = "value"sarebbe valido. Sourcing in /etc/ssh/ssh_configquesto modo sarà cioè leggere: Port 22o Host * che li tratterà come comandi
Valentin Bajrami

13

Suggerimento personale: utilizzare screensull'host remoto; riuscirà a mantenere viva la tua connessione finché rimane attiva in un terminale.

Ecco cosa in genere aggiungo /etc/screenrcper una rapida identificazione delle mie sessioni su schermo:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

EDIT: Suggerimenti.

La hardstatusstringa mostrerà una riga di stato inferiore come questa: Esempio di sessione schermo con tre schede aperte

Il buffer di scrollback viene inoltre esteso a 8192 righe anziché ai normali 1000-1500 (a seconda della distribuzione).


Grazie, due domande: 1. Puoi spiegare le opzioni nel tuo screenrcfile? Come configuro il sistema la schermata di avvio / tmux subito dopo il login?
syntagma,

8
Giusto per chiarire, screennon mantiene viva la tua connessione ssh. Esegue i processi in un terminale virtuale indipendente dal terminale utente a cui ci si connette tramite, sshquindi il processo non si basa sulla connessione. Perderai comunque la sshconnessione fino a quando non verrà risolto.
Iyrin,

1
Per " mantenere viva la connessione " intendo essenzialmente " impedisce alla connessione di restare inattiva ", che ha lo stesso risultato. Se non viene immesso alcun input per 4 ore, SSH rimarrà inattivo e alla fine chiuderà la connessione, anche tutti i processi figlio verranno persi.

2
Per quanto mi sia piaciuto screen, consiglio ai nuovi utenti di iniziare tmux.
dotancohen,

2

Con OpenSSH:

Devi abilitare

TCPKeepAlive yes

sia nel client ssh_config (ad es. /etc/ssh/ssh_configo in ~/.ssh/config) che nel server SSH di destinazione che esegue OpenSSH (ad es. / etc / ssh / sshd_config).

Quindi ogni volta che la tua connessione è inattiva, OpenSSH invia un pacchetto fittizio al tuo host di destinazione ...


Questo può anche causare l' The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. interruzione
iyrin

Onestamente, ma "[…] network goes down […] client host crashes […] route is down […]"sono gravi errori che nessuna configurazione SSH può rilevare. Il problema principale qui sono le sessioni SSH inattive, non gli errori di rete. Quindi per riassumere: - abilitare TCPKeepAlive yessia nel server che nel client. - impostato ClientAliveInterval sul server - impostato IdleTimeoutsul server - impostato ClientAliveCountMax che dovrebbe fare il trucco ...
Martin Allert

2

Se il problema è un laptop in letargo o una connessione di rete non perfetta, ti consiglio di utilizzare il dispositivo moshche funziona sshe consentire la riconnessione automatica.

Dal sito Web :

Mosh (shell mobile)

Applicazione terminale remota che consente il roaming, supporta la connettività intermittente e fornisce l'eco locale intelligente e la modifica della linea delle sequenze di tasti dell'utente.

Mosh è un sostituto di SSH. È più robusto e reattivo, soprattutto tramite collegamenti Wi-Fi, cellulari e interurbani.

Mosh è un software gratuito, disponibile per GNU / Linux, BSD, macOS, Solaris, Android, Chrome e iOS.

In combinazione con tmux(o il precedente screen), questo mi consente di connettermi ssha un server dal mio laptop e rimanere connesso per giorni anche quando cambio connessioni Wi-Fi e sopravvivono alla caduta dei dati mobili.



1

Controlla la tua configurazione sshd sul computer host /etc/sshd_configper l' IdleTimeoutimpostazione .

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
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.