Wie funktioniert Reverse-SSH-Tunneling?

350

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

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

Ich möchte Shell-Befehle auf einer entfernten Maschine 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 .

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

Was ist die Rolle des Schalters ( -R, -f, -L, -N)?

Ali
quelle

Antworten:

402

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 läuft in einem virtuellen Terminal (tty). 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, hat mit Ihrem SSH-Client begonnen und endet auf dem SSH-Server, mit dem Sie verbunden sind. Alle kleineren Röhren haben dieselben Endpunkte, mit der Ausnahme, dass die Rolle von "Start" oder "Ende" davon abhängt, ob Sie sie verwendet -Loder -R(bzw.) erstellt haben.

(Das haben Sie nicht gesagt, aber ich gehe davon aus, dass der "entfernte" Computer, den Sie erwähnt haben, der sich hinter der Firewall befindet, über 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 die er antwortet, sowie eine Adresse und einen Port, an die er übermittelt wird. Die -LOption weist den Tunnel an, auf der lokalen Seite des Tunnels (dem Host, auf dem Ihr Client ausgeführt wird) zu antworten. Die -ROption weist den Tunnel an, auf der Remote-Seite (dem SSH-Server) zu antworten.

SSH Tunnel Richtungen

Also ... Um aus dem Internet in eine Maschine hinter einer Firewall SSH zu können, muss die betreffende Maschine eine SSH-Verbindung zur Außenwelt herstellen und einen -RTunnel einschließen, dessen "Eintrittspunkt" die "entfernte" Seite von ist seine 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 -REmote-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 Ausgangspunkts des Tunnels (dh Ihres ssh-Clients) ist.

Die anderen Optionen sind:

  • -f Weist ssh an, sich nach der Authentifizierung im Hintergrund zu bewegen, damit Sie nicht auf dem Remote-Server herumstehen müssen, um den Tunnel am Leben zu erhalten.
  • -Ngibt an, dass Sie eine SSH-Verbindung benötigen, jedoch keine Remotebefehle ausführen möchten. Wenn Sie nur einen Tunnel erstellen, sparen Sie durch das Einschließen dieser Option Ressourcen.
  • -T Deaktiviert die Pseudo-Tty-Zuordnung. Dies ist angemessen, 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.

Es wird DRINGEND empfohlen, 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 über den Tunnel eine Verbindung zum Firewall-Host her:

ssh -p 22222 username@localhost

Sie erhalten eine Host-Schlüssel-Herausforderung, da Sie diesen Host wahrscheinlich noch nie zuvor getroffen haben. Dann erhalten Sie eine Passwortabfrage für das usernameKonto (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 Ihrer ~/.ssh/configDatei ein paar Zeilen hinzufügen :

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Anpassen remotehostnameund anpassen remoteusername. Das remoteusernameFeld muss mit Ihrem Benutzernamen auf dem Remote-Server übereinstimmen. Es remotehostnamekann sich jedoch auch um einen beliebigen Hostnamen handeln, der zu Ihnen passt. Es muss nichts Auflösbares enthalten.

(Um den Reverse-Endpunkt auf einer nicht lokalen Host- IP verfügbar zu machen , lesen Sie diesen Beitrag. )

ghoti
quelle
2
was ist mit ssh -D. Bitte erklären Sie mit der gleichen Methode.
BigSack
6
SOCKS-Proxys sind nicht dasselbe wie Tunnel. Wenn Sie eine Frage zu deren Verwendung haben, stellen Sie diese bitte .
Ghoti
12
Es fällt mir sehr schwer, diese Erklärung zu befolgen, da die Begriffe: Server, Client, lokaler Computer, Remotecomputer, Host, IhrPublichost, LocalHost, Remotehostname nicht immer verwendet werden. Mit all diesen losen und undefinierten Begriffen könnte angenommen werden, dass jemand bis zu 8 Computer benötigt, um dies einzurichten. Ich sage dies, weil es in allen anderen Aspekten eine sehr gute Erklärung zu sein scheint. Bitte reduzieren und definieren Sie Begriffe.
Rucent88
4
@ Rucent88, ich bin mir nicht sicher, welche Reduzierung möglich wäre. Ein Client stellt eine Verbindung zu einem Server her. Diese Terminologie ist in der ganzen Welt des Networking gebräuchlich. Lokale und entfernte Maschinen scheinen ziemlich selbstverständlich zu sein. Wenn Sie nach dem Lesen der Dokumentation über SSH oder die allgemeine Unix-Terminologie verwirrt sind, werden Sie hier mit Sicherheit problemlos Leute finden, die bereit sind, Ihre Fragen zu beantworten.
Ghoti
9
@ghoti Es ist in der Tat verwirrend, weil lokale und entfernte Maschinen relativ sind. Wenn ich am Arbeitsplatz sitze, ist mein Heimcomputer die Fernbedienung. Wenn ich zu Hause sitze, ist der Arbeitsplatzcomputer die Fernbedienung. Server und Client sind auch verwirrend, wenn es um Tunneling geht. Zum Beispiel, wenn ich mich mit ssh -R von der Arbeit nach Hause verbinde. Ich verbinde mich vom Heimcomputer aus mit meiner Arbeit, indem ich localhost verbinde. Aus der Sicht der Sockets ist der Server also der Heimcomputer. Aber logischerweise habe ich mich mit meinem Arbeitscomputer verbunden. Das ist verwirrend.
Calmarius
357

Ich habe ein paar Skizzen gezeichnet

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

SSH-Tunnel ab lokalen


SSH-Tunnel aus der Ferne

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 connectToHostbedeutet: verbinde dich mit ssh zu connectToHostund leite alle Verbindungsversuche an den lokalen sourcePort Port onPortdes aufgerufenen Rechners weiter forwardToHost, der vom connectToHostRechner aus erreichbar ist.

  2. Fernbedienung: -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 connectToHostbedeutet: verbinde dich mit ssh zu connectToHostund leite alle Verbindungsversuche an den entfernten sourcePort Port onPortdes angerufenen Rechners weiter forwardToHost, der von deinem lokalen Rechner aus erreichbar ist.

Zusätzliche Optionen

  • -f Weist ssh an, sich nach der Authentifizierung im Hintergrund zu bewegen, damit Sie nicht auf dem Remote-Server herumstehen müssen, um den Tunnel am Leben zu erhalten.
  • -Ngibt an, dass Sie eine SSH-Verbindung benötigen, jedoch keine Remotebefehle ausführen möchten. Wenn Sie nur einen Tunnel erstellen, sparen Sie durch das Einschließen dieser Option Ressourcen.
  • -T Deaktiviert die Pseudo-Tty-Zuordnung. Dies ist angemessen, da Sie nicht versuchen, eine interaktive Shell zu erstellen.

Dein Beispiel

Das dritte Bild zeigt diesen Tunnel. Aber der blaue Computer mit dem Namen »Ihr Host« repräsentiert den Computer, auf dem jemand den SSH-Tunnel startet, in diesem Fall die Firewall-Maschine.

Bitten Sie daher jemanden , eine SSH-Tunnelverbindung zu Ihrem Computer herzustellen. Der Befehl sollte im Grunde so aussehen

ssh -R 12345:localhost:22 YOURIP

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

ssh -p 12345 localhost

Diese Verbindung wird mit Ihrer eigenen localhost(Ihrer Maschine) über den Port hergestellt 12345, der Port 12345wird jedoch über den Tunnel an den Port 22 des lokalen Hosts des Firewall-Computers (dh des Firewall-Computers selbst) weitergeleitet.

erik
quelle
9
Gute Antwort! Wird dies in einer Präsentation verwenden.
Jesaja Turner
4
Danke. Bitte. Wenn Sie die Vektorgrafiken (svg oder pdf) möchten, schreiben Sie mir eine Nachricht.
Erik
1
@erik, Wie hast du diese Bilder gezeichnet?
Pacerier
31
oh man, ich wünschte die manpages könnten solche erklärungen haben! Vielen Dank!
Lucas Pottersky
30
Weißt du was ? Ich musste nicht einmal die Texterklärung lesen. Gute Arbeit !
Deppfx
21

Das SSH-Tunneln funktioniert unter Verwendung der bereits eingerichteten 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 separat 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 die Kanal-Fobar".

Es funktioniert im Wesentlichen so:

  1. Sie weisen ssh an, auf Port XXXX zu lauschen und den empfangenen Datenverkehr zu tunneln und dann auf Port ZZZZ auf YYYY zu setzen.
  2. Das lokale ssh beginnt an Port XXXX zu lauschen (im Allgemeinen an 127.0.0.1, kann aber geändert werden).
  3. Einige Anwendungen öffnen eine Verbindung zu Port XXXX auf dem lokalen Computer.
  4. Der lokale SSH öffnet einen Kanal für den Remote-SSH und sagt "Jeder Verkehr auf diesem Kanal geht an JJJJ: ZZZZ
  5. Der Remote-SSH verbindet sich mit JJJJ: ZZZZ und sendet die Meldung "OK, Kanal ist offen" zurück.
  6. Jeglicher Datenverkehr, der über die Verbindung zu Port XXXX auf dem lokalen Computer gesendet wird, wird nun von ssh an YYYY: ZZZZ weitergeleitet.

Dieser Vorgang ist sowohl für das Vorwärts- als auch für das Rückwärts-Tunneln identisch (tauschen Sie einfach die Wörter 'local' und 'remote' in der obigen Prozedur 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 CHARACTERSspeziell ~C).

Für die Rolle der -R, -f, -L, und -N, sollten Sie wirklich nur den Mann Seite konsultieren, es gibt Ihnen die bestmögliche Erklärung. Aber ich werde erwähnen -Rund -L.
-RWeist den Remote-SSH an, auf Verbindungen zu warten, und dass der lokale SSH eine Verbindung zum realen Ziel herstellen soll. -LWeist 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 Sie genug Informationen erhalten sollten, um zu wissen, was los ist

Patrick
quelle
16

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 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 bind_address gebunden ist.

Immer wenn eine Verbindung zu diesem Port hergestellt wird, wird die Verbindung über den sicheren Kanal weitergeleitet und eine Verbindung zum hostPort hostportdes Remotecomputers hergestellt .

Im folgenden Beispiel wird eine IRC-Sitzung vom Clientcomputer 127.0.0.1( localhost) über Port 1234 zum Remoteserver getunnelt server.example.com:

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

Hinweis: Die -fOption backgrounds ssh und der Befehl remote werden sleep 10angegeben, um den zu tunnelnden Dienst für einen bestimmten Zeitraum zu starten.

Beispiel:

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

    Führen Sie keinen Remote-Befehl aus.

  • -L 22000Die Verbindung wird ihren Ursprung auf Port 22000 Ihrer persönlichen, L Ocal Maschine

  • localhost:11000- remote.server.comwird sicherstellen, dass das andere Ende des Tunnels localhost, Port ist11000

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

Quelle: Eine illustrierte Anleitung, Tutorial, How-to, zum SSH-Tunneling .


-R

-R [bind_address:]port:host:hostport

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

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

Beispiel:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N Nachdem Sie eine Verbindung hergestellt haben, bleiben Sie einfach hängen (es wird keine Shell-Eingabeaufforderung angezeigt).

    Führen Sie keinen Remote-Befehl aus.

  • -R22000 Die Verbindung auf Port 22000 des Ursprung wird R emote Computers (in diesem Fall remote.server.com)

  • localhost:11000Ihr persönlicher, lokaler Computer stellt sicher, dass das andere Ende des Tunnels der localhostPort ist11000

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

Quelle: Eine illustrierte Anleitung, Tutorial, How-to, zum SSH-Tunneling .

Kenorb
quelle
6
Ohr und Mund machen klar, wer spricht und wer zuhört!
Thufir
1
Ich liebe deine Illustrationen!
Mcantsin