it-swarm.com.de

Wie funktioniert das Reverse-SSH-Tunneling?

Soweit ich weiß, verweigern Firewalls (unter der Annahme von Standardeinstellungen) den gesamten eingehenden Datenverkehr, für den zuvor kein entsprechender ausgehender Datenverkehr vorhanden war.

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

Ich möchte Shell-Befehle auf einem Remote-Computer ausführen. Der Remotecomputer verfügt über eine eigene Firewall und befindet sich hinter einer zusätzlichen Firewall (Router). Es hat eine IP-Adresse wie 192.168.1.126 (oder ähnliches). Ich bin nicht hinter einer Firewall und kenne die IP-Adresse des Remotecomputers aus dem Internet (nicht die Adresse 192.168.1.126). Außerdem kann ich jemanden bitten, zuerst ssh (something) als root auf dem Remote-Computer auszuführen.

Könnte mir jemand Schritt für Schritt erklären, wie das umgekehrte SSH-Tunneln funktioniert, um die Firewalls zu umgehen (die Firewalls lokaler und entfernter Maschinen und die zusätzliche Firewall zwischen ihnen)?

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

376
Ali

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 Remotecomputer auszuführen. Die Shell wird in einem virtuellen Terminal (tty) ausgeführt. Aber du kennst diesen Teil 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 auf dem SSH-Server, mit dem Sie verbunden sind. Alle kleineren Röhren haben die gleichen Endpunkte, außer dass die Rolle von "Start" oder "Ende" davon abhängt, ob Sie -L Oder -R Zum Erstellen verwendet haben.

(Sie haben es nicht gesagt, aber ich gehe davon aus, dass der von Ihnen erwähnte "Remote" -Computer, der sich hinter der Firewall befindet, mithilfe von Network Address Translation (NAT) auf das Internet zugreifen kann. Dies ist also ziemlich wichtig Bitte korrigieren Sie diese Annahme, wenn sie falsch ist.)

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

ssh tunnel directions

Also ... Um SSH aus dem Internet auf einen Computer hinter einer Firewall übertragen zu können, muss der betreffende Computer eine SSH-Verbindung zur Außenwelt herstellen und einen -R - Tunnel einschließen, dessen "Einstiegspunkt" ist die "entfernte" Seite seiner Verbindung.

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

Vom Firewall-Host:

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

Dies weist Ihren Client an, einen Tunnel mit einem -R Emote-Einstiegspunkt einzurichten. Alles, was an Port 22222 am anderen Ende des Tunnels angeschlossen ist, erreicht tatsächlich "localhost port 22", wobei "localhost" aus der Perspektive des Austrittspunkts des Tunnels (d. H. Ihres ssh-Clients) ist.

Die anderen Optionen sind:

  • -f Weist ssh an, sich nach der Authentifizierung selbst in den Hintergrund zu stellen, sodass Sie nicht herum sitzen müssen, um etwas auf dem Remote-Server auszuführen, damit der Tunnel am Leben bleibt.
  • -N Gibt an, dass Sie eine SSH-Verbindung wünschen, aber keine Remote-Befehle ausführen möchten. Wenn Sie nur einen Tunnel erstellen, werden durch das Einfügen dieser Option Ressourcen gespart.
  • -T Deaktiviert die Pseudo-Tty-Zuweisung. Dies ist angemessen, da Sie nicht versuchen, eine interaktive Shell zu erstellen.

Es wird eine Kennwortabfrage geben, es sei denn, Sie haben DSA- oder RSA-Schlüssel für eine kennwortlose 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 eingerichtet haben.

Stellen Sie nun von Ihrer Shell aus yourpublichost über den Tunnel eine Verbindung zum Firewall-Host her:

ssh -p 22222 [email protected]

Sie erhalten eine Host-Schlüsselherausforderung, da Sie diesen Host wahrscheinlich noch nie zuvor getroffen haben. Anschließend erhalten Sie eine Kennwortabfrage für das Konto username (es sei denn, Sie haben Schlüssel für die kennwortlose Anmeldung eingerichtet).

Wenn Sie regelmäßig auf diesen Host zugreifen möchten, können Sie den Zugriff auch vereinfachen, indem Sie Ihrer ~/.ssh/config - Datei einige Zeilen hinzufügen:

