Aus Linux-Magazin 02/2012

Netzwerktricks mit Proxys, Routern und VPNs

© cydonna, photocase.com

Wer die Ethernet-Leitung oder den Wireless-Router kontrolliert, jubelt den angeschlossenen Geräten neue Inhalte unter oder gaukelt ihnen vor, sie stünden am anderen Ende der Welt. Besonders eindrucksvoll ist der Effekt, wenn diese sich erst einmal zugeknöpft geben.

Meinen Schreibtisch ziert seit einem Jahr ein Chumby ([2], Abbildung 1), ein kleiner, Radiowecker-ähnlicher Kasten, auf dem konfigurierbare Apps Schlagzeilen, das Wetter, Börsenkurse und die News aus der Welt der Programmierung durchtickern. Der Zweitbildschirm im Augenwinkel nervt weniger als ein Widget auf dem Hauptschirm und ich lese Klatsch aus Silicon Valley oder erlebe bahnbrechende Neuheiten der Gadget-Industrie.

Abbildung 1: Der Chumby zeigt die neuesten Schlagzeilen auf Ihackernews.com an.

Abbildung 1: Der Chumby zeigt die neuesten Schlagzeilen auf Ihackernews.com an.

Defcon-2 dank Werbung

Vor einigen Wochen hielt es eine offenbar vom schnöden Werbemammon geblendete Person der Chumby-Zentrale für nötig, zwischen meinen Kanälen eine zehn Sekunden dauernde Werbung für eine Autoversicherung einzublenden (Abbildung 2). Ich schaltete auf Defcon-2 [3] und untersuchte, ob die Chumby-Einstellungen einen HTTP-Proxy erlauben, um die lästige Werbung abzufangen, bevor sie auf dem Chumby eintrifft.

Abbildung 2: Die Reklamehexe hat sich ungefragt zwischen die Chumby-Kanäle gedrängt.

Abbildung 2: Die Reklamehexe hat sich ungefragt zwischen die Chumby-Kanäle gedrängt.

Im Forum erfuhr ich, dass Chumby keinen HTTP-Proxy unterstützt, man aber einen USB-Stick einstöpseln kann, auf dem in einer Datei »userhook0« im Rootverzeichnis die Proxy-Einstellungen von Abbildung 3 stehen. Damit gebootet schleust das Gerät HTTP-Requests durch den Proxyserver, der die URLs ansehen und eventuell manipulieren kann.

Abbildung 3: Steckt im Chumby ein USB-Stick mit einer Datei »userhook0«, übernimmt das Gerät während des Bootvorgangs die dort eingestellten Proxy-Parameter.

Abbildung 3: Steckt im Chumby ein USB-Stick mit einer Datei »userhook0«, übernimmt das Gerät während des Bootvorgangs die dort eingestellten Proxy-Parameter.

Squid oder handgestrickt

Als Proxyserver eignet sich Squid [4], aber wer gerne bastelt, zimmert sich wie in Listing 1 mit dem CPAN-Modul HTTP::Proxy schnell einen loggenden Proxy zusammen. Zeile 21 startet den Proxyserver, der auf Port 9999 des Hosts 192.168.1.123 lauscht, die HTTP-Requests des Chumby entgegennimmt und die Inhalte aus dem Internet holt. Der ab Zeile 10 eingeschobene »request« -Filter sieht sich einen eintreffenden HTTP-Request an, fieselt die URL heraus und gibt sie mit »print« aus.

Listing 1

proxy-logger

01 #!/usr/local/bin/perl -w
02 use strict;
03 use HTTP::Proxy;
04 use HTTP::Proxy::HeaderFilter::simple;
05
06 my $proxy = HTTP::Proxy->new(
07     host => "192.168.1.123",
08     port => 9999 );
09
10 $proxy->push_filter(
11   request =>
12     HTTP::Proxy::HeaderFilter::simple->new(
13       sub {
14         my( $self ) = @_;
15         print $self->proxy->request->uri(),
16               "\n";
17       }
18     )
19 );
20
21 $proxy->start;

Mit diesem Spion in der Leitung zeigt Abbildung 4, was der Chumby so alles treibt. Um der unerwünschten Werbung den Teppich unter den Füßen wegzuziehen, ändert Listing 2 die Methode »push_filter()« so, dass sie die URL des Requests umschreibt, falls Chumby ursprünglich den berühmten Eviladserver.com verlangt hat.

Listing 2

proxy-adkiller

01 #!/usr/local/bin/perl -w
02 use strict;
03 use HTTP::Proxy;
04 use HTTP::Proxy::HeaderFilter::simple;
05 use HTTP::Request::Common;
06
07 my $proxy = HTTP::Proxy->new(
08     host => "192.168.1.123",
09     port => 9999 );
10
11 my $repl = "http://perlmeister.com/test/" .
12            "sandy-beach.jpg";
13
14 $proxy->push_filter(
15   request =>
16     HTTP::Proxy::HeaderFilter::simple->new(
17       sub {
18         my( $self, $headers, $req ) = @_;
19
20         if( $req->uri() =~
21                 /eviladserver\.com/ ) {
22           $_[2] = GET $repl;
23         }
24       }
25     )
26 );
27
28 $proxy->start;

Statt nervender Werbung erscheint dann ein Bild vom Sandy Beach auf meiner Lieblingsinsel Oahu auf Hawaii, in dessen Brandung es erfahrene Bodysurfer in einer zusammenbrechenden Welle sauber umherbeutelt.

Abbildung 4: Der loggende Proxy schreibt die vom Chumby aufgerufenen URLs mit.

Abbildung 4: Der loggende Proxy schreibt die vom Chumby aufgerufenen URLs mit.

Manipulierender Proxy

Das HTTP::Proxy-Framework reicht in Zeile 18 drei Parameter in den Filter-Callback hinein: in »$self« eine Referenz auf das Filter-Objekt selbst, in »$headers« ein Header-Objekt und in »$req« das Request-Objekt. Stellt der Pattern-Match in den Zeilen 20 und 21 fest, dass die URL des Requests auf »eviladserver.com« zeigt, setzt Zeile 22 in »$_[2]« das Request-Objekt der rufenden Funktion auf ein neues, das auf das JPG-Bild mit dem hawaiianischen Strand auf http://perlmeister.com weist. Ein kurzer Test mit Firefox und den in Abbildung 5 gezeigten Proxy-Settings bestätigt die Umleitung.

Abbildung 5: Das Firefox-Menü »Network Settings« lässt den Browser auf den modifizierenden Proxy zeigen.

Abbildung 5: Das Firefox-Menü »Network Settings« lässt den Browser auf den modifizierenden Proxy zeigen.

Nun erlaubt es nicht jedes Gerät, dass Endnutzer einen Proxy einstellen. Im Chumby etwa verwenden manche Apps eine Library, die die Proxy-Einstellungen schlicht ignoriert. Hat man keinen Zugriff auf den Sourcecode der auf dem Gerät laufenden Programme, greift der Fachmann zu Tricks in verschiedenen Netzwerkschichten, um die ausgesandten IP-Pakete wunschgemäß umzuleiten.

Gezähmte Widerspenstige

Ein Amazon Kindle verbindet sich mit einem WLAN, ohne nach einem Proxyserver zu fragen (Abbildung 6). Was tun, falls das lokale WLAN nur via Proxy oder Tunnel ins Internet kann oder man dem Amazon-Server eine andere IP vorgaukeln möchte? Der Kindle holt sich beim Verbinden eine dynamische IP vom DHCP-Server ab und erhält von diesem noch die IP eines Default-Gateway, üblicherweise die des Routers.

Abbildung 6: Beim Verbinden des Kindle mit einem Wireless-Netzwerk lässt sich kein Proxy einstellen.

Abbildung 6: Beim Verbinden des Kindle mit einem Wireless-Netzwerk lässt sich kein Proxy einstellen.

Setzt der Kindle dann einen Webrequest ab, schickt er ein an den Webserver adressiertes Paket an das Default-Gateway. Handelt es sich um einen Linksys-Router mit Tomato-Firmware [6], fängt es mit den in Abbildung 7 gezeigten »iptables« -Anweisungen die Pakete ab, denn auf dem putzigen Router läuft Linux mit vollem Netzwerkstack. Die Regel prüft, ob ein Paket an den Port 80 eines Webservers geht, und leitet es in diesem Fall an die Adresse des ebenfalls an den Router angeschlossenen handgeschriebenen Proxyservers auf Port 9999 um.

Abbildung 7: Mit diesen IPtables-Regeln schickt der Linksys-Router alle HTTP-Requests an den Proxy.

Abbildung 7: Mit diesen IPtables-Regeln schickt der Linksys-Router alle HTTP-Requests an den Proxy.

Die erste Anweisung in Abbildung 7 verhindert, dass die Umleitung auch für Pakete zur Steuerung der Router-Adminoberfläche greift. Sie schnappt sich eintrudelnde IP-Pakete, die an Port 80 des Routers gehen, denn die Option »-d« (für Destination) ist auf die IP 192.168.20.1 des Routers gesetzt. In der »PREROUTING« -Phase setzt die Regel so das Target »ACCEPT« , damit gehen die Pakete ohne Umschweife an den auf dem Router wartenden Webserver, ohne nachfolgende IPtables-Regeln zu beachten.

Tomate mit Sshd

In der Tomato-Firmware lässt sich auch ein SSH-Server starten. Loggt sich dann der experimentierfreudige Chumby-Bastler mittels »ssh root@192.168.20.1« ein und tippt das ebenfalls auf der Weboberfläche verwendete Admin-Passwort, zeigt ein folgender Aufruf von »ifconfig« , dass das LAN-Interface auf den Namen »br0« hört, während das WAN-Interface »eth0« heißt.

Der auf dem LAN angeschlossene Rechner mit dem loggenden Proxyserver hat nun die IP-Adresse »192.168.20.148« bekommen, demnach leitet die zweite IPtables-Anweisung in Abbildung 7 alle Pakete, die nicht vom Proxy kommen (»-s ! IP« ) und für Port 80 eines beliebigen Servers bestimmt sind, an die IP des Proxys und dort auf Port 9999 weiter. Das Verfahren ist unter der Bezeichnung “Transparent Proxy” oder “Intercepting Proxy” bekannt [5].

Damit die vom Proxy nach getaner Arbeit ankommenden Pakete nicht direkt an den ursprünglichen Sender zurückgehen, sondern den Weg über den Router nehmen, schreibt die dritte IPtables-Regel in Abbildung 7 die Pakete an den Proxy so um, dass sie als Return-Adresse den Router angeben, nicht etwa den ursprünglichen Sender.

Regelwerk

Die drei genannten Regeln sind unter dem Menü »Administration | Scripts« im Tab »WAN Up« im Gerät einzuspeichern, damit der Router sie auch persistent in seinem NVRAM-Speicher ablegt und nach einem Reboot ausführt, sobald das WAN des Routers verfügbar ist. Verbinde ich den Kindle 3 nach dieser Vorarbeit dann mit dem bereitgestellten Wireless-Netzwerk des Routers und tippe auf dem unter dem Eintrag »Experimental | Browser« erhältlichen Webbrowser einige URLs ein, sehe ich im Proxy-Log, was der Kindle-Browser so an Abfragen absetzt.

Sicher mit SSL

Nutzt ein Sender allerdings eine SSL-Verbindung mittels einer »https://« -URL und implementiert die zugehörigen Zertifikatsprüfungen korrekt, kann ein zwischengeschalteter Proxy die Kommunikation weder abhören noch manipulieren. Das wäre ein Man-in-the-Middle-Angriff, aber eine SSL-Verbindung verhindert diesen effektiv.

Allerdings lassen sich beispielsweise mit einem VPN die IP-Pakete so umlenken und mit NAT-Einstellungen umschreiben, dass der vom Gerät kontaktierte Server glaubt, das Gerät befände sich an einem bestimmten Ort, an dem es in Wirklichkeit aber gar nicht ist: Das stellt ein wirksames Verfahren gegen Websites dar, die sich dagegen sperren, ihre Inhalte an bestimmte Geolocations auszuliefern.

Erweiterte Firmware

Die erweiterte Tomato-Routerfirmware »tomato-usb« [7] verfügt über einen Open-VPN-Client (Abbildung 9), der sich mit VPN-Anbietern wie zum Beispiel Ibvpn.com verbindet, die gegen Gebühr Open-VPN-Server in mehreren Ländern anbieten. Den Usernamen und das Passwort für Ibvpn.com schreibt das Startup-Skript in Abbildung 8 beim Booten des Routers in die temporäre Datei »/etc/ibvpn.conf« .

Abbildung 9: Die Tomato-USB-Firmware auf dem Linksys-Router definiert einen Open-VPN-Client, der angeschlossenen Wireless-Clients eine WAN-Adresse in einer anderen Geolocation verpasst.

Abbildung 9: Die Tomato-USB-Firmware auf dem Linksys-Router definiert einen Open-VPN-Client, der angeschlossenen Wireless-Clients eine WAN-Adresse in einer anderen Geolocation verpasst.

Abbildung 8: Diese Skripte – unter der Rubrik »Administration« zu finden – starten den Open-VPN-Client, wenn der Router bootet.

Abbildung 8: Diese Skripte – unter der Rubrik »Administration« zu finden – starten den Open-VPN-Client, wenn der Router bootet.

Da im Filesystem des Routers abgelegte Dateien keinen Reboot überstehen, helfen im Tomatenland Shellskripte, die das im NVRAM abgelegte Skriptpanel beim Booten des Routers dynamisch anlegt. Das erste Kommando legt, wie Abbildung 8 zeigt, den Inhalt des Skripts in der temporären Datei »/tmp/vpn.sh« ab, das folgende »sh /tmp/vpn.sh &« führt den Code im Hintergrund aus.

Scripted Reality

Das Skript selbst wartet mit einer »while« -Schleife und »sleep« -Anweisungen ausgestattet so lange, bis »/var/notice/sysup« existiert. Damit signalisiert der Router, dass er das System erfolgreich gebootet hat. Ist dies erfüllt, fährt »service vpnclient1 start« den ersten Open-VPN-Client hoch (Tomato-USB bietet zwei), der sich mit dem Open-VPN-Server verbindet. Ein gelungener Handshake setzt voraus, dass auf Tomato-USB unter dem Reiter »Keys« das Open-SSL-Zertifikat des Servers und eventuelle geheime Schlüssel eingetragen sind.

Der Open-VPN-Server verstellt im Erfolgsfall mit einem »push« -Kommando die Routingtabellen des Routers dergestalt, dass ausgehende Pakete automatisch erst einmal an das andere Ende des VPN-Tunnels gehen. Von dort leitet sie anschließend der Open-VPN-Server weiter an den Ziel-Webserver, der gutgläubig meint, er spräche mit dem Open-VPN-Server selbst.

Diese Vorgehensweise funktioniert auch im Zusammenspiel mit SSL-Verbindungen tadellos. Auch diese merken von dem derart unter den Füßen weggezogenen Teppich rein gar nichts, denn sie operieren viel weiter oben im Netzwerkstack. Weitere praktische Tipps zur VPN-Konfiguration liefert das “Open VPN 2 Cookbook” [8].

Online PLUS

In einem Screencast demonstriert Michael Schilli das Beispiel: https://www.linux-magazin.de/plus/2012/02

Infos

  1. Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2011/05/Perl
  2. Chumby: http://chumby.com
  3. Defense Readiness Condition:http://en.wikipedia.org/wiki/DEFCON
  4. Squid-HTTP-Proxy:http://www.squid-cache.org
  5. Kulbir Saini, “Squid Proxy Server 3.1, Beginner’s Guide”: Packt Publishing, 2011
  6. Tomato-Firmware für Linksys-Router: http://www.polarcloud.com/tomato
  7. Tomato-Firmware: http://tomatousb.org
  8. Jan Just Keijser, “OpenVPN 2 Cookbook”: Packt Publishing, 2011

Der Autor

Michael Schilli arbeitet als Software-Engineer bei Yahoo in Sunnyvale, Kalifornien. Er hat “Goto Perl 5” (auf Deutsch) und “Perl Power” (auf Englisch) für Addison-Wesley geschrieben und ist unter mailto:mschilli@perlmeister.com zu erreichen. Seine Homepage ist http://perlmeister.com.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben