Wie erstelle ich einen SOCKS-Proxy mit ssh?

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

Author: Kamil Maciorowski, 2018-03-27

1 answers

Tl;dr -- suchen Sie den Fett gedruckten text unten.


Hinweis: Ich verwende das Präfix $ für Zeichenfolgen, die Sie durch Ihre gewünschten Werte ersetzen müssen. Diese syntax ist nicht, bedeutete, voll kompatibel mit Variablen in die shell ein.

Die Verwendung von ssh -D ist in der Tat so:

ssh -D $port_number $hostname

Oder

ssh -D $port_number $username@$hostname

Wobei $hostname einen Computer identifiziert; Es kann sich um eine IP-Adresse handeln, eine Adresse, die über DNS oder über eine /etc/hosts - Datei oder über eine ssh_config - Datei aufgelöst werden kann usw. Der erste Befehl verwendet Ihren aktuellen (lokalen) username es sei denn, Ihre ssh_config Datei sagt etwas anderes (standardmäßig nicht). Sie müssen Anmeldeinformationen (wie $username und Kennwort, wenn Sie gefragt werden) angeben, die für den Computer $hostname gültig sind.

Dies öffnet den [[13]} TCP-Port auf Ihrem [[84]}lokalen [[85]} Computer und richtet einen SOCKS-Server darauf ein. Beachten Sie, dass Sie einige Ports möglicherweise nicht als regulärer Benutzer öffnen dürfen, insbesondere nicht als 1024, verwenden Sie dann eine höhere Nummer.

Im Allgemeinen ist die Situation ohne SOCKS-Proxy, die von ssh bereitgestellt wird, wie folgt dieser:

A -> D

Wobei A ein Client ist (z. B. Webbrowser), D ein Server (z. B. Webserver). Mit Proxy ist dies jedoch wie folgt:

A -> B -> C -> D

Wobei:

  • A stellt einen einzelnen Client dar, der B:$port_number als SOCKS-Adresse verwendet; Es kann viele Clients geben.
  • B ist die Maschine, auf der ssh -D $port_number C ausgeführt wird und auf der das TCP $port_number auf eingehende Verbindungen von beliebigen A wartet.
  • C ist die $hostname B verbindet sich mit; Kommunikation, die normalerweise geht von A zu D und erreicht nun D von C.
  • D ist ein Server, er sieht die Kommunikation von C und weiß möglicherweise nicht, dass A und B beteiligt sind; es kann viele Server geben.

Einige dieser Buchstaben können sich in bestimmten Anwendungsfällen auf dieselbe Maschine beziehen. Offensichtlich jeder Fall, wo A=C gibt keinen direkten Vorteil gegenüber einfacher A -> D Verbindung, aber es gibt andere nützliche Fälle.

Angenommen, Sie führen den Befehl ssh aus wie oben gezeigt, weisen Sie Ihren lokalen Browser an, SOCKS unter localhost:$port_number zu verwenden. Dies ist der Fall, wo A=B. Der Datenverkehr Ihres Browsers wird weitergeleitet und Websites, die Sie besuchen (D), sehen die Kommunikation von der $hostname (C) als ob Ihr Browser dort laufen.

Wenn Sie möchten, dass andere Computer eine Verbindung zu Ihrem offenen Port herstellen (AB, sie verwenden $your_IP:$port_number als Serveradresse) Sie müssen:

  • konfigurieren Sie Ihre firewall so, dass eingehende verbindungen zu TCP-port $port_number;
  • Verwende die Option -g mit ssh -D;

Oder

  • tunnelt jeden Client z. B. über eine eigene separate ssh - Verbindung, sodass seine Verbindungen lokal erscheinen (als ob A=B) zu Ihrem bereits laufenden ssh -D ... somit stört Firewall nicht noch -g ist notwendig; Dies kann durch ssh -L $some_port:localhost:$port_number $your_IP an ihrer Seite aufgerufen oder ssh -R $some_port:localhost:$port_number $their_IP an Ihrer Seite aufgerufen werden; Clients verwenden localhost:$some_port als Serveradresse in ihren Browsern.

Es gibt keine Grund $hostname nicht B's localhost; es können. In diesem Fall B=C. Dies ist sinnlos, wenn Sie diesen SOCKS-Proxy mit Ihrem lokalen Browser verwenden(A=B=C) wenn Sie jedoch Verbindungen von außen zulassen, ist dies durchaus sinnvoll. Ich denke, das ist, was Sie tun wollen. Der Befehl kann lauten:

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

Möglicherweise möchten Sie die schlüsselbasierte Authentifizierung einrichten, damit diese Verbindung von localhost zu localhost nicht nach Ihrem Passwort fragt. Die obige Bemerkung in Bezug auf firewall steht. Jeder, der $your_IP:$port_number als Serveradresse verwenden kann, wird von Servern gesehen, die er besucht, als wären sie auf Ihrem Computer.


Relevante Fragmente von man 1 ssh:

-D [bind_address:]port
Gibt eine lokale "dynamische" Portweiterleitung auf Anwendungsebene an. Dies funktioniert, indem ein Socket zum Abhören von port auf der lokalen Seite zugewiesen wird, der optional an das angegebene bind_address gebunden ist. Immer wenn eine Verbindung zu diesem Port hergestellt wird, wird die Verbindung über der sichere Kanal, und das Anwendungsprotokoll wird dann verwendet, um zu bestimmen, wo von der Remote-Maschine zu verbinden. Derzeit werden die Protokolle SOCKS4 und SOCKS5 unterstützt, und ssh fungiert als SOCKS-Server. Nur root kann privilegierte Ports weiterleiten. [...]

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

-g
Ermöglicht Remote-Hosts die Verbindung zu lokalen weitergeleiteten Ports.

-N
Führen Sie keine Fernbedienung aus Befehl. Dies ist nützlich, um nur Ports weiterzuleiten. [...]

 13
Author: Kamil Maciorowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-12 13:48:39