Wie kann ich meinen gesamten Netzwerkverkehr durch SSH tunneln?

117

Immer wenn ich das Internet von einem unsicheren Ort aus nutze (z. B. öffentliches WLAN), benutze ich gerne einen SSH-Tunnel ( ssh -D port host), um sicherzustellen, dass mein Datenverkehr nicht beschnüffelt werden kann. Leider scheint es viele Anwendungen zu geben, die keine Möglichkeit bieten, einen Proxy anzugeben (Flash ist ein wichtiges Beispiel).

Es scheint, dass es eine Möglichkeit geben sollte, einen Tunnel für den gesamten Netzwerkverkehr von meinem Computer aus zu verwenden, aber ich weiß überhaupt nicht, wie das geht. Jede Hilfe wäre sehr dankbar.

Jeremy Banks
quelle
16
Natürlich können Sie nicht den gesamten Datenverkehr durch SSH tunneln, da dies bedeuten würde, SSH durch sich selbst zu tunneln, aber wir wussten, was Sie meinten. :)
CarlF
1
Dies ist eine gute Idee, aber Sie sind nur zwischen Ihrem Computer und Ihrem SSH-Endpunkt geschützt. Danach ist Ihr Datenverkehr frei (sofern nicht anders geschützt, z. B. SSL). Zugegeben, es ist viel wahrscheinlicher, dass es über Kabel geht, aber trotzdem ... Sie können Drähten, die Sie nicht kontrollieren, nicht wirklich vertrauen.
Quack Quijote
6
Aber wenn Sie im Internet unterwegs sind, können Sie sicher sein, dass Sie nur eine von Milliarden von Paketen sind, oder? Wenn Sie eine Verbindung zu einem öffentlichen WLAN herstellen, sind Sie eine von vielleicht drei Verbindungen, Sie können persönlich identifiziert werden usw.
Endolith

Antworten:

62

Um zu tun, was Sie wollen, empfehle ich sshuttle .

Du benutzt es so:

./sshuttle -r username@sshserver 0.0.0.0/0 -vv

Der gesamte TCP-Verkehr wird automatisch für Sie getunnelt. Sie können das --dnsArgument hinzufügen, damit der DNS-Verkehr ebenfalls getunnelt wird. Auf dem Remote-Server muss nur Python installiert sein.

Wenn Sie nur bestimmte Programme tunneln möchten, würde ich Proxy-Ketten empfehlen .

Sobald es installiert ist, starte deinen ssh socks Proxy wie folgt:

ssh -fND 127.0.0.1:<local port> username@sshserver

Dies startet einen "SOCKS" -Proxy, der <lokalen Port> überwacht.

Bearbeiten Sie dann /etc/proxychains.conf, um auf denselben Port wie <lokaler Port> zu verweisen.

Starten Sie schließlich Ihr Programm, das Sie als Proxy-Server verwenden möchten:

proxychains <program name>

Es sollte einfach funktionieren. Einige Programme haben jedoch Probleme mit der Arbeit mit Proxy-Ketten. Beachten Sie auch, dass Sie in Firefox unter about: config zusätzliche Elemente ändern müssen, um zu erzwingen, dass DNS-Suchvorgänge über den Proxy ausgeführt werden, anstatt ihn zu umgehen.

Als zusätzliche Anmerkung zu Webbrowsern. Wenn sie Socks-Proxys unterstützen, müssen Sie keine zusätzlichen Schritte ausführen, um sie zur Verwendung des oben genannten SSH-Tunnels zu veranlassen. Geben Sie lediglich 127.0.0.1 für den SOCKS-Proxyserver und den <lokalen Port> für den Proxy-Port ein.

EDIT 29.03.16

Da in diesem Beitrag noch einige positive Stimmen zu finden sind, dachte ich, ich würde es aktualisieren. Proxychains ist immer noch in den meisten Linux-Repos enthalten und funktioniert immer noch unter Linux. Das Projekt wird jedoch effektiv abgebrochen und funktioniert unter OSX nicht. Für Linux oder OSX empfehle ich dringend, ein Upgrade auf einen noch gewarteten Fork durchzuführen: proxychains-ng: https://github.com/rofl0r/proxychains-ng

