Herstellen einer automatischen Reverse-SSH-Verbindung beim Booten


9

Ich habe einen PC hinter einem NAT, der eine umgekehrte SSH-Verbindung zu meiner Digitalocean VPC herstellt. Ich verwende diese umgekehrte SSH-Verbindung von zu Hause aus, um mich bei meinem Büro-PC anzumelden (ich bin dazu berechtigt), Dateien zu kopieren und andere wichtige Dinge zu tun.

Obwohl nicht oft, bemerkte ich, dass mein Büro-PC neu startet (aufgrund von Stromausfällen usw.) und die umgekehrte SSH-Verbindung, die er mit meiner VPC hergestellt hat, unterbricht. In solchen Fällen kann ich keine Verbindung von meinem Heim-PC zu meinem Büro-PC herstellen.

Ich führe das folgende Skript aus, um die umgekehrte Verbindung + den dynamischen Proxy herzustellen, um meinen auf dem Büro-PC generierten Datenverkehr (da ich keine Browserinformationen freigeben muss) zu anonymisieren.

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

Es gibt keine Möglichkeit, dieses Skript nach einem Neustart erneut auf meinem Büro-PC auszuführen, da ich physisch nicht da bin. Um dieses Problem zu lösen, habe ich die folgende Crontab installiert.

Hinweis: Die rev.shDatei enthält die obige Zeile. Das Zertifikat "digitalOcean" und rev.sh befindet sich in Ubuntu home. Wenn ich ./rev.shin meinem Ubuntu-Terminal ausführe, erhalte ich daher einen dynamischen Proxy und Zugriff auf den ym DigitalOcean-Server. Diese Methode funktioniert zu 100%.

Wenn ich die chrontab jedoch in der folgenden Methode installiere, erstellt mein Ubuntu-PC niemals einen dynamischen Proxy. Ich kann dies sehen, weil beim Überprüfen dieses Proxys in Google Chrome angezeigt wird, dass der Proxy die Verbindung verweigert.

Hier sind die Cronejobs, die ich als Roots-Cronejobs ausprobiert habe. Ich habe diese auch als normaler Benutzer ausprobiert, aber sie haben immer noch nicht funktioniert.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Ich habe dann einige Minuten vor der aktuellen Zeit eine Chrontab installiert und darauf gewartet, dass sie ausgeführt wird.

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

diese wurden auch nicht ausgeführt.

Bitte seien Sie so freundlich, mir zu helfen, meinen Fehler zu erkennen. Es gibt viele ähnliche Fragen auf dieser Website zu meinem Problem. Ich habe daher viele Antworten gegeben, aber keine davon schien zu helfen.


Ich bin mir nicht ganz sicher, was dein Problem hier ist. Beginnt Cron keinen Job? Oder funktioniert das Skript nicht? Bei beiden Problemen konsultieren Sie bitte die Protokolle. Cron sollte irgendwo schreiben /var/log/cron*. Zu Testzwecken können Sie einfach so etwas schreiben */2 * * * * /path/to/script- es wird alle 2 Minuten ein Skript ausgeführt. Suchen Sie auch nach E-Mails für Benutzer, die cron ausführen. Ist es Wurzel? Verwenden mailBefehl. Oh, ich kann sehen, dass Sie den SSH-Schlüssel verwenden? Ich bezweifle, dass Cron Job es finden kann, wenn Sie nach dem -iWechsel keinen vollständigen Pfad dazu angeben.
Kalavan

Antworten:


8

Ich bin mir nicht sicher, ob crones eine gute Idee ist, ein Skript beim Start auszuführen. Eine Alternative, die ich für geeigneter halte, ist das Erstellen eines SystemD-Dienstes, wie hier beschrieben . Erstellen Sie eine Datei mit dem Namen /etc/systemd/system/autossh.service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

Führen Sie dann den folgenden Befehl als root aus:

systemctl enable autossh.service

1

Ein paar Dinge, die Sie ausprobieren können:

chmod +x rev.sh

Manchmal ist Ihr Pfad beim Booten oder durch Cronjobs nicht vollständig festgelegt. Ersetzen Sie daher autossh auf meinem System durch den vollständigen Pfad

/usr/bin/autossh

Das @ reboot-Motiv hängt von der Startzeit des Cron-Daemons ab. Daher kann es aufgerufen werden, bevor andere Subsysteme (Netzwerk?) ausgeführt werden

Und Ihr Crontab-Beispiel:

24 12 8 * * * bash /home/user/rev.sh

wird nur am 8. eines jeden Monats aufgerufen. Und es hat ein zusätzliches Feld. Versuchen

24 12 * * * /home/user/rev.sh

Tut mir leid, es war ein Fehler. Ich habe '24 12 * * * /home/user/rev.sh 'ausprobiert, aber es hat immer noch nicht funktioniert. Zu meiner Überraschung funktionierte nicht einmal '24 12 * * * Neustart '.
Denis

1
Nun, ein Neustart wird sicherlich nicht funktionieren, es sei denn, Sie rufen als root auf.
Slowko

Ich habe versucht, / usr / bin / autossh hinzuzufügen. Es hat nicht funktioniert.
Denis