Host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Passen Sie remotehostname und remoteusername an. Das Feld remoteusername muss mit Ihrem Benutzernamen auf dem Remote-Server übereinstimmen, aber remotehostname kann ein beliebiger Hostname sein, der zu Ihnen passt. Es muss nicht mit einem auflösbaren Namen übereinstimmen.

Siehe auch:

433
ghoti

Ich habe einige Skizzen gezeichnet

Die Maschine, auf der der Befehl ssh tunnel eingegeben wird, heißt "Ihr Host".

ssh tunnel starting from local


ssh tunnel starting from remote

Einführung

  1. lokal: -L Specifies that the given port on the local (client) Host is to be forwarded to the given Host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost Bedeutet: Verbinden Sie sich mit ssh mit connectToHost und leiten Sie alle Verbindungsversuche an localsourcePort an Port onPort weiter Maschine namens forwardToHost, die von der Maschine connectToHost aus erreichbar ist.

  2. remote: -R Specifies that the given port on the remote (server) Host is to be forwarded to the given Host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost Bedeutet: Verbinden Sie sich mit ssh mit connectToHost und leiten Sie alle Verbindungsversuche an remotesourcePort an Port onPort weiter Maschine namens forwardToHost, die von Ihrem lokalen Computer aus erreichbar ist.

Zusätzliche Optionen

  • -f Weist ssh an, sich nach der Authentifizierung selbst in den Hintergrund zu stellen, sodass Sie nicht herum sitzen müssen, um etwas auf dem Remote-Server auszuführen, damit der Tunnel am Leben bleibt.
  • -N Gibt an, dass Sie eine SSH-Verbindung wünschen, aber keine Remote-Befehle ausführen möchten. Wenn Sie nur einen Tunnel erstellen, werden durch das Einfügen dieser Option Ressourcen gespart.
  • -T Deaktiviert die Pseudo-Tty-Zuweisung. Dies ist angemessen, da Sie nicht versuchen, eine interaktive Shell zu erstellen.

Dein Beispiel

Das dritte Bild zeigt diesen Tunnel. Aber der blaue Computer namens "Ihr Host" repräsentiert den Computer, auf dem jemand den SSH-Tunnel startet, in diesem Fall den Firewall-Computer .

Bitten Sie also jemanden , eine SSH-Tunnelverbindung zu Ihrem Computer herzustellen. Der Befehl sollte grundsätzlich so aussehen

ssh -R 12345:localhost:22 YOURIP

Jetzt ist der Tunnel geöffnet. Sie können jetzt mit dem Befehl über ssh über den Tunnel eine Verbindung zum Firewall-Computer herstellen

ssh -p 12345 localhost

dieser stellt eine Verbindung zu Ihrem eigenen localhost (Ihrem Computer) an Port 12345 her, aber Port 12345 wird über den Tunnel an Port 22 des lokalen Hosts des Firewall-Computers weitergeleitet (d. h der Firewall-Computer selbst).

389
erik

das SSH-Tunneln verwendet die bereits hergestellte SSH-Verbindung zum Senden von zusätzlichem Datenverkehr.

Wenn Sie eine Verbindung zu einem Remote-Server herstellen, haben Sie normalerweise nur 1 Kanal für die normale Benutzerinteraktion (oder 3 Kanäle, wenn Sie STDIN/STDOUT/STDERR als getrennt betrachten). Der lokale oder Remote-SSH-Prozess kann jederzeit zusätzliche Kanäle für die vorhandene Verbindung öffnen. Diese Kanäle senden/empfangen dann den Tunnelverkehr. Beim Senden oder Empfangen von Datenverkehr sagt der SSH-Prozess einfach "Dieser Datenverkehr ist für Channel Foobar".

Es funktioniert im Wesentlichen so:

  1. Sie weisen ssh an, Port XXXX abzuhören und den empfangenen Datenverkehr zu tunneln und dann an Port ZZZZ auf Y.Y.Y.Y zu setzen.
  2. Das lokale SSH beginnt, Port XXXX abzuhören (im Allgemeinen 127.0.0.1, kann aber geändert werden).
  3. Einige Anwendungen stellen eine Verbindung zu Port XXXX auf dem lokalen Computer her.
  4. Das lokale SSH öffnet einen Kanal zum Remote-SSH und sagt: "Jeder Verkehr auf diesem Kanal geht an Y.Y.Y.Y: ZZZZ
  5. Das Remote-SSH stellt eine Verbindung zu Y.Y.Y.Y: ZZZZ her und sendet das "OK, Kanal ist offen" zurück.
  6. Jetzt wird jeglicher Datenverkehr, der über die Verbindung zu Port XXXX auf dem lokalen Computer gesendet wird, von ssh an Y.Y.Y.Y: ZZZZ weitergeleitet.

