[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/