autossh tötet ssh nicht, wenn die Verbindung unterbrochen wird

10

Ich habe mein Autossh mit einer Abstimmungszeit von 30 s gestartet:

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

Und es funktioniert gut:

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

Wenn ich jedoch das Netzwerkkabel physisch entferne, was bedeutet, dass der Tunnel nicht mehr funktioniert, tötet autossh den ssh-Daemon nicht. Warum? Ich verstehe, dass autossh nichts tun kann, wenn der Link nicht funktioniert, aber meiner Meinung nach sollte es versuchen, Folgendes zu tun:

  1. Überprüfen Sie den untergeordneten ssh-Prozess ( check on child ...)
  2. Überprüfen Sie das ferne Ende !!! (eine pingartige Operation durch den Tunnel)
  3. Erkenne, dass der Tunnel unten ist
  4. Stoppen Sie den SSH-Prozess
  5. Versuchen Sie erneut, den Tunnel zu erstellen
  6. Stellen Sie fest, dass es nicht funktioniert, und richten Sie einen (exponentiell ansteigenden?) Timer ein, um ihn bald erneut zu überprüfen

Deshalb führe ich autossh aus: Wenn etwas mit dem Tunnel passiert (sei es ein Software- oder Hardwareproblem), sollte er versuchen, ihn neu zu starten. Stattdessen wartet es nur darauf, dass der SSH-Prozess stirbt. Sollte es nicht versuchen, es neu zu starten, auch wenn keine Hoffnung besteht, die Verbindung wiederherzustellen?

Welche Art von Scheck macht Autossh? Stellen Sie einfach sicher, dass das SSH funktioniert. Führt es keine Fernprüfung durch?

Bearbeiten

Wie gewünscht füge ich den relevanten Teil der ssh-Konfiguration hinzu:

# (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
verdammt schnell
quelle
Was ist mit dem Versuch, das Timeout zu reduzieren?
Nikolaidis Fotis
Wir haben Autossh für eine Weile verwendet, aber es war viel zu unzuverlässig bei flockigen Verbindungen, insbesondere in Kombination mit Port-Weiterleitungen. Wir verwenden jetzt OpenVPN und sind sehr zufrieden damit.
Nils Toedtmann
@ NikolaidisFotis: Das Timeout ist in Ordnung. Es ist ... Zeitüberschreitung. Aber es macht nicht das Richtige (imho), wenn das Timeout einsetzt, nämlich: das ferne Ende überprüfen !
Dangonfast
@NilsToedtmann: Danke, ich werde es versuchen. Ist es einfach zu implementieren? Haben Sie einen Link zu einem guten Howto?
Dangonfast
OpenVPN ist ziemlich unkompliziert. Wir haben es nur "apt-get installiert" und mit den Standardkonfigurationen für Server oder Client begonnen, wobei dev tunbeide verwendet und remotein der Client-Konfiguration festgelegt wurden. Das einzig ärgerliche ist, die Zertifikate zu verwalten. Wir verwenden die mit openVPN gelieferte 'easy-rsa'-Zertifizierungsstelle. Sobald Sie die Zertifikate haben, ist der Rest einfach.
Nils Toedtmann

Antworten:

11

Wenn ich jedoch das Netzwerkkabel physisch entferne, was bedeutet, dass der Tunnel nicht mehr funktioniert, tötet autossh den ssh-Daemon nicht. Warum?

autossh wird auf Ihrem Client-Computer ausgeführt, sodass der ssh-Daemon-Prozess auf dem Server nicht direkt abgebrochen werden kann. Sie können jedoch einen Wert ungleich Null für ClientAliveIntervalin /etc/ssh/sshd_configauf dem Server angeben (siehe man sshd_config) und den sshd-Dienst auf dem Server neu starten, um die Konfigurationsänderung anzuwenden. Im Falle einer Netzwerkunterbrechung wird der ssh-Daemon-Prozess nach ClientAliveInterval * ClientAliveCountMaxSekunden beendet (jedoch nicht durch Autossh).

Nun, wenn Sie fragen wollten: "Warum beendet autossh den SSH-Client-Prozess nicht?" haben Sie angegeben -M 0. Von der Autossh-Manpage:

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

Anstatt autossh zum Überwachen der Verbindung zu verwenden, warten Sie darauf, dass ssh nach einer Zeitüberschreitung von ServerAliveCountInterval * ServerAliveCountMaxSekunden beendet wird. Sie haben 60 Server-Alive-Überprüfungen angefordert, bevor ssh beendet wird, wobei ein Intervall von 60 Sekunden aufeinanderfolgende Überprüfungen voneinander trennt. Sie müssen also eine Stunde warten, bevor Ihr ssh-Client beendet wird.

Sie können auch die ExitOnForwardFailureOption auf der Clientseite verwenden (siehe man ssh_config), damit ssh beendet wird, wenn kein Tunnel eingerichtet werden kann, und autossh dann versuchen kann, ssh erneut zu starten.

James W.
quelle
Danke, das macht Sinn. Ich meinte in der Tat "Client-Prozess", nicht Server-Prozess.
Dangonfast
Und nachdem ich die Autossh-Manpage jetzt noch einmal gelesen habe, erinnere ich mich, warum ich festgelegt habe -M 0: Es ist nicht einfach, einen Überwachungsport zu verwenden, und es wird indirekt davon abgeraten: In vielerlei Hinsicht ist dies möglicherweise eine bessere Lösung als der Überwachungsport
dangonfast