autossh non uccide ssh quando il link è inattivo


10

Ho iniziato il mio autossh con un tempo di sondaggio di 30 s:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

E funziona benissimo:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

Ma se rimuovo fisicamente il cavo di rete, il che significa che il tunnel non può più funzionare, l'autossh non uccide il demone ssh. Perché? Capisco che l'autossh non può fare nulla se il collegamento non è attivo, ma a mio avviso dovrebbe provare a fare quanto segue:

  1. Verifica del processo ssh figlio ( check on child ...)
  2. Verifica il lontano !!! (un'operazione simile a un ping attraverso il tunnel)
  3. Realizza che il tunnel è inattivo
  4. Ferma il processo ssh
  5. Prova a creare di nuovo il tunnel
  6. Comprendi che non funziona e imposta un timer (esponenzialmente in aumento?) Per ricontrollare presto

Ecco perché sto eseguendo l'autossh: se succede qualcosa al tunnel (sia esso un problema software o hardware), dovrebbe provare a riavviarlo. Invece, sta solo aspettando che il processo SSH muoia. Non dovrebbe tentare di riavviarlo, anche se non c'è speranza di ristabilire la connessione?

Che tipo di controllo sta facendo l'autossh? Basta verificare che l'ssh sia attivo e funzionante? Non sta facendo alcun tipo di controllo remoto?

modificare

Come richiesto, aggiungo la parte rilevante della configurazione ssh:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes

che ne dici di provare a ridurre il timeout?
Nikolaidis Fotis,

Abbiamo usato l'autossh per un po ', ma era troppo inaffidabile su connessioni instabili, in particolare se combinato con port forwarding. Ora usiamo OpenVPN e ne siamo molto soddisfatti.
Nils Toedtmann,

@NikolaidisFotis: il timeout va bene. Sta ... scadendo. Ma non fa la cosa giusta (imho) ogni volta che interviene il timeout, vale a dire: verificare il lontano !
dangonfast,

@NilsToedtmann: grazie, ci proverò. È facile da implementare? Hai qualche link a un buon howto?
dangonfast,

OpenVPN è piuttosto semplice, lo abbiamo appena 'apt-get installato' e abbiamo iniziato con le configurazioni predefinite per server o client, usando dev tunentrambe e impostando remotela configurazione del client. L'unico elemento fastidioso è gestire i certificati. Utilizziamo la CA "easy-rsa" fornita con OpenVPN. Una volta che hai i certificati, il resto è facile.
Nils Toedtmann,

Risposte:


11

Ma se rimuovo fisicamente il cavo di rete, il che significa che il tunnel non può più funzionare, l'autossh non uccide il demone ssh. Perché?

autossh viene eseguito sul tuo computer client, quindi non può uccidere direttamente il processo demone ssh sul server. Tuttavia, è possibile specificare un valore diverso da zero per ClientAliveIntervalin /etc/ssh/sshd_configsul server (consultare man sshd_config) e riavviare il servizio sshd sul server per applicare la modifica della configurazione. Quindi, in caso di disconnessione della rete, il processo del demone ssh verrà interrotto dopo ClientAliveInterval * ClientAliveCountMaxpochi secondi (ma non per autossh).

Ora, se intendevi chiedere "Perché l'autossh non uccide il processo client ssh?" , hai specificato -M 0. Dalla pagina man autossh:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit.

Invece di utilizzare autossh per monitorare la connessione, stai aspettando che ssh esca dopo un timeout di ServerAliveCountInterval * ServerAliveCountMaxsecondi. Prima di uscire da ssh hai richiesto 60 controlli attivi sul server, con un intervallo di 60 secondi che separa i controlli consecutivi, quindi dovrai attendere un'ora prima dell'uscita del tuo client ssh.

Potresti anche considerare di usare l' ExitOnForwardFailureopzione sul lato client (vedi man ssh_config), così che ssh uscirà se non riesce a stabilire un tunnel, e quindi autossh può provare a riavviare ssh.


Grazie, questo ha senso. Intendevo davvero "processo client", non processo server.
dangonfast,

E dopo aver riletto la pagina man di autossh ora ricordo il motivo per cui ho impostato -M 0: non è facile utilizzare una porta di monitoraggio ed è indirettamente scoraggiato: per molti versi questa può essere una soluzione migliore rispetto alla porta di monitoraggio
dangonfast
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.