Dieser Vorgang ist für das Vorwärts- und Rückwärts-Tunneln genau gleich (tauschen Sie im obigen Verfahren einfach die Wörter "lokal" und "entfernt" aus). Jede Seite kann den Tunnel starten. Es muss nicht einmal sein, wenn Sie ssh zum ersten Mal starten. Sie können Tunnel öffnen, während ssh bereits ausgeführt wird (siehe ESCAPE CHARACTERS, speziell ~C).

Für die Rolle von -R, -f, -L, und -N, du solltest wirklich nur die Manpage konsultieren, sie gibt dir die bestmögliche Erklärung. Aber ich werde -R und -L.
-R weist den Remote-SSH an, auf Verbindungen zu warten, und dass der lokale SSH eine Verbindung zum realen Ziel herstellen soll. -L weist den lokalen SSH an, auf Verbindungen zu warten, und dieser Remote-SSH sollte eine Verbindung zum realen Ziel herstellen.

Beachten Sie, dass dies eine sehr grobe Beschreibung ist, aber es sollte Ihnen genügend Informationen geben, um zu wissen, was los ist

24
Patrick

Dies wird im SSH-Handbuch erläutert, insbesondere die Unterschiede zwischen -L (Lokal) und -R (Remote).


-L

-L [bind_address:]port:Host:hostport

Gibt an, dass der angegebene Port auf dem lokalen (Client-) Host an den angegebenen Host und den angegebenen Port auf der Remote-Seite weitergeleitet werden soll .

Dies funktioniert durch Zuweisen eines Sockets zum Abhören des Ports auf der lokalen Seite, der optional an die angegebene Bindungsadresse gebunden ist.

Immer wenn eine Verbindung zu diesem Port hergestellt wird , wird die Verbindung über den sicheren Kanal weitergeleitet und eine Verbindung hergestellt . zum Host Port hostport vom Remote-Computer .

Das folgende Beispiel tunnelt eine IRC -Sitzung vom Clientcomputer 127.0.0.1 (localhost) über Port 1234 zum Remote-Server server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Hinweis: Die Option -f Hinterlegt ssh und der Remote-Befehl sleep 10 Wird angegeben, um eine gewisse Zeit zum Starten des Dienstes zu ermöglichen, der getunnelt werden soll.

Beispiel:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N Nachdem Sie eine Verbindung hergestellt haben, hängen Sie einfach dort (Sie erhalten keine Shell-Eingabeaufforderung).

    Führen Sie keinen Remote-Befehl aus.

  • -L 22000 Die Verbindung wird über Port 22000 Ihrer persönlichen [~ # ~] l [~ # ~] lokalen Maschine hergestellt

  • localhost:11000 - remote.server.com Stellt sicher, dass das andere Ende des Tunnels localhost, Port 11000 Ist.

(ssh -N -L 22000:192.168.1.2:11000 remote.server.com

Quelle: Eine illustrierte Anleitung, ein Tutorial, eine Anleitung zum SSH-Tunneling .


-R

-R [bind_address:]port:Host:hostport

Gibt an, dass der angegebene Port auf dem Remote Server-) Host an den angegebenen Host und den Port auf der lokalen Seite weitergeleitet werden soll .

Dies funktioniert durch Zuweisen eines Sockets zum Abhören von port auf der Remote-Seite. Wenn eine Verbindung zu diesem Port hergestellt wird , wird die Verbindung weitergeleitet über den sicheren Kanal, und eine Verbindung zum Host Port hostport vom lokalen Computer wird hergestellt.

Beispiel:

ssh -N -R 22000:localhost:11000 remote.server.com

--- ((ssh -N -R 22000:localhost:11000 remote.server.com

Quelle: Eine illustrierte Anleitung, ein Tutorial, eine Anleitung zum SSH-Tunneling .

18
kenorb