Wie erstelle ich einen SOCKS-Proxy mit ssh?

1760
Raffaele D'Arco

Ich möchte meinen Computer als SOCKS-Proxy verwenden. Müssen Sie nur tun ssh -D port_number hostname? Muss ich meinen Linux-Benutzernamen als angeben hostname?

1

1 Antwort auf die Frage

1
Kamil Maciorowski

tl; dr - suchen Sie den unten stehenden fetten Text.


Hinweis: Ich verwende $Präfix für Zeichenfolgen, die Sie durch Ihre gewünschten Werte ersetzen müssen. Diese Syntax soll nicht vollständig mit Variablen in einer Shell kompatibel sein.

Die Verwendung von ssh -Dist in der Tat so:

ssh -D $port_number $hostname 

oder

ssh -D $port_number $username@$hostname 

Wo $hostnameidentifiziert eine Maschine; Dies kann eine IP-Adresse sein, eine Adresse, die über DNS oder über eine /etc/hostsDatei oder über eine ssh_configDatei auflösbar ist . Der erste Befehl verwendet Ihren aktuellen (lokalen) Benutzernamen, sofern Ihre ssh_configDatei nichts anderes sagt (standardmäßig nicht). Sie müssen Anmeldeinformationen (wie $usernameKennwort und Kennwort, wenn Sie dazu aufgefordert werden) angeben, die für den $hostnameComputer gültig sind .

Dadurch wird der $port_numberTCP-Port auf Ihrem lokalen Computer geöffnet und ein SOCKS-Server darauf eingerichtet. Hinweis: Es ist Ihnen möglicherweise nicht gestattet, einige Ports als reguläre Benutzer zu öffnen, insbesondere 1024, wenn Sie eine höhere Anzahl als dann verwenden.

Im Allgemeinen sieht die Situation ohne SOCKS-Proxy folgendermaßen aus ssh:

A -> D 

Wo Aist ein Client (zB Webbrowser), Dist ein Server (zB Webserver). Aber mit Proxy ist dies wie folgt:

A -> B -> C -> D 

woher:

  • Astellt einen einzelnen Client dar, der B:$port_numberals SOCKS-Adresse verwendet wird; Es kann viele Kunden geben.
  • Bist der Rechner, auf dem ssh -D $port_number Cläuft und auf dem TCP $port_numberauf eingehende Verbindungen wartet A.
  • Cist das $hostname Bverbindet mit; Kommunikation, die normalerweise Dvon Ajetzt an geht, reicht Dvon C.
  • Dist jeder Server, die Kommunikation von sieht Cund vielleicht nicht bewusst, dass Aund Bsind beteiligt; Es kann viele Server geben.

Einige dieser Buchstaben können sich in bestimmten Anwendungsfällen auf dieselbe Maschine beziehen. Natürlich gibt es keinen Fall, in dem A= Ckeinen direkten Vorteil gegenüber einer einfachen A -> DVerbindung bietet, es gibt jedoch andere nützliche Fälle.

Angenommen, Sie führen den sshoben gezeigten Befehl aus und weisen Ihren lokalen Browser an, SOCKS unter zu verwenden localhost:$port_number. Dies ist der Fall, wo A= B. Der Datenverkehr Ihres Browsers wird weitergeleitet, und die von Ihnen besuchten Websites ( D) erhalten Kommunikation von $hostname( C), als ob Ihr Browser dort ausgeführt würde.

Wenn Sie möchten, dass andere Computer eine Verbindung zu Ihrem offenen Port herstellen ( AB, diese werden $your_IP:$port_numberals SOCKS-Serveradresse verwendet), müssen Sie Folgendes tun:

  • Konfigurieren Sie Ihre Firewall so, dass eingehende Verbindungen zum TCP-Port zugelassen werden $port_number.
  • verwenden -gOption ssh -D;

oder

  • Tunneln Sie jeden Client, z. B. über eine eigene separate sshVerbindung, so dass die Verbindungen lokal (als ob A= B) zu Ihrem bereits laufenden Server erscheinen. Die ssh -D ...Firewall stört also nicht und -gist auch nicht notwendig. Dies kann durch ssh -L $some_port:localhost:$port_number $your_IPAufruf an ihrer Seite oder ssh -R $some_port:localhost:$port_number $their_IPan Ihrer Seite erfolgen. Clients verwenden localhost:$some_portals SOCKS-Serveradressen in ihren Browsern.

