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
?
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, derB:$port_number
als SOCKS-Adresse verwendet; Es kann viele Clients geben. -
B
ist die Maschine, auf derssh -D $port_number C
ausgeführt wird und auf der das TCP$port_number
auf eingehende Verbindungen von beliebigenA
wartet. -
C
ist die$hostname
B
verbindet sich mit; Kommunikation, die normalerweise geht vonA
zuD
und erreicht nunD
vonC
. -
D
ist ein Server, er sieht die Kommunikation vonC
und weiß möglicherweise nicht, dassA
undB
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 (A
≠B
, 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
mitssh -D
;
Oder
- tunnelt jeden Client z. B. über eine eigene separate
ssh
- Verbindung, sodass seine Verbindungen lokal erscheinen (als obA
=B
) zu Ihrem bereits laufendenssh -D ...
somit stört Firewall nicht noch-g
ist notwendig; Dies kann durchssh -L $some_port:localhost:$port_number $your_IP
an ihrer Seite aufgerufen oderssh -R $some_port:localhost:$port_number $their_IP
an Ihrer Seite aufgerufen werden; Clients verwendenlocalhost:$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 vonport
auf der lokalen Seite zugewiesen wird, der optional an das angegebenebind_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, undssh
fungiert als SOCKS-Server. Nur root kann privilegierte Ports weiterleiten. [...]
-f
Fordertssh
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. [...]
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