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 -D
ist in der Tat so:
ssh -D $port_number $hostname
oder
ssh -D $port_number $username@$hostname
Wo $hostname
identifiziert eine Maschine; Dies kann eine IP-Adresse sein, eine Adresse, die über DNS oder über eine /etc/hosts
Datei oder über eine ssh_config
Datei auflösbar ist . Der erste Befehl verwendet Ihren aktuellen (lokalen) Benutzernamen, sofern Ihre ssh_config
Datei nichts anderes sagt (standardmäßig nicht). Sie müssen Anmeldeinformationen (wie $username
Kennwort und Kennwort, wenn Sie dazu aufgefordert werden) angeben, die für den $hostname
Computer gültig sind .
Dadurch wird der $port_number
TCP-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 A
ist ein Client (zB Webbrowser), D
ist ein Server (zB Webserver). Aber mit Proxy ist dies wie folgt:
A -> B -> C -> D
woher:
A
stellt einen einzelnen Client dar, derB:$port_number
als SOCKS-Adresse verwendet wird; Es kann viele Kunden geben.B
ist der Rechner, auf demssh -D $port_number C
läuft und auf dem TCP$port_number
auf eingehende Verbindungen wartetA
.C
ist das$hostname
B
verbindet mit; Kommunikation, die normalerweiseD
vonA
jetzt an geht, reichtD
vonC
.D
ist jeder Server, die Kommunikation von siehtC
und vielleicht nicht bewusst, dassA
undB
sind 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
= C
keinen direkten Vorteil gegenüber einer einfachen A -> D
Verbindung bietet, es gibt jedoch andere nützliche Fälle.
Angenommen, Sie führen den ssh
oben 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 ( A
≠ B
, diese werden $your_IP:$port_number
als SOCKS-Serveradresse verwendet), müssen Sie Folgendes tun:
- Konfigurieren Sie Ihre Firewall so, dass eingehende Verbindungen zum TCP-Port zugelassen werden
$port_number
. - verwenden
-g
Optionssh -D
;
oder
- Tunneln Sie jeden Client, z. B. über eine eigene separate
ssh
Verbindung, so dass die Verbindungen lokal (als obA
=B
) zu Ihrem bereits laufenden Server erscheinen. Diessh -D ...
Firewall stört also nicht und-g
ist auch nicht notwendig. Dies kann durchssh -L $some_port:localhost:$port_number $your_IP
Aufruf an ihrer Seite oderssh -R $some_port:localhost:$port_number $their_IP
an Ihrer Seite erfolgen. Clients verwendenlocalhost:$some_port
als SOCKS-Serveradressen in ihren Browsern.
Es gibt keinen Grund $hostname
kann 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 ssh
Verbindung von localhost
bis localhost
nicht nach Ihrem Passwort fragt. Die obige Bemerkung bezüglich der Firewall steht. Jeder, der $your_IP:$port_number
als 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, derport
auf der lokalen Seite abgehört werden kann, optional an die angegebenebind_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 undssh
fungieren als SOCKS-Server. Nur root kann privilegierte Ports weiterleiten. [...]
-f
Fordertssh
an, 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. [...]