Abgesehen davon, dass es sowohl unter Linux als auch unter OSX funktioniert, ist es einfach zu kompilieren und bietet eine viel bessere Unterstützung für DNS-Tunneling.

Ich sollte auch eine andere Option erwähnen, nämlich Redsocks. Es funktioniert ähnlich wie Proxy-Ketten (-ng) und befindet sich wahrscheinlich auch in Ihrem dist-Repository: https://github.com/darkk/redsocks

Shellster
quelle
Hinweis für neuere Linux-Systeme, die sshuttle verwenden: Zum Zeitpunkt des Schreibens gibt es einen Kernel-Fehler, der zu einer Pipe-Unterbrechung führt. In diesem Fall verwenden Sie:sshuttle -r root@host -x host 0/0
aggregate1166877
49

man sshgibt ein Beispiel dafür. Ein ssh-basiertes VPN:

SSH-BASED VIRTUAL PRIVATE NETWORKS
     ssh contains support for Virtual Private Network (VPN) tunnelling using
     the tun(4) network pseudo-device, allowing two networks to be joined
     securely.  The sshd_config(5) configuration option PermitTunnel controls
     whether the server supports this, and at what level (layer 2 or 3 traf-
     fic).

     The following example would connect client network 10.0.50.0/24 with
     remote network 10.0.99.0/24, provided that the SSH server running on the
     gateway to the remote network, at 192.168.1.15, allows it:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252

~~ snip ~~

     Since a SSH-based setup entails a fair amount of overhead, it may be more
     suited to temporary setups, such as for wireless VPNs.  More permanent
     VPNs are better provided by tools such as ipsecctl(8) and isakmpd(8).

Sobald Sie diese neue Benutzeroberfläche eingerichtet haben, müssen Sie sie lediglich als Standardroute festlegen, was eine andere Frage ist.

PriceChild
quelle
1
Könntest du etwas mehr erklären? Der Befehl ifconfig erstellt eine neue Schnittstelle mit dem Namen tun0, richtig? Oder wird tun0 von ssh erstellt und nur von ifconfig weiter konfiguriert? Vielleicht ein Beispiel hinzufügen, das für die Frage relevant ist?
Niemand
6

Suchen Sie in ssh nach der Option "Tunnel". Dadurch wird ein Tunnelgerät erstellt, dem Sie eine IP-Adresse zuweisen können. Anschließend ändern Sie die Standardroute, um diesen Tunnel zu verwenden.

Peter Eisentraut
quelle
4

Ich habe eine Software entwickelt, mit der Sie TCP und optional UDP systemweit über einen SOCKS5-Proxy weiterleiten können.

http://code.google.com/p/badvpn/wiki/tun2socks

Es kann sogar auf einem Router installiert werden, um alle Verbindungen von Computern im LAN weiterzuleiten.

Ambroz Bizjak
quelle
0

SSH-BASIERTE VIRTUELLE PRIVATE NETZWERKE ssh unterstützt VPN-Tunneling (Virtual Private Network) unter Verwendung des Netzwerk-Pseudogeräts tun (4), sodass zwei Netzwerke sicher verbunden werden können. Die Konfigurationsoption sshd_config (5) PermitTunnel steuert, ob und auf welcher Ebene der Server dies unterstützt (Layer 2- oder 3-Verkehr).

 The following example would connect client network 10.0.50.0/24 with
 remote network 10.0.99.0/24 using a point-to-point connection from
 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway
 to the remote network, at 192.168.1.15, allows it.

 On the client:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252
       # route add 10.0.99.0/24 10.1.1.2

 On the server:

       # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252
       # route add 10.0.50.0/24 10.1.1.1

 Client access may be more finely tuned via the /root/.ssh/authorized_keys
 file (see below) and the PermitRootLogin server option.  The following
 entry would permit connections on tun(4) device 1 from user “jane” and on
 tun device 2 from user “john”, if PermitRootLogin is set to
 “forced-commands-only”:

   tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane
   tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

 Since an SSH-based setup entails a fair amount of overhead, it may be
 more suited to temporary setups, such as for wireless VPNs.  More perma‐
 nent VPNs are better provided by tools such as ipsecctl(8) and
 isakmpd(8).