Ich habe versucht, 24 12 8 * * * in der Roots-Crontab neu zu starten. Es hat nicht funktioniert. Funktioniert es bei Ihnen?
Denis

/usr/binist immer in der Standardeinstellung PATH, auch fürcron
Roaima

1

Es scheint so zu sein, dass das Skript, wenn es über crontab ausgeführt wird, Ihr Zertifikat nicht finden kann.

Wenn Sie als Benutzer das Skript ausführen, wird das Zertifikat von /home/ubuntu-user/.ssh / ... verwendet. Wenn das Skript jedoch von crontab ausgeführt wird, wird es als root ausgeführt. root übernimmt die Zertifikate von /root/.ssh

Sie haben also mehrere Möglichkeiten, damit es funktioniert, aber ich denke, dass das Ausführen des Skripts als Ubuntu-Benutzer in crontab dies tut.

Bearbeiten:

Stellen Sie sicher, dass Sie einen vollständig qualifizierten Pfad für das Zertifikat angeben


1

Versuchen Sie es mit su:

su -l user -c /home/user/rev.sh

Wird es bei Ihrem Problem helfen?


0

Da die Frage nicht so viele Daten enthält, beginne ich bei Null mit dem, was ich tun würde

Ich würde alle Konfigurationen in / etc / ssh / ssh_config ablegen:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

Ich würde den Schlüssel einstecken /etc/ssh/mytunnel_key

dann würde ich es mit einem Cron-Eintrag versuchen (ein Upstart / Systemd-Dienst wäre besser) wie folgt:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel

0

Sie müssen -f verwenden und einen Befehl ausführen, wenn Sie ohne Terminal ausgeführt werden. Hier ist ein Beispiel:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

-f platziert es im Hintergrund, aber wenn Sie es im Hintergrund platzieren, bedeutet dies, dass ssh eine Verbindung herstellt und die Verbindung trennt, sobald die Aufgabe abgeschlossen ist. Du brauchst also eine Aufgabe.

sleep 31536000 weist ssh an, nach dem Herstellen der Verbindung 1 Jahr lang "sleep" auszuführen. Während dieser Zeit bleiben Ihre Tunnel geöffnet.

Wenn Sie keinen Befehl ausführen, stellt ssh eine Verbindung her, richtet den Reverse-Tunnel an Port 2205 ein und wird beendet, wenn dies erledigt ist. Wenn die Verbindung mit autossh fehlschlägt, wird die Verbindung wiederhergestellt und der Ruhezustand erneut gestartet. Selbst mit einer wirklich stabilen Internetverbindung bezweifle ich, dass ein Jahr möglich ist.

Übrigens - im Gegensatz zu diesen anderen Jokern weiß ich, dass dies funktioniert, da ich es tatsächlich getestet habe, weil ich natürlich etwas Ähnliches mache und da es jetzt sehr zuverlässig funktioniert, kann ich Ihnen die richtige Antwort geben.

-f und "Befehl"

Das fehlt dir.


1
Ich glaube nicht, dass wir hier andere Namen nennen müssen.
Jeff Schaller

1
Ich rufe keine anderen Namen. Ich weise darauf hin, dass die zuvor vorgeschlagenen Lösungen von den Leuten, die sie vorgeschlagen haben, nie ausprobiert wurden. Glaubst du mir nicht? Versuch sie.
Jimminy Doe

1
Ich glaube auch nicht, dass Sie den Punkt der Frage angesprochen haben - das OP behauptet, dass diese Methode zu 100% funktioniert . Ich glaube, ihre Frage dreht sich darum, ihr Skript nach dem Neustart des PCs automatisiert auszuführen.
Jeff Schaller

1
Wenn er bei der Arbeit ist, kann er die umgekehrten Tunnel nach Hause einrichten, da das OP in einem Terminal ausgeführt wird - DAS funktioniert 100% der Zeit. Die Programme ssh (und autossh) verhalten sich anders, wenn dem Prozess kein Terminal zugeordnet ist. Er hatte Probleme damit, dass crontab (das ohne Terminal läuft) die Tunnel wieder anschließt, gerade weil er -f nicht verwendet, und selbst wenn dies der Fall wäre , würde der ssh beendet, sobald die Tunnel eingerichtet waren, ohne etwas auszuführen - in meinem Fall gehe ich ein Jahr lang schlafen gehen. Im Skript muss -f MIT EINEM BEFEHL verwendet werden, der das Beenden von SSH verhindert. Das ist sein Problem.
Jimminy Doe

1
Ich nehme an, Sie, Jeff Schaller, haben mir eine Gegenstimme gegeben, die richtige Lösung gegeben und sie tatsächlich getestet. Ich mache im Grunde das gleiche Setup wie er, außer dass ich einen PI einrichte, um eine Firewall zu durchlaufen und rdesktop zu starten, und ihn unserem Büroleiter gebe, der nichts über Linux weiß, um ihn zu verwenden . Ich bin mir ziemlich sicher, dass ich eine kugelsichere Lösung habe, da ich sie jetzt verwende und sowohl meinen Pi aus der Ferne als auch mein lokales Kabelmodem neu gestartet habe - nur um sicher zu gehen. Aber zum Teufel, lassen Sie keine richtige Antwort herein der Weg eines übertriebenen, unverdienten Ego.
Jimminy Doe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.