SSH als SOCKS-Proxy verwenden

Führen Sie ssh -N -D 1080 user@server aus. Ihr Rechner hat jetzt einen SOCKS-Proxy auf Port 1080, und Verkehr, den Sie dorthin schicken, verlässt das Netz über den Server. Testen Sie ihn mit curl --socks5-hostname localhost:1080 https://example.com/. Nehmen Sie die Form mit hostname, damit der Server die Namen auflöst und nicht Ihr lokales Netz. Nur Programme, die für den Proxy eingerichtet sind, laufen darüber.

Lieber einen Proxy, den Sie ein- und ausschalten? Wardterm speichert ihn als Tunnel zu Ihrem Server. Zeigen

Aktualisiert am . OpenSSH 10.0 und curl unter Debian 13 in Wegwerf-Containern sowie OpenSSH 10.3 mit curl und lsof unter macOS, mit Zugriff auf einen Webserver, den nur der SSH-Server auflösen und erreichen konnte, über reines HTTP.

Den Proxy starten

ssh -N -D 1080 user@server

-D 1080 öffnet den Proxy, und -N bedeutet kein Befehl auf dem Server. Mit -f läuft er im Hintergrund. Prüfen Sie, dass er nur auf Ihrem eigenen Rechner lauscht:

$ ss -ltn | grep 1080
LISTEN 0  128  127.0.0.1:1080  0.0.0.0:*
LISTEN 0  128      [::1]:1080     [::]:*

Auf einem Mac nehmen Sie stattdessen lsof -nP -iTCP:1080 -sTCP:LISTEN.

-D ist die dynamische Form der SSH-Portweiterleitung, neben lokalen und Remote-Tunneln.

Mit curl testen

curl --socks5-hostname localhost:1080 https://example.com/

Andere Formen, die dasselbe tun:

curl -x socks5h://localhost:1080 https://example.com/
ALL_PROXY=socks5h://localhost:1080 curl https://example.com/

Um zu sehen, von welcher Adresse Ihr Verkehr ausgeht, fragen Sie einen Dienst, der Ihre IP anzeigt, mit und ohne Proxy. Mit Proxy sollte es die Adresse des Servers sein:

curl https://ifconfig.me
curl --socks5-hostname localhost:1080 https://ifconfig.me

DNS: der Unterschied zwischen socks5 und socks5h

curl-OptionWer die Namen auflöst
--socks5, socks5://Ihr Rechner, über Ihr lokales DNS
--socks5-hostname, socks5h://Der SSH-Server

Wir haben das mit einem Namen getestet, der nur auf dem Server existierte. --socks5-hostname und socks5h:// erreichten die Seite, während --socks5 scheiterte, weil der Name lokal aufgelöst werden musste.

Daraus folgt zweierlei. Das lokale Netz und Ihr DNS-Anbieter können die Namen sehen, die Sie abfragen, solange der Server sie nicht auflöst. Das nennt man ein DNS-Leck. Und Namen, die nur im Netz des Servers existieren, funktionieren nur mit der Form mit hostname.

Browser-Einstellungen

Diese Schritte folgen der Dokumentation des jeweiligen Herstellers.

Firefox

Öffnen Sie die Einstellungen, dann die Netzwerkeinstellungen, und wählen Sie die manuelle Proxy-Konfiguration. Setzen Sie SOCKS-Host auf localhost, Port auf 1080 und wählen Sie SOCKS v5. Aktivieren Sie Proxy-DNS bei Verwendung von SOCKS v5, sonst werden Namen lokal aufgelöst.

Chrome und Chromium

Starten Sie den Browser mit einem Parameter:

chrome --proxy-server="socks5://localhost:1080"

Auf dem Mac beenden Sie Chrome zuerst und starten es dann im Terminal mit dem Parameter:

open -a "Google Chrome" --args --proxy-server="socks5://localhost:1080"

Laut Dokumentation von Chromium können manche Komponenten weiterhin direkte DNS-Anfragen stellen, und es ergänzt diesen Parameter, um das zu verhindern:

--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE localhost"

Safari und der ganze Mac

Safari nutzt den Proxy des Systems. Öffnen Sie in den Systemeinstellungen Netzwerk, wählen Sie Ihr Netzwerk, dann Details und Proxies, schalten Sie SOCKS-Proxy ein und tragen Sie localhost und Port 1080 ein. Dasselbe im Terminal, und danach wieder aus:

networksetup -setsocksfirewallproxy Wi-Fi localhost 1080
networksetup -setsocksfirewallproxystate Wi-Fi off

Ersetzen Sie Wi-Fi durch den Namen Ihres Netzwerkdienstes, wie ihn networksetup -listallnetworkservices anzeigt.

Den Port nicht freigeben

Der Proxy hat kein Passwort. Wer ihn erreichen kann, kann Ihren Server als Ausgang nutzen. Diese Formen lauschen auf allen Adressen, wie wir mit ss bestätigt haben:

ssh -N -D 0.0.0.0:1081 user@server
ssh -N -g -D 1080 user@server

Bleiben Sie beim Standard oder schreiben Sie ihn zur Klarheit aus:

ssh -N -D 127.0.0.1:1080 user@server

Was er nicht kann

  • Er transportiert nur Programme, die Sie darauf ausrichten. Er ist kein systemweites VPN.
  • Er transportiert TCP. Die SOCKS-Unterstützung von OpenSSH hat kein UDP-Relay.
  • Der Verkehr ist nur zwischen Ihnen und dem Server verschlüsselt. Vom Server zur Website gilt, was die Website verwendet.
  • Die Website sieht die Adresse des Servers, und der Betreiber des Servers kann die Verbindungen sehen.

Wenn es nicht funktioniert

Bei AllowTcpForwarding no auf dem Server öffnet sich der Port auf Ihrer Seite und die Anmeldung gelingt, aber jede Anfrage scheitert. curl meldete in unserem Test connection to proxy closed. Prüfen Sie den Server mit sudo sshd -T | grep -i allowtcpforwarding. Ein bereits belegter Port ergibt bind [127.0.0.1]:1080: Address already in use. Siehe die Anleitung zu diesem Fehler.

Fragen

Ist ein SSH-SOCKS-Proxy dasselbe wie ein VPN?

Nein. Nur Programme, die auf den Proxy eingestellt sind, laufen darüber, und er transportiert nur TCP. Ein VPN leitet den gesamten Verkehr des Rechners.

Was ist der Unterschied zwischen socks5 und socks5h?

Mit socks5h, in curl --socks5-hostname, löst der SSH-Server die Namen auf. Mit socks5 tut das Ihr Rechner: Interne Namen scheitern, und die DNS-Anfragen sind im lokalen Netz sichtbar.

Kann ich einen anderen Port als 1080 nehmen?

Ja. Jeder freie lokale Port geht, etwa ssh -N -D 1081 user@server. Stellen Sie Ihre Programme auf denselben Port ein.

Quellen

Mehr zu Tunnel und Jump-Hosts

Alle Anleitungen