Soweit ich weiß, verweigern Firewalls (unter der Annahme von Standardeinstellungen) den gesamten eingehenden Verkehr, für den zuvor kein entsprechender ausgehender Verkehr vorhanden war.
Basierend auf Umkehren einer SSH-Verbindung und SSH-Tunneling leicht gemacht , kann das umgekehrte SSH-Tunneling verwendet werden um lästige Firewall-Einschränkungen.
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, ssh (something)
auszuführen Zuerst als Root auf dem Remotecomputer.
Kann mir jemand Schritt für Schritt erklären, wie das umgekehrte SSH-Tunneln funktioniert, um die Firewalls zu umgehen (lokale und Remotecomputer „Firewalls und die zusätzliche Firewall zwischen ihnen)?
Welche Rolle spielen die Schalter (-R
, -f
, -L
, -N
)?
Kommentare
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 Remotecomputer auszuführen. Die Shell wird in einem virtuellen Terminal (tty) ausgeführt. Sie kennen diesen Teil jedoch bereits.
Stellen Sie sich Ihren Tunnel als 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 wurde mit Ihrem SSH-Client gestartet und endet auf dem SSH-Server, mit dem Sie eine Verbindung hergestellt haben. Alle kleineren Röhren haben dieselben Endpunkte, außer dass die Rolle von „Start“ oder „Ende“ davon abhängt, ob Sie -L
oder -R
(jeweils), um sie zu erstellen.
(Sie haben es nicht gesagt, aber ich gehe davon aus dass der von Ihnen erwähnte „Remote“ -Maschine, der sich hinter der Firewall befindet, mithilfe von Network Address Translation (NAT) auf das Internet zugreifen kann. Dies ist sehr wichtig. Korrigieren Sie diese Annahme daher, wenn sie falsch ist.)
Wenn Sie einen Tunnel erstellen, geben Sie eine Anzeige an Kleid und Hafen, auf den es antworten wird, und Adresse und Hafen, an die es geliefert wird. Die Option -L
weist den Tunnel an, auf der lokalen Seite des Tunnels zu antworten (dem Host, auf dem Ihr Client ausgeführt wird). Die Option -R
weist den Tunnel an, auf der Remote-Seite (dem SSH-Server) zu antworten.
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 eine -R
Tunnel, dessen“ Einstiegspunkt „die“ entfernte „Seite seiner Verbindung ist.
Von den beiden oben gezeigten Modellen möchten Sie das rechte.
Vom Firewall-Host:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Hiermit wird Ihr Client angewiesen, einen Tunnel mit einem -R
Emote-Eintrag einzurichten Punkt. 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 (dh Ihres ssh-Clients) ist.
Die anderen Optionen sind:
-
-f
weist ssh an, sich nach der Authentifizierung selbst in den Hintergrund zu stellen, damit Sie nicht herum sitzen und etwas auf dem ausführen müssen Remote-Server, 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 Einschließen dieser Option Ressourcen gespart. -
-T
deaktiviert die Pseudo-tty-Zuweisung, was angemessen ist, da Sie dies nicht tun Es wird versucht, eine interaktive Shell zu erstellen.
Es wird eine Kennwortabfrage durchgeführt, es sei denn, Sie haben DSA- oder RSA-Schlüssel für eine kennwortlose Anmeldung eingerichtet.
Beachten Sie, dass dies STARK ist Es wird empfohlen, ein Wegwerfkonto (nicht Ihr eigenes Login) zu verwenden, das Sie nur für diesen Tunnel / Kunden / Server eingerichtet haben.
Nun von Ihrer Shell auf yourpublichost , stellen Sie über den Tunnel eine Verbindung zum Firewall-Host her:
ssh -p 22222 username@localhost
Sie „ll Holen Sie sich eine Host-Key-Herausforderung, da Sie diesen Host wahrscheinlich noch nie zuvor getroffen haben. Dann 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. Die remoteusername
Feld 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 Element übereinstimmen.
Siehe auch:
- Legen Sie den umgekehrten Endpunkt auf einem offen non-localhost IP
- Tipps zur Verwendung von
ControlMaster
um Ihren Tunnel zu warten
Kommentare
- Was ist mit ssh -D? Bitte erläutern Sie dies mit derselben Methode.
- SOCKS-Proxys sind nicht mit Tunneln identisch. Wenn Sie Fragen zur Verwendung haben, wenden Sie sich bitte an .
- I ‚ Ich habe es aufgrund der losen Verwendung von Begriffen sehr schwer, dieser Erklärung zu folgen: Server, Client, lokaler Computer, Remote-Computer, Host, yourpublichost, localhost, remotehostname. Bei all diesen losen und undefinierten Begriffen kann davon ausgegangen 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, ich ‚ bin mir nicht sicher, welche Reduzierung möglich wäre. Ein Client stellt eine Verbindung zu einem Server her. Diese ‚ ist in der gesamten Netzwerkwelt gebräuchliche Terminologie. 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, bin ich ‚ sicher, dass Sie ‚ Ich werde keine Probleme haben, Leute zu finden, die sehr bereit sind, Ihre Fragen zu beantworten.
- @ghoti ‚ ist in der Tat verwirrend, weil lokal und entfernte Maschinen sind relativ. 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 von der Arbeit mit ssh -R nach Hause verbinde. Ich verbinde mich vom Heimcomputer aus mit meiner Arbeit, indem ich localhost verbinde. Aus Sicht der Sockets ist der Server also der Heimcomputer. Aber logischerweise habe ich mich mit meinem Arbeitscomputer verbunden. Das ‚ ist verwirrend.
Antwort
Ich habe gezeichnet Einige Skizzen
Die Maschine, auf der der Befehl ssh tunnel eingegeben wird, heißt »Ihr Host« .
Einführung
-
local:
-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: Verbinde dich mit ssh mitconnectToHost
und leite alle Verbindungsversuche an die localsourcePort
zum PortierenonPort
auf dem Computer mit dem NamenforwardToHost
,. Dies kann von derconnectToHost
Maschine erreicht werden. -
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: Verbindung mit ssh zuconnectToHost
und Leiten Sie alle Verbindungsversuche an die RemotesourcePort
an Port auf dem Computer mit dem NamenforwardToHost
, der 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 ausgeführt werden kann am Leben bleiben. -
-N
sagt, dass Sie eine SSH-Verbindung wünschen, aber keine Remote-Befehle ausführen möchten. Wenn Sie nur einen Tunnel erstellen, werden durch das Einschließen dieser Option Ressourcen gespart. -
-T
deaktiviert die Pseudo-tty-Zuweisung, was angemessen ist, da Sie dies nicht tun versuchen, eine interaktive Shell zu erstellen.
Ihr Beispiel
Das dritte Bild repräsentiert 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 der Firewall-Computer.
Bitten Sie also jemanden , eine SSH-Tunnelverbindung zu Ihrem Computer herzustellen. Der Befehl sollte grundsätzlich wie folgt aussehen:
ssh -R 12345:localhost:22 YOURIP
Jetzt wird der Tunnel geöffnet.Sie können jetzt über ssh über den Tunnel mit dem Befehl
ssh -p 12345 localhost
eine Verbindung zum Firewall-Computer herstellen, der eine Verbindung zu Ihrem eigenen localhost
(Ihr Computer) an Port 12345
, aber Port 12345
wird über den Tunnel an Port 22 des lokalen Hosts der Firewall weitergeleitet Computer (dh der Firewall-Computer selbst).
Kommentare
- @erik, Wie haben Sie diese Bilder gezeichnet?
- I. Ich habe das Open-Source-Vektor-Zeichenwerkzeug Inkscape und meine Mäuse verwendet (eigentlich handelt es sich um einen Trackball: Marble FX von Logitech).
- @ghoti: Standardmäßig ist der Listening-Socket auf dem Server (in meinem -R-Image der gelbe Remotehost) nur an die Loopback-Schnittstelle gebunden. Dies kann durch Angabe einer bind_address überschrieben werden. Eine leere Bindungsadresse oder die Adresse „*“ gibt an, dass der Remote-Socket alle Schnittstellen abhören soll. – Probieren Sie es einfach aus: Starten Sie auf einem blauen Computer
ssh -R 1234:localhost:8000 yellowcomputer
. Und auch auf der blauen Maschine starten Siepython -m SimpleHTTPServer
(ein einfacher Webserver auf Port 8000). Dann öffnen Sie in einem Webbrowser auf dem gelben Computer die URLhttp://localhost:1234
und Sie werden sehen, dass es funktioniert. - @erik, ah, der verwirrende Teil ist, weil meine Augen sind schlecht – Ich habe ‚ das Leerzeichen vor
remotehost
in Ihren Befehlen nicht gesehen. Bei näherer Betrachtung sehe ich, dass Ihre Diagramme ‚ die optionale bind_address überhaupt nicht adressieren. Entschuldigen Sie die Verwirrung. - @briankip Ja, natürlich. Zumindest, wenn Sie eine SSH-Verbindung zum Computer hinter der Firewall herstellen möchten (über den Tunnel oder direkt, wenn die Firewall dies zulässt). Das heißt: Der ssh-Befehl, den Sie auf dem Firewall-Computer schreiben, öffnet nur einen Tunnel, aber startet nicht oder arbeitet nicht als ssh-Daemon / -Server. Ihre nächste Frage sollte lauten: , wie Sie eine sshd ohne Root-Rechte starten können (wenn dies Ihr Problem ist). 🙂
Antwort
Das SSH-Tunneling 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 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 die Kanal-Foobar“.
Dies funktioniert im Wesentlichen folgendermaßen:
- Sie weisen ssh an, mit dem Abhören zu beginnen auf Port XXXX und dass empfangener Datenverkehr getunnelt und dann auf Port ZZZZ auf JJJJ gesetzt werden sollte.
- Der lokale SSH beginnt, Port XXXX abzuhören (im Allgemeinen auf
127.0.0.1
, kann aber geändert werden). - Einige Anwendungen stellen eine Verbindung zu Port XXXX auf dem lokalen Computer her.
- Der lokale SSH öffnet einen Kanal zum Remote-SSH und sagt „jeglicher Datenverkehr“ auf diesem Kanal geht zu JJJJ: ZZZZ
- Der Remote-SSH stellt eine Verbindung zu JJJJ: ZZZZ her und sendet das „OK, Kanal ist offen“ zurück
- Jetzt wird jeglicher Datenverkehr über die Verbindung zum Port gesendet XXXX auf dem lokalen Computer wird von ssh an JJJJ: ZZZZ weitergeleitet.
Dieser Vorgang ist für Vorwärts- und Rückwärts-Tunneling genau gleich (tauschen Sie einfach die Wörter „lokal“ und „remote“ aus das obige Verfahren). Jede Seite kann den Tunnel starten 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
, insbesondere ~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
erwähnen.
-R
teilt dem entfernten ssh mit -L
weist den lokalen ssh an, auf Verbindungen zu warten, und dass der entfernte ssh eine Verbindung zum realen Ziel herstellen soll.
Beachten Sie, dass dies eine sehr grobe Beschreibung ist, aber Sie sollten genügend Informationen erhalten, um zu wissen, was los ist.
Antwort
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 weitergeleitet werden soll Port auf der Remote-Seite .
Dies funktioniert, indem ein Socket zugewiesen wird, um den Port auf der lokalen Seite abzuhören, der optional an die angegebene Bindungsadresse gebunden ist.
Immer wenn eine Verbindung zu diesem Port hergestellt wird, Die Verbindung wird über den sicheren Kanal weitergeleitet und eine Verbindung an
host
Porthostport
vom Remote-Computer .
Im folgenden Beispiel wird 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
Hintergrund 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 Ihres persönlichen L ocal machine -
localhost:11000
–remote.server.com
stellt sicher, dass das andere Ende des Tunnelslocalhost
, Port11000
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 g weitergeleitet werden soll iven Host und Port auf der lokalen Seite .
Dies funktioniert durch Zuweisen eines Sockets zum Abhören von
port
on Auf der Remote-Seite und wenn eine Verbindung zu diesem Port hergestellt wird, wird die Verbindung über den sicheren Kanal und eine Verbindung weitergeleitet wird zumhost
Porthostport
vom lokalen Computer .
Beispiel:
ssh -N -R 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.
-
-R
22000 Die Verbindung wird hergestellt an Port 22000 des R Emote-Computers (in diesem Fall remote.server.com) -
Ihr persönlicher lokaler Computer stellt sicher, dass das andere Ende des Tunnels
localhost
, Port11000
Quelle: Eine illustrierte Anleitung, ein Tutorial, eine Anleitung zum SSH-Tunneling .
Kommentare
- Ohr und Mund machen kristallklar, wer ‚ spricht und wer ‚ hört zu!
- Ich liebe deine Illustrationen!
Antwort
Die Bindung an Netzwerkschnittstellen beim Einrichten von Reverse-SSH-Tunneln wird in diesem -Post erläutert. Hier ist ein Beispiel mit 4 Computern in zwei verschiedenen Netzwerken: