[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
SSH, Proxy, Privatsphaere?
[Thread Prev] | [Thread Next]
[Date Prev] | [Date Next]
- Subject: SSH, Proxy, Privatsphaere?
- From: Raphael Eiselstein <rabe@xxxxxxxxx>
- Date: Sun, 18 Oct 2015 19:43:30 +0200
- To: uugrn@xxxxxxxxxxxxxxx
Hallo zusammen, immer mal wieder spiele ich den Erklaerbaer fuer Dinge, die man mit SSH (OpenSSH) anstellen kann. Weil es so viele Moeglichkeiten gibt Dinge damit anzustellen, will ich mal 2 verschiedene Hauptanwendungsfaelle skizzieren und einen Anwendungsfall basierend auf einer Kombination aus beiden: Uebersicht 0. Verwendete Werkzeuge 1. SSH als sicherer Tunnel 1.1: einfaches tcp portforwarding 1.2: dynamisches portforwarding 2. SSH unter erschwerten Bedingungen (Firewall, Proxyzwang) nutzen 2.1: Firewall umgehen, SSH auf Port 443 2.2: Proxypflicht: SSH via HTTP-Proxy auf Port 443 3. Kombinierte Anwendungsfaelle 3.1: Jabber auf xmpp.uugrn.org nutzen via shell.uugrn.org (Selbst-Registrierung) 0. Verwendete Werkzeuge ssh: OpenSSH: das zentrale Werkzeug, um das es hier geht nc: netcat-openbsd (nicht netcat-traditional): Ein kleines aber sehr maechtiges Hilfswerkzeug in Kombination mit OpenSSH fuser: Hilfsprogramm zum Anzeigen und Beenden ("-k") von Prozessen, die eine bestimmte Ressource (zB Datei oder TCP Port ("-n tcp")) belegen. 1. SSH als sicherer Tunnel 1.1 Einfaches TCP-Portforwarding Viele haben schon sicher gesehen, dass man mit einem gezielten SSH-Tunnel den Zugriff auf einen bestimmten Dienst "absichern" kann. Beispiel 1.1: Zugriff von PC auf mail.uugrn.org:25 via shell.uugrn.org [PC] --(ssh)--> [shell.uugrn.org] --(smtp)--> [mail.uugrn.org] Wichtig: Hier wird nur die Verbindung von meinem PC zu shell.uugrn.org abgesichert (ssh), nicht jedoch die Verbindung zwischen shell.uugrn.org und mail.uugrn.org (smtp). ----------------------------------------------------------------------------- 1 user@pc:~$ ssh -L 30025:mail.uugrn.org:25 -f -N shell.uugrn.org 2 user@pc:~$ nc 127.0.0.1 30025 3 220 mail.uugrn.lan ESMTP Sendmail 8.14.5/8.14.5; Sun, 18 Oct 2015 13:08:36 +0200 (CEST) 5 ehlo werbinich 6 250-mail.uugrn.lan Hello unknown@xxxxxxxxxxxxxxx 7 [IPv6:2a03:2500:1:6:16::], pleased to meet you 8 250-ENHANCEDSTATUSCODES 9 250-PIPELINING 10 250-8BITMIME 11 250-SIZE 12 250-DSN 13 250-DELIVERBY 14 250 HELP 15 quit 16 221 2.0.0 mail.uugrn.lan closing connection 17 user@pc:~$ fuser -k -n tcp 30025 18 30025/tcp: 4912 ----------------------------------------------------------------------------- 1: Aufbau eines SSH-Tunnels via shell.uugrn.org. Der einzige Anwendungszweck ist der tcp-Forward mit -L, -f -N sorgen dafuer, dass das lediglich der SSH-Tunnel aufgebaut wird, es wird kein weiteres remote-command ausgefuehrt ("-N") und das ssh "forkt sich in den Hintergrund", d.h. es laeuft weiter, die Shell kommt allerdings zurueck. 2: Zugriff mit "nc" auf 127.0.0.1 Port 30025: Nach einer kurzen Pause antwortet der Mail-Server 5+6: mit "ehlo werbinich" begruesse ich den Mailserver mit meinem eigenen Namen ("werbinich") und der Mailserver Gruesst mich zurueck als "unknown@xxxxxxxxxxxxxxx": --> der Mailserver sieht, dass mein Zugriff von shell.uugrn.org aus kommt. q.e.d. 15: quit -> smtp-Dialog beenden 17+18: mit "fuser -k" kann man Prozesse killen bzw. anzeigen, die eine bestimmte Ressource (hier: "-n tcp 30025") belegen. In diesem Fall also den ssh-Client, der am Anfang (1) gestartet wurde. Den Tunnel muss man allerdings nicht beenden wenn man ihn verwendet hat, fuer mehrere Trial-and-Error Runden empfiehlt es sich allerdings. 1.2 Dynamisches TCP Portforwarding / SOCKS5 Proxy Statt nur einer einzelnen TCP Weiterleitung kann man auch etwas bauen, mit dem man recht flexibel mehrere verschiedene Anwendungsfaelle durch den gleichen SSH-Tunnel schleusen kann, etwa wenn man per SSH-Tunnel im WorldWideWeb surfen moechte waere es sehr anstrengend und teilweise sehr kompliziert fuer alle moeglichen Server jeweils die passenden Tunnel anzulgen. Viele Anwendungsprogramme (Browser, Mailprogramme, Chat-Programme, netcat, etc) unterstuetzen generell die Nutzung eines Proxy Servers, insbesondere SOCKS5-Proxies. Beispiel 1.2: Zugriff von PC auf beliebige Dienste via shell.uugrn.org [PC] --(ssh)--> [shell.uugrn.org] --(protokoll)--> [zielserver:port] Wichtig: Hier wird nur die Verbindung von meinem PC zu shell.uugrn.org abgesichert (ssh), nicht jedoch die Verbindung zwischen shell.uugrn.org und dem jeweiligen Zielserver. In diesem Beispiel verwenden wir den Service "shell.uugrn.org" auf Port "8888", welcher nur mit der IP-Adresse des Clients antwortet. Der gleiche Service ist auch auf "sigsys.de:8888" verfuegbar. Meine IP-Adresse ist in diesem Fall die IPv6-Adresse 2003:5f:ed1c:9100:b8b4:bc4:ea07:1bde, das funktioniert allerdings gleichermassen auch mit IPv4. ----------------------------------------------------------------------------- 1 user@pc:~$ fuser -k -n tcp 1080 2 1080/tcp: 3793 5376 3 user@pc:~$ ssh -D 1080 -f -N shell.uugrn.org 4 user@pc:~$ nc shell.uugrn.org 8888 5 2003:5f:ed1c:9100:b8b4:bc4:ea07:1bde 6 user@pc:~$ nc sigsys.de 8888 7 2003:5f:ed1c:9100:b8b4:bc4:ea07:1bde 8 user@pc:~$ nc -X 5 -x 127.0.0.1:1080 shell.uugrn.org 8888 9 2a03:2500:1:6:16:: 10 user@pc:~$ nc -X 5 -x 127.0.0.1:1080 sigsys.de 8888 11 2a03:2500:1:6:16:: 12 user@pc:~$ host 2a03:2500:1:6:16:: 13 0.0.0.0.0.0.0.0.0.0.0.0.6.1.0.0.6.0.0.0.1.0.0.0.0.0.5.2.3.0.a.2.ip6.arpa domain name pointer shell.uugrn.org. ----------------------------------------------------------------------------- 1+2: Prozesse killen, die Port 1080 belegen (fuser -k) 3: SSH-Tunnel mit "Dynamic Portforwarding" aufbauen, es handelt sich anwendungsseitig um einen SOCKS5-Proxy. 4..7: Einfacher Zugriff auf shell.uugrn.org:8888 und sigsys.de:8888 ohne SSH-Tunnel und ohne Proxy. Der Service antwortet jeweils mit meiner eigenen IP-Adresse. 8..11: Der gleiche Zugriff auf shell.uugrn.org:8888 und sigsys.de:8888 allerdings unter Verwndung eins SOCKS5-Proxies ("-X 5") unter der Adresse 127.0.0.1:1080 ("-x"). Der Service antwortet in diesem Fall jeweils mit der IP-Adresse des SSH-Tunnelendpunktes, hier shell.uugrn.org. Statt mit netcat ("nc") wie in diesem Beispiel koennte man nun fuer beliebige Clients (zB Thunderbird, psi-plus, Firefox, ...) einen SOCKS5-Proxy konfigurieren und dann fuer die jeweils zugegriffenen Ziel-Dienste nutzen, etwa mail.uugrn.org:25: ----------------------------------------------------------------------------- 1 user@pc:~$ nc -X 5 -x 127.0.0.1:1080 mail.uugrn.org 25 2 220 mail.uugrn.lan ESMTP Sendmail 8.14.5/8.14.5; Sun, 18 Oct 2015 13:55:53 +0200 (CEST) 3 ehlo werbinich 4 250-mail.uugrn.lan Hello unknown@xxxxxxxxxxxxxxx [IPv6:2a03:2500:1:6:16::], pleased to meet you [...] ----------------------------------------------------------------------------- 1: Zugriff per netcat via SOCKS-Proxy auf mail.uugrn.org:25 3+4: Begruessung in SMTP Genug der Beispiele, wie man SSH-Tunnel *anwenden* kann. 2. SSH unter erschwerten Bedingungen In manchen Netzen, zum Beispiel oeffentliche WLANs in Hotels und Gastronomie ist der Zugriff auf das Internet beschraenkt auf die Nutzung von einigen wenigen Diensten, zum Beispiel E-Mail und Web-Surfen. Unser aller Liebling-Service SSH ist meistens nicht erlaubt und somit haeufig geblockt. Besonders gesicherte Netzwerke verbieten den direkten Zugriff auf das Internet und erzwingen die Nutzung eines Proxy Servers, meistens ein einfache Web-Proxy. 2.1 Einfache Firewall "umgehen" Billige "Gaeste-WLAN" Loesungen erlauben/verbieten den Zugriff auf Dienste durch eine Firewall, die basierend auf TCP-Ports Zugriffe ermoeglicht oder eben sperrt. Die Loesung ist hier recht einfach, man benoetigt allerdings (irgendeinen) SSH-Server, der auf Port 443 lauscht, dem Port der normalerweise fuer "https" reserviert und somit auch haeufig freigegeben ist. Beispiel 2.1 ----------------------------------------------------------------------------- 1 user@pc:~$ ssh -p 443 user@xxxxxxxxxxxxxxx 2 [...] 3 [user@shell ~]$ echo $SSH_CLIENT 4 2003:5f:ed1c:9100:b8b4:bc4:ea07:1bde 33369 443 5 [user@shell ~]$ logout 6 Connection to shell.uugrn.org closed. ----------------------------------------------------------------------------- 1: Normale SSH-Verbindung auf Port 443 an shell.uugrn.org 3+4: Anzeige der Verbindungsparameter dieser SSH-Session 2.2: SSH durch Zwangsproxy In diesem Fall gibt es gar keine direkte Verbindung zum Internet und man muss einen Zwangsproxy benutzen. Zwangsproxies ermoeglichen normalerweise nur den Zugriff auf bestimmte freigegebene Ports, zum Beispiel 443 (https), nicht aber auf 8888 (zB unser MyIP-Service). Beispiel 2.2: Zugriff mit netcat via HTTP-Proxy auf 192.168.5.20:3128 mit der "CONNECT"-Methode: ----------------------------------------------------------------------------- 1 user@pc:~$ nc -X connect -x 192.168.5.20:3128 shell.uugrn.org 8888 2 nc: Proxy error: "HTTP/1.0 403 Forbidden" 3 user@pc:~$ nc -X connect -x 192.168.5.20:3128 shell.uugrn.org 22 4 nc: Proxy error: "HTTP/1.0 403 Forbidden" 5 user@pc:~$ nc -X connect -x 192.168.5.20:3128 shell.uugrn.org 443 6 SSH-2.0-OpenSSH_5.8p2_hpn13v11 FreeBSD-20110503 7 ^C ----------------------------------------------------------------------------- 1+2: Zugriff auf shell.uugrn.org:8888 --> gesperrt, 8888 ist kein erlaubter Port 3+4: Zugriff auf shell.uugrn.org:22 (ssh) --> gesperrt, 22 ist kein erlaubter Port 5+6: Zugriff auf shell.uugrn.org:443 (https, hier ssh) --> klappt, SSH-Server shell.uugrn.org:443 antwortet Beispiel 2.3: OpenSSH via HTTP-Proxy mithilfe von netcat ----------------------------------------------------------------------------- 1 $ ssh -p 443 -o "ProxyCommand = nc -X connect -x 192.168.5.20:3128 %h %p" shell.uugrn.org 2 [user@shell ~]$ echo $SSH_CLIENT 3 2003:5f:ed1c:9100:b699:baff:feb5:3635 44953 443 4 [user@shell ~]$ logout 5 Connection to shell.uugrn.org closed. ----------------------------------------------------------------------------- 1: Ueber die Option "ProxyCommand" kann man den ssh-Client anweisen ein tool oder script auszufuehren *anstelle* der TCP-Verbindung, die ssh normalerweise eigenstaendig ausmachen wuerde. Wichtig ist, dass alles hinter -o "..." zu ProxyCommand gehoert. %h wird dabei durch den hostnamen und %p durch den Port ersetzt. 3: $SSH_CLIENT enthaelt nun die IPv6-Adresse meines Proxy-Servers, den ich intern unter 192.168.5.20 angesprochen habe. Proxy: 2003:5f:ed1c:9100:b699:baff:feb5:3635 PC: 2003:5f:ed1c:9100:b8b4:bc4:ea07:1bde Das Szenario mit dem Firewall oder dem Zwangsproxy hat natuerlich auch andere Anwendungsfaelle, zum Beispiel wenn man Netzwerke nutzen muss bei denen die Privatsphaere nicht sicher gestellt sein kann. SSH-Tunnel kann man ausserdem Nutzen um die eigene IP-Adresse gegenueber dem Dienstanbieter zu verschleiern, wenn man der "freiwilligen" Vorratsdatenspeicherung des Serviceanbieters nicht vertraut ("Logfiles"). Aber Achtung: bei der Nutzung von Zwangsproxies gelten idR auch andere Vorschriften *und* der Admin verfuegt ueber ein Logfile des Proxy Servers, bei dem dann Logzeilen enthalten sind, etwa bei squid3: ----------------------------------------------------------------------------- 1 1445170658.507 0 192.168.5.135 TCP_DENIED/403 3389 CONNECT shell.uugrn.org:8888 - NONE/- text/html 2 1445170668.899 0 192.168.5.135 TCP_DENIED/403 3385 CONNECT shell.uugrn.org:22 - NONE/- text/html 3 1445170674.473 815 192.168.5.135 TCP_MISS/200 49 CONNECT shell.uugrn.org:443 - DIRECT/2a03:2500:1:6:16:: - 4 1445170971.123 7677 192.168.5.135 TCP_MISS/200 4065 CONNECT shell.uugrn.org:443 - DIRECT/2a03:2500:1:6:16:: - ----------------------------------------------------------------------------- Die Zeilen 1-3 entsprechen dabei den Versuchen aus Beispiel 2.2 (oben). Uebrigens: ssh mit Hilfe von ProxyCommand ueber eine bestehende SOCKS5-Verbindung geht hier natuerlich auch (ProxyCommand = nc -X 5 -x ...) Die Kombinationen aus ssh-erzeugt-Proxy und ssh-nutzt-Proxy sind unbegrenzt. 3. Kombinierte Anwendungsfaelle zum Ausprobieren 3.1: Nutzung von UUGRN Jabber mit Selbstregistrierung fuer Mitglieder Der UUGRN Jabber Server steht aktuell nur fuer Mitglieder offen. Einmal registrierte Accounts koennen den Jabber-Server von ueberall her nutzen, allerdings ist die Selbst-Registrierung des Servers limitiert auf die IP-Adressen des UUGRN-Vereinsservers, mithin koennen also nur rechtmaessige Nutzer des Servers (=Mitglieder) eine entsprechende Verbindung oeffnen. Grob gesagt funktioniert es so: Zuaechst wird ein SSH-Tunnel als SOCKS5 Proxy gestartet. Ueber diesen SOCKS5 proxy kann man dann zB mit "psi plus" (Jabber Client) eine Verbindung zum Server hin aufmachen. Aus Sicht des Servers kommt der Zugriff dann von shell.uugrn.org, was in diesem Falle die Selbstregistrierung ermoeglicht ("Whitelist"). Zunaechst benoetigen wir einen SOCKS5-Proxy auf 127.0.0.1:1080 der auf shell.uugrn.org terminiert: --------------------------------------------------------------- 1 user@pc:~$ ssh -D 1080 -f -N shell.uugrn.org --------------------------------------------------------------- Beispiel fuer psi-plus: Allgemein -> Benutzerkonten -> Hinzufuegen Name: uugrn [x] Neues Benutzerkonto registrieren -> Hinzufuegen Name des Servers: uugrn.org [x] Server-Namen und -Port manuell (Aufloesung ueber SRV-records klappt scheinbar nicht via SOCKS5-Proxy) Server: xmpp.uugrn.org Port: 5222 Verschluesselung: Immer Proxy: (Auswahl) --> Bearbeiten [Neu] -> "ssh tunnel" Typ: SOCKS Version 5 Server: 127.0.0.1 Port 1080 [Speichern] Zurueck in der Konto-Registrierung: Proxy: "ssh-tunnel" (Auswahl) [Weiter] SSL-Zertifikat vertrauen oder "Trotzdem" Username: Wunschname Password: geheimgeheim123! Fertig, Speichern. Nach der Registrierung am Server kann man in Psi-plus im Account unter den Verbindungseinstellungen die Nutzung des SOCKS-Proxys wieder deaktivieren und auch die Verbindungsparameter auf "automatisch" stellen. Danach kann der SOCKS-Proxy auch wieder weg --------------------------------------------------------------- 1 user@pc:~$ fuser -k -n tcp 1080 2 1080/tcp: 5448 --------------------------------------------------------------- Abschliessend moechte ich auf die Vorzuege von ~/.ssh/config verweisen, wo man viele der Parameter je nach Ziel-Host oder auch Global hinterlegen kann, etwa die Angabe von ProxyCommand. Alle Beispiele von ssh+netcat kann man sinngemaess auch mit PuTTY unter Windows nachbauen, wobei PuTTY nicht auf ein exteres Hilfstool wie netcat angewiesen ist sondern eigenstaendig SOCKS5-Clientfunktionen oder CONNECT-Proxyclient ("https") implementiert. Fuer viele Anwendungsprogramme gibt es (meistens irgendwo versteckt) SOCKS5-Proxy Unterstuetzung, mindestens bei Firefox, thunderbird, psi-plus. Have fun! Raphael -- SMTP+XMPP: rabe@xxxxxxxxx oder rabe@xxxxxxxxx OTR: 33790A42 C28ED889 2ABEA87C 4E829C29 C76E2F24 PGP: 4E63 5307 6F6A 036D 518D 3C4F 75EE EA14 F625 DB4E .........|.........|.........|.........|.........|.........|.........|.. -- UUGRN e.V. http://www.uugrn.org/ http://mailman.uugrn.org/mailman/listinfo/uugrn Wiki: https://wiki.uugrn.org/UUGRN:Mailingliste Archiv: http://lists.uugrn.org/