GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ssh – Wie funktioniert Reverse-SSH-Tunneling?

So wie ich das verstehe, verweigern Firewalls (unter der Annahme von Standardeinstellungen) den gesamten eingehenden Datenverkehr, für den zuvor kein entsprechender ausgehender Datenverkehr vorhanden war.

Basierend auf Umkehren einer SSH-Verbindung und SSH-Tunneling leicht gemacht, kann umgekehrtes SSH-Tunneling verwendet werden, um lästige Firewall-Einschränkungen zu umgehen.

Ich möchte Shell-Befehle auf einem Remote-Computer ausführen. Die entfernte Maschine hat eine eigene Firewall und befindet sich hinter einer zusätzlichen Firewall (Router). Es hat eine IP-Adresse wie 192.168.1.126 (oder etwas Ähnliches). Ich befinde mich nicht hinter einer Firewall und kenne die IP-Adresse des Remote-Computers aus dem Internet (nicht die Adresse 192.168.1.126). Außerdem kann ich jemanden bitten, ssh (something) auszuführen zuerst als root auf dem Remote-Rechner.

Kann mir jemand Schritt für Schritt erklären, wie Reverse-SSH-Tunneling funktioniert, um die Firewalls (die Firewalls der lokalen und entfernten Rechner und die zusätzliche Firewall dazwischen) zu umgehen?

Welche Rolle spielen die Schalter (-R , -f , -L , -N )?

Akzeptierte Antwort:

Ich liebe es, solche Dinge durch Visualisierung zu erklären. 🙂

Stellen Sie sich Ihre SSH-Verbindungen als Röhren vor. Große Röhren. Normalerweise greifen Sie durch diese Röhren, um eine Shell auf einem entfernten Computer auszuführen. Die Shell läuft in einem virtuellen Terminal (tty). Aber diesen Teil kennst du ja schon.

Stellen Sie sich Ihren Tunnel als eine Röhre in einer Röhre vor. Sie haben immer noch die große SSH-Verbindung, aber mit der Option -L oder -R können Sie eine kleinere Röhre darin einrichten.

Jede Röhre hat einen Anfang und ein Ende. Die große Röhre, Ihre SSH-Verbindung, begann mit Ihrem SSH-Client und endet bei dem SSH-Server, mit dem Sie sich verbunden haben. Alle kleineren Röhren haben dieselben Endpunkte, außer dass die Rolle von „Start“ oder „Ende“ dadurch bestimmt wird, ob Sie -L verwendet haben oder -R (bzw.) um sie zu erstellen.

(Sie haben es nicht gesagt, aber ich gehe davon aus, dass der von Ihnen erwähnte „entfernte“ Computer hinter der Firewall mithilfe von Network Address Translation (NAT) auf das Internet zugreifen kann. Das ist also ziemlich wichtig bitte korrigieren Sie diese Annahme, falls sie falsch ist.)

Wenn Sie einen Tunnel erstellen, geben Sie eine Adresse und einen Port an, auf denen er antwortet, sowie eine Adresse und einen Port, an den er geliefert wird. Das -L Die Option weist den Tunnel an, auf der lokalen Seite des Tunnels zu antworten (dem Host, auf dem Ihr Client ausgeführt wird). Das -R Option weist den Tunnel an, auf der entfernten Seite (dem SSH-Server) zu antworten.

Also… Um in der Lage zu sein, SSH aus dem Internet in eine Maschine hinter einer Firewall zu schicken, muss die betreffende Maschine eine SSH-Verbindung zur Außenwelt öffnen und ein -R einfügen Tunnel, dessen „Eintrittspunkt“ die „entfernte“ Seite seiner Verbindung ist.

Von den beiden oben gezeigten Modellen möchten Sie das rechte.

Verwandte:Gibt es eine Möglichkeit, mit verschachtelten CollectionViews in Xamarin Forms mit MvvmCross zu arbeiten?

Vom Firewall-Host:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Dies weist Ihren Client an, einen Tunnel mit einem -R aufzubauen Emote-Einstiegspunkt. Alles, was an Port 22222 am anderen Ende des Tunnels angeschlossen wird, erreicht tatsächlich „localhost port 22“, wobei „localhost“ aus der Perspektive des Ausgangspunkts des Tunnels (d. h. Ihres ssh-Clients) steht.

Die anderen Optionen sind:

  • -f weist ssh an, sich nach der Authentifizierung in den Hintergrund zu begeben, sodass Sie nicht herumsitzen müssen, um etwas auf dem Remote-Server auszuführen, damit der Tunnel am Leben bleibt.
  • -N sagt, dass Sie eine SSH-Verbindung wünschen, aber eigentlich keine Remote-Befehle ausführen möchten. Wenn Sie nur einen Tunnel erstellen, spart das Einbeziehen dieser Option Ressourcen.
  • -T deaktiviert die Pseudo-TTY-Zuweisung, was angemessen ist, da Sie nicht versuchen, eine interaktive Shell zu erstellen.

Es wird eine Passwortabfrage geben, es sei denn, Sie haben DSA- oder RSA-Schlüssel für eine passwortlose Anmeldung eingerichtet.

Beachten Sie, dass es DRINGEND empfohlen wird, ein Wegwerfkonto (nicht Ihr eigenes Login) zu verwenden, das Sie nur für diesen Tunnel/Kunden/Server einrichten.

Jetzt von Ihrer Shell aus auf yourpublichost , stellen Sie über den Tunnel eine Verbindung zum Firewall-Host her:

ssh -p 22222 [email protected]

Sie erhalten eine Host-Key-Herausforderung, da Sie diesen Host wahrscheinlich noch nie getroffen haben. Dann erhalten Sie eine Passwortabfrage für den username Konto (es sei denn, Sie haben Schlüssel für die passwortlose Anmeldung eingerichtet).

Wenn Sie regelmäßig auf diesen Host zugreifen, können Sie den Zugriff auch vereinfachen, indem Sie ein paar Zeilen zu Ihrem ~/.ssh/config hinzufügen Datei:

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Passen Sie remotehostname an und remoteusername passen. Der remoteusername muss mit Ihrem Benutzernamen auf dem Remote-Server übereinstimmen, aber mit remotehostname kann ein beliebiger Hostname sein, der zu Ihnen passt, er muss mit nichts Auflösbarem übereinstimmen.

  • Stellen Sie den Reverse-Endpunkt auf einem nicht lokalen Host bereit IP
  • Tipps zur Verwendung von ControlMaster um Ihren Tunnel zu warten

Linux
  1. So richten Sie einen Reverse-SSH-Tunnel unter Linux ein

  2. Wie funktioniert ein Debugger unter Linux?

  3. Wie funktioniert der ps-Befehl?

  4. Wie funktioniert die Loopback-Schnittstelle?

  5. Wie richte ich einen SSH-Tunnel ein, um SSH weiterzuleiten?

Wie funktioniert SSH?

Wie funktioniert Git?

Was ist Reverse-DNS und wie funktioniert es?

Wie funktioniert Swap-Speicher in Linux?

Wie funktioniert die Anzeige von Linux?

SSH-Verbindung über einen Reverse (Remote) SSH-Tunnel