Kristian Hermansen
quelle
1
Bitte geben Sie eine Quelle für Ihre Informationen an. hinweis: das ist eine alte frage.
Lorenzo Von Matterhorn
-2

Ich wollte nur klären, dass (ssh -D Port Host) kein 100% sicherer Weg ist, um den Datenverkehr nicht zu schnüffeln. Das Hinzufügen von (ssh -D -c Blowfish-Port-Host) ist die bessere Wahl, da Sie Ihrer Sitzung mindestens eine Verschlüsselung hinzufügen. Sie können weitere Optionen hinzufügen, aber es ist einfach genug, "man ssh" in Ihr Terminal oder in Google einzugeben, um eine vollständige Auflistung zu erhalten.

Die Option, die ich denke, dass Sie suchen, ist die Einrichtung eines VPN (Virtual Private Network)

Schauen Sie sich diesen Artikel an, um einen Überblick über den Unterschied zwischen den beiden ( SSH vs. VPN ) oder einer gut zusammengefassten Version zu erhalten , bevor Sie sich mit dem Einrichten Ihres eigenen VPN befassen. Wenn Sie sich für die VPN-Route entscheiden, empfehle ich OpenVPN , das kostenlos ist und eine Menge Dokumentation und Support bietet.

Ricbax
quelle
6
schlechter Rat. "Blowfish" ist eine SSH-1-Chiffre; Es ist schnell und sicher (ab 1999: unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 ), aber immer noch. Sie möchten wahrscheinlich ssh -2 -C -D [...](SSH2 erzwingen, Komprimierung verwenden) und die -c. Laut meinem System ist man sshdie Verschlüsselungsliste in SSH2 standardmäßig auf aes128-cbc,3des-cbc,blowfish-cbc,[etc]. Mein Punkt ist, wenn Sie verlangen -c blowfish, könnten Sie mit SSH1 enden, das viel weniger sicher ist als SSH2.
Quack Quijote
2
Stimmt, aber der Jeremy hatte den Eindruck, dass die Verbindung mit nur -D 8080 sicher war. Ich habe lediglich angegeben, dass sie besser ist als das, was er verwendet. Sie machen einen gültigen Punkt und deshalb erwähne ich das Handbuch für mehr Optionen.
Ricbax
Vielleicht solltest du deine Antwort ändern, da es sonst hilfreich ist.
Endolith
Ich habe vergessen, dass ich dies gefragt habe. Benutze diese Seite nicht regelmäßig. Vielen Dank für die Klarstellung ... Ich hatte den starken Eindruck, dass SSH standardmäßig sicher ist.
Jeremy Banks
9
WTF verwendet standardmäßig keine SSH-Verschlüsselung?
LatinSuD
-3

Verwenden Sie diese Beispiele:

  • Leiten Sie Port 80 von einem Remote-Host an 8888 auf Ihrem lokalen Host weiter

    ssh -fnN -L8888: localhost: 80 user @ server

    Verwenden Sie diese Option, um auf Dienste auf einem Remotehost zuzugreifen, die nur dort verfügbar sind

  • Leiten Sie Port 80 von Ihrem lokalen Host an 8888 auf einem Remote-Host weiter

    ssh -fnN -R8888: localhost: 80 user @ server

    Verwenden Sie diese Option, damit andere Benutzer auf Ihre Dienste zugreifen können: Webserver oder was auch immer.

Prost! :)

kolypto
quelle
Guter Kommentar, aber überhaupt nicht im Zusammenhang mit dem, worüber wir hier sprechen. Reverse ssh ermöglicht es einem SERVER, anzufordern, dass ein Client einen Port des Datenverkehrs zu ihm weiterleitet. Es wäre eine weitere Konfiguration erforderlich, um diesen Datenverkehr ins Internet zu leiten. Sie müssten auch einen SSH-Tunnel für jeden Port einrichten. UND es muss vom Server initiiert werden, nicht vom Client. Warum würden Sie das jemals tun, wenn Sie es nicht müssten?
Beachhouse