Es gibt keinen Grund $hostnamekann nicht sein B‚s localhost; es kann. In diesem Fall B= C. Dies ist sinnlos, wenn Sie diesen SOCKS-Proxy mit Ihrem lokalen Browser ( A= B= C) verwenden. Wenn Sie jedoch Verbindungen von außen zulassen, ist dies absolut sinnvoll. Ich denke, das ist es, was du machen willst. Der Befehl kann sein:

ssh -g -f -N -D $port_number localhost 

Möglicherweise möchten Sie etablieren schlüsselbasierte Authentifizierung so dass diese sshVerbindung von localhostbis localhostnicht nach Ihrem Passwort fragt. Die obige Bemerkung bezüglich der Firewall steht. Jeder, der $your_IP:$port_numberals SOCKS-Serveradresse verwendet werden kann, wird von den Servern, die er besucht, als auf Ihrem Computer gesehen.


Relevante Fragmente von man 1 ssh:

-D [bind_address:]port
Gibt eine lokale "dynamische" Portweiterleitung auf Anwendungsebene an. Dies funktioniert, indem ein Socket zugewiesen wird, der portauf der lokalen Seite abgehört werden kann, optional an die angegebene bind_address. Immer wenn eine Verbindung zu diesem Port hergestellt wird, wird die Verbindung über den sicheren Kanal weitergeleitet. Anschließend wird das Anwendungsprotokoll verwendet, um zu bestimmen, wo die Verbindung vom Remote-Computer aus hergestellt werden soll. Derzeit werden die Protokolle SOCKS4 und SOCKS5 unterstützt und sshfungieren als SOCKS-Server. Nur root kann privilegierte Ports weiterleiten. [...]

-f
Fordert sshan, kurz vor der Befehlsausführung in den Hintergrund zu wechseln. [...]

-g
Ermöglicht Remote-Hosts, eine Verbindung zu lokal weitergeleiteten Ports herzustellen.

-N
Führen Sie keinen Remote-Befehl aus. Dies ist nützlich, wenn Sie nur Ports weiterleiten. [...]

Danke, Mann :). Zum Beispiel ist ssh -D 5050 meinname @ my_ip der Befehl, den ich auf meinem Notebook ausführen werde. Dann öffne ich den Port am Router und schließlich setze ich Proxy auf meinem PC ein. Recht? Raffaele D'Arco vor 6 Jahren 0
@ RaffaeleD'Arco Ich weiß nicht genau, ob es richtig ist, weil ich nicht weiß, worauf sich my_ip bezieht, wo der Router in Ihrem Netzwerk ist oder was er tut. Ich glaube, du vermisst "-g". Wenn Sie möchten, dass Ihr Linux-Notebook als einziges Relay fungiert, sollte `ssh -g -D 5050 $ username @ localhost` der erste Schritt sein. Befindet sich das Notebook hinter einem Router, der NAT implementiert, und wenn sich Clients nicht im selben LAN befinden, müssen Sie dort die Portweiterleitung einrichten. Kamil Maciorowski vor 6 Jahren 0
JA, ich möchte mein Linux-Notebook als Proxy-Server konfigurieren. Wenn ich nicht zu Hause bin, möchte ich den Proxy auf meinem PC verwenden. Raffaele D'Arco vor 6 Jahren 0
@ R Es scheint, dass Sie eine Anleitung benötigen, um meine generische Antwort auf Ihren speziellen Fall anzuwenden. Ein bisschen von [XY-Problem] (https://meta.stackexchange.com/q/66377/355310). Es wäre vielleicht besser gewesen, diese Details am Anfang preiszugeben, meine Antwort würde sie ansprechen. OK, Sie benötigen einen SSH-Zugriff von Ihrem "reisenden" Computer zu Ihrem "Heim" -Ziel, höchstwahrscheinlich mit Portweiterleitung auf dem Heimrouter. Von "Reisen": `ssh -p $ forwarded_port -D $ portnummer $ username @ $ external_IP_of_home`. SOCKS-Proxy-Setup im "reisenden" Browser: `localhost: $ port_number '. Dies ist der Fall, der in meiner Antwort mit "Sagen wir" beginnt. Kamil Maciorowski vor 6 Jahren 0
OK ich verstehe. Vielen Dank :) Raffaele D'Arco vor 6 Jahren 0