Reverse-Port-Tunneling

59

Ich muss jemandem morgen eine Website zeigen, die auf meinem lokalen Computer ausgeführt wird. Normalerweise würde ich dies durch Portweiterleitung auf meinem lokalen Router erreichen, aber da die Hardware ausfällt und der Ersatz schrecklich ist, kann ich auf meinem aktuellen Router keine Portweiterleitung durchführen.

Da ich mit dieser Verzögerung konfrontiert war und das Ganze nicht auf einen richtigen Server übertragen wollte, kam mir die verrückte Idee: Kann ich meinen Port einfach über SSH an einen externen Server weiterleiten?

Ich habe schon Port-Tunneling gemacht, aber normalerweise mache ich es richtig herum:

  • Ich stelle eine Verbindung zu einer Remote-Box her und frage, ob Port 12345 auf meinem lokalen Computer unter Port 12345 angezeigt wird.
  • Ich starte etwas auf P12345 auf der Remote-Maschine
  • Ich kann es über localhost zugreifen: 12345

Was ich machen möchte :

  • Eine Verbindung mit einem Remote - PC und darum bitten , dass , dass seine lokale P12345 Dinge von meinem lokalen P12345 holen (über den Tunnel)
  • Ich starte etwas auf meinem lokalen Computer auf P12345
  • Andere Personen können auf remote zugreifen: 12345 und meinen localhost sehen: 12345
Oli
quelle

Antworten:

96

Der Befehl zum Weiterleiten von Port 80 von Ihrem lokalen Computer ( localhost) an den Remote-Host an Port 8000 lautet:

ssh -R 8000:localhost:80 oli@remote-machine

Dies erfordert eine zusätzliche Optimierung des SSH-Servers. Fügen Sie die folgenden Zeilen hinzu /etc/ssh/sshd_config:

Match User oli
   GatewayPorts yes

Laden Sie als Nächstes die Konfiguration neu, indem Sie den Server ausführen sudo reload ssh.

Die Einstellung GatewayPorts yesbewirkt , dass SSH den Port 8000 an die Platzhalteradresse bindet, sodass er für die öffentliche Adresse von remote-machine( remote-machine:8000) verfügbar wird .

Wenn Sie die Option benötigen, nicht alles an die Platzhalteradresse zu binden, wechseln Sie GatewayPorts yeszu GatewayPorts clientspecified. Da sshstandardmäßig eine Bindung an die Loopback-Adresse erfolgt, müssen Sie ein Leerzeichen bind_addressfür die Bindung der Platzhalteradresse angeben :

ssh -R :8000:localhost:80 oli@remote-machine

Das :Vorher 8000ist obligatorisch, wenn auf festgelegt GatewayPortsist clientspecifiedund Sie den öffentlichen Zugriff zulassen möchten remote-machine:8000.

Relevante manuelle Auszüge:

ssh (1)

-R [Bindeadresse:] 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 des Ports auf der Remote-Seite. Wenn eine Verbindung zu diesem Port hergestellt wird, wird die Verbindung über den sicheren Kanal weitergeleitet und eine Verbindung zum Host-Port hostport vom lokalen Computer hergestellt. Standardmäßig ist der Listening-Socket auf dem Server nur an die Loopback-Schnittstelle gebunden. Dies kann durch Angabe einer bind_address überschrieben werden. Eine leere bind_address oder die Adresse '*' gibt an, dass der Remote-Socket alle Schnittstellen überwachen soll. Die Angabe einer fernen Bindungsadresse ist nur dann erfolgreich, wenn die GatewayPorts-Option des Servers aktiviert ist (siehe sshd_config (5)).

sshd_config (5)

GatewayPorts
Gibt an, ob Remotehosts Verbindungen zu für den Client weitergeleiteten Ports herstellen dürfen. Mit GatewayPorts kann festgelegt werden, dass sshd zulässt, dass Weiterleitungen von Remoteports an Nicht-Loopback-Adressen gebunden werden, sodass andere Hosts eine Verbindung herstellen können. Das Argument kann "Nein" sein, um zu erzwingen, dass Remote-Port-Weiterleitungen nur für den lokalen Host verfügbar sind, "Ja", um zu erzwingen, dass Remote-Port-Weiterleitungen an die Platzhalteradresse gebunden werden, oder "Clientspezifiziert", damit der Client die Adresse auswählt, an die er sich richtet Die Weiterleitung ist gebunden. Der Standardwert ist "Nein".

Siehe auch:

Lekensteyn
quelle
7
GatewayPortswar das Wundermittel hier. Ich finde es gut, dass Sie eine Version gefunden haben, mit der ich diese ziemlich leistungsstarke Technik auf bestimmte Benutzer beschränken kann.
Oli
1
Was mich verwirrte, war, dass die GatewayPorts auf dem Computer eingerichtet sein müssen, auf dem der eigentliche Befehl ssh ausgeführt wird, um den Reverse-Tunnel (lokal) zu initiieren. Meiner Meinung nach war es logischer, dass das andere Ende (remote) behandelt, woher Verbindungen angenommen werden, da Sie dort eine Verbindung herstellen und von dort umgeleitet werden. Ich brauchte Ewigkeiten, um das zu umgehen.
Ars Magika
2
@ArsMagika Ich bin mir nicht sicher, ob ich dich verstehe. GatewayPorts muss auf dem SSH-Server festgelegt werden, nicht auf Ihrem lokalen Computer, auf dem der sshBefehl ausgeführt wird. Hiermit wird konfiguriert, ob andere Clients mit den weitergeleiteten Ports auf dem Server kommunizieren können.
Lekensteyn
Nachteil dieser Lösung: Sie können die IP-Adresse des Clients nicht mehr im Zugriffsprotokoll des Webservers ermitteln. Gibt es auch eine Möglichkeit, dieses Ärgernis zu lösen?
Twonky
@Twonky Wenn Sie die genaue IP-Adresse des Clients nicht kennen müssen (nur, dass es sich um eine Remote-IP-Adresse und nicht um "localhost" handelt) und Ihr lokaler Server die Wildcard-Adresse überwacht (dh Verbindungen von einer beliebigen Adresse akzeptiert), dann könnten Sie versuchen, weiterzuleiten -R :8000:127.0.1.1:80(oder eine andere 127.x.x.xAdresse). Andernfalls können Sie die Remote-IP-Adresse nicht ermitteln.
Lekensteyn
14

Wenn dies auf dem Server der Fall ist GatewayPorts no, können Sie dasselbe Ergebnis erzielen, indem Sie das Programm ssh -g -L 8001:localhost:8000 oli@remote-machineauf dem Server ausführen, nachdem Sie den ssh -RBefehl auf dem Client ausgeführt haben. Dadurch wird der Loopback-Port 8000 auf dem Server für alle Schnittstellen an Port 8001 zugänglich.

FaST4
quelle