Open Source im professionellen Einsatz
Linux-Magazin 04/2016
© Dmitry Kalinovsky, 123RF

© Dmitry Kalinovsky, 123RF

Anmeldeversuche im heimischen WLAN überwachen

Private Rezeption

Push-Notifications auf sein Handy halten den abwesenden Hausherrn darüber auf dem Laufenden, welche Clients sich im WLAN zu Hause an- und abmelden.

974

Online PLUS

Im Screencast demonstriert Michael Schilli das Beispiel: http://www.linux-magazin.de/Ausgaben/2016/04/plus

Immer wenn die Lichter an meinem Router wild zu blinken anfangen, ohne dass ich selbst im Netz aktiv bin, kommt mir der Verdacht, ob nicht einer meiner Nachbarn mein WPA2-Passwort geknackt hat und mit meinem Internetaccount Schabernack treibt. Ich wohne in einer Großstadt im zweiten Stock eines Hauses auf halber Höhe eines gewaltigen Hügels. Vermutlich empfangen ein paar Hundert Leute das Signal meines WLAN-Routers – und die Taugenichtse unter ihnen würden gerne damit herumspielen.

Die heute vorgestellten Skripte schnappen sich daher in regelmäßigen Abständen die beim WLAN-Router angemeldeten schnurlosen Geräte und schicken mir jedes Mal eine kurze Nachricht auf den Handyschirm, wenn sich ein neuer Client in meinem drahtlosen Netzwerk daheim an- oder abmeldet.

Dazu musste ich keine neue Handy-App schreiben, vielmehr bietet "Prowl" fürs iPhone (und "Notify my Android" für Android-Geräte) ein Webinterface, über das Anwendungen ihre Nachrichten abschicken können. Die Prowl-Server sorgen anschließend dafür, dass die Events an Endgeräte mit laufender Prowl-App zu den angemeldeten Usern weitergeleitet werden. Das funktioniert selbst bei verriegeltem Handy, dann erscheinen die Nachrichten kurz auf dem Lockscreen (Abbildungen 1 und 2).

Abbildung 1: So erfährt der Handy-Nutzer, wer sich zu Hause ins WLAN eingeklinkt hat.

Unbrauchbares Werkzeug

Wie kommt der Asus-RT-66U-Router, auf dem ich sofort nach dem Kauf wie immer reflexartig die freie DD-WRT-Software installiert habe, dazu, die angemeldeten User zu überwachen und bei Änderungen den Webservice auf dem Prowl-Server anzurufen? Der Prozess, der auf dem Router die dynamischen DHCP-IP-Adressen ausgibt, heißt »dnsmasq« und legt die zurzeit ausgegebenen DHCP-Leases in der Datei »/tmp/dnsmasq.leases« ab. Das verwendete Spaltenformat (Listing 1) listet für jede Lease die Gültigkeitsdauer in Sekunden auf, die MAC-Adresse des Geräts, die ihm zugewiesene IP-Adresse und einen Namen, mit dem das Gerät sich selbst beschreibt.

Abbildung 2: Der Router schiebt die DHCP-Daten auf einen Server, auf dem ein Cronjob den Prowl-Server auf dessen Web-API benachrichtigt. Der sendet eine Push-Notification an ein Handy mit installierter Prowl-App.

Listing 1

dnsmasq.leases

1 86400 74:da:42:1b:44:a7 192.168.20.148 raspberrypi *
2 86400 e8:80:2e:e9:11:a9 192.168.20.130 MikesiPhone e8:80:2e:e9:11:a9
3 86400 10:68:3a:17:4a:ba 192.168.20.131 android-oba143110ae5ee34 10:68:3a:17:4a:ba
4 86400 00:51:b6:76:a1:b6 192.168.20.134 Mikes-Macbook 00:51:b6:76:a1:b6

Auf einer Linux-Distribution wäre es relativ einfach, in einer Endlosschleife ankommende oder abgehende Clients zu erfassen und bei Änderungen einen HTTP-Request auf das Prowl-API abzusetzen. Allerdings bietet die DD-WRT-Distro auf dem Router nur eine sehr eingeschränkte Auswahl an Unix-Tools, und die sonst triviale Aufgabe, die Lease-Datei mit Perl zu durchforsten und im Bedarfsfall HTTP-Requests abzufeuern, wird zum Denksporträtsel.

Zwar könnte ich Perl auf dem Router installieren sowie einige CPAN-Module, aber je mehr die Konfiguration von einer fabrikneuen DD-WRT-Distribution abweicht, desto fehleranfälliger wäre das Ergebnis bei Upgrades. Ein einfaches Shellskript, das nur die aus der Busybox stammenden Tools auf dem Router verwendet, läuft hoffentlich auch in ein paar Jahren noch ohne manuelle Anpassungen und lässt sich relativ problemlos über das DD-WRT-GUI installieren. Das speichert das Skript im NVRAM des Routers, pflanzt es bei einem Neustart ins neue Dateisystem und startet seine Endlosschleife.

Mit Engelszungen

Das Shellskript in Listing 2 beschränkt sich daher darauf, die Datei mit den ausgegebenen IP-Adressen mittels »ssh« auf einen Account auf einen Server bei meinem Hoster zu spielen, wo ein Cronjob sie regelmäßig auf Abweichungen überprüft und mit Perl und einem von Prowl eingeholten API-Key den Prowl-Server kontaktiert.

Listing 2

lease-push.sh

01 #!/bin/sh
02 file=/tmp/dnsmasq.leases
03 var=lease-file
04
05 HOME=/tmp/root
06
07 cd /tmp
08 uudecode <<'EOT'
09 begin 664 keyfile
10 M5V%S(&EC:"!N:6-H="!W96G#GRP@;6%C:'0@;6EC:"!N:6-H="!H96G#GRX@
11 [...]
12 51\.V=&4N($]D97(@4V-H:6QL97(N
13 `
14 end
15 EOT
16
17 cd /tmp/root/.ssh
18 uudecode <<'EOT'
19 begin 664 known_hosts
20 M3&ER=6T@3&%R=6T@3,.V9F9E;'-T:65L+B!797(@;FEC:'1S(&AA="P@9&5R
21 [...]
22 >(&AA="!N:6-H="!V:65L+B!$;VYA;&0@5')U;7`N
23 `
24 end
25 EOT
26
27 cd /tmp
28 while [ "forever" ]
29 do
30     sum=`/usr/bin/sha1sum $file | cut -d " " -f1`
31     stored="$(/usr/sbin/nvram get $var)"
32
33     if [ "$stored" != "$sum" ]
34     then
35      /usr/bin/scp -i keyfile $file perlsnapshot@somehoster.com:
36      /usr/sbin/nvram set $var=$sum
37     fi
38
39     sleep 30
40 done

Selbst diese Aufgabe ist allerdings nicht ganz einfach, denn der »scp« -Client der auf Busybox basierenden Distribution ist nicht voll funktionsfähig und lässt sich nur mit Engelszungen dazu überreden, sich gegenüber dem Server beim Hoster mit Hilfe eines privaten Schlüssels zu identifizieren und dann die Datei dorthin zu übertragen.

Übergebe ich dem »ssh« -Prozess auf DD-WRT einen mit »ssh-genkey« erzeugten Private Key, dann verabschiedet er sich kurz und knapp mit der Meldung, dass irgendwo in den Tiefen seiner Implementierung angeblich ein String zu lang ist. Wer die Meldung googelt, findet heraus, dass die abgespeckte »ssh« -Version ein spezielles Format für Private Keys benötigt. Dies erzeugt ein Tool namens »dropbearkey« auf der DD-WRT-Distribution auf dem Router, in die ich mich mit »ssh« unter »root« einloggen kann, nachdem ich auf dem GUI unter »Services« den SSH-Daemon aktiviert habe. Den private Key erzeugt der Aufruf

dropbearkey -t rsa -f   keyfile

dann in der Datei »keyfile« .

Den zugehörigen public Key zeigt »dropbearkey« auf der Standardausgabe. Wer diesen Textstring in die Datei ».ssh/authorized_keys« auf dem Server kopiert und im Router per Kommandozeile mit »ssh -i keyfile Servername« die Verbindung aufbaut, muss also kein Passwort mehr eingeben und kann den Prozess automatisieren.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Snapshot

    Ein Stromausfall lässt die Intelligenz eines Smart Home schlagartig absacken. Eine Notstromversorgung und ein Skript auf der Smartthings-Plattform verhindern Schlimmeres und informieren den Hausherrn. Der polyglotte Perlmeister macht in dieser Ausgabe einen Ausflug in die Skriptsprache Groovy.

  • Perl-Snapshot

    Ein Perl-Skript, das im Morgengrauen die aktuelle Wettervorhersage einholt, hilft bei der Entscheidung, auf Risiko zu spielen oder doch einen Schirm einzupacken.

  • Etcd 3 läuft performanter

    Etcd 3 soll einige Vorteile gegenüber dem Vorgänger bringen. So brauche die Kommunikation zwischen Clients aufgrund des Wechsels von Json auf gRPC weniger Ressourcen. Und trotz API-Änderungen seien Updates problemlos möglich.

  • Erwachet!

    Pünktlichkeit ist die Höflichkeit der Könige. Ein Perl-Daemon liest I-Calendar-Dateien mit Meeting-Terminen ein und alarmiert den User auf individuelle Weise kurz vor Beginn der Veranstaltung.

  • Datenrüssel

    Manchmal ist es zu umständlich, sich durch die Hierarchie einer Website zu wühlen, nur um eine bestimmte Information zu finden. Das Perl-Modul WWW::Mechanize::Shell hilft so genannte Screen Scraper zu schreiben, die wie Browser agieren und den Zugriff auf Webseiten automatisieren.

comments powered by Disqus

Ausgabe 01/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.