Connection Tracking (NMAP) mit der Zipabox

Hallo zusammen,

es hat zwar etwas gedauert, aber nun will ich euch die Connection Tracking (NMAP) Version einmal vorstellen. Der Hauptunterschied zu dem anderen Blogeintrag „Connection Tracking (FRITZ!Box) mit der Zipabox“ besteht darin, dass nun NMAP verwendet wird. Mit NMAP kann man sich anzeigen lassen, welche devices bei euch zu Hause online bzw. offline sind. Das heisst, dass dieses Modul unabhängig von eurem Router funktioniert. Da es kleine feine unterschiede zur FRITZ!Box Version gibt, gibt es dazu nochmal einen seperaten Blogeintrag.

Die Grundidee ist, dass wir in einer Konfig Datei die MAC Adressen mit einem entsprechenden Namen konfigurieren, also die Geräte die wir gerne tracken möchten.
Im nächsten Schritt wird ein Python Skript durch einen Cronjob alle X Minuten ausgeführt. In diesem Script definieren wir unseren Netzwerkbereich zu Hause z.B. „192.168.178.1/24“, dass gescannt werden soll. Dieses Python Skript scannt oder genauer gesagt pingt jede IP Adresse in einem Schnellverfahren an und erhält entsprechend einige Antworten. Zusätzlich zu den Antworten erhalten wir auch die entsprechende MAC Adresse und dadurch wissen wir nun, ob das Geräte zur Zeit online/aktiv oder offline/inaktiv ist.
Im letzten Schritt werden die entsprechenden „virtual devices“ Sensoren automatisch auf der Zipabox angelegt und der Status des Sensors wird aktualisiert.

Voraussetzung

Um das Connection Tracking Skript verwenden zu können, wird ein Server, in meinem Fall ein Raspberry Pi 2 benötigt und Grundlagen in Linux sind von Vorteil.
Nun müssen wir die folgende Datei herunterladen connection_tracking_nmap_01. Das ZIP File könnt Ihr euch dann auf eurem Server in einem beliebigen Verzeichnis entpacken. Nach dem Entpacken findet Ihr die folgenden Dateien:

  • connection_tracking_nmap.py – Python Skript, dass den Netzwerkbereich scannt, Sensoren auf der Zipabox anlegt und den Status aktualisiert
  • connection_tracking.yaml – Konfiguration Datei, wo wir die Geräte definieren die getrackt werden sollen
  • Zipatoapi.py – Python Zipabox API Library

Wenn sich jemand für den Source Code interessiert, den findet ihr hier Source Code .

Installation & Konfiguration

Installiert die folgenden Python Module

sudo apt-get install python-yaml python-pycurl

Es wird zusätzlich das Python Module python-nmap benötigt. Den Source Code und wie man das Modul installiert, findet Ihr hier.

Nachdem die Python Module installiert sind, wird die Konfigurationsdatei „connection_tracking.yaml“ editiert. Hier defininieren wir, welche Devices wir tracken möchten. Hier ein Beispiel wie die Syntax auszusehen hat. Bitte beachtet, dass die Buchstaben in euren MAC Adressen großgeschrieben werden müssen.

- mac: 80:AF:23:D2:3F:12
  name: Dad
- mac: 8F:AA:33:D2:3D:1D
  name: Mum

Im vorletzten Schritt müssen wir nur noch in dem Skript „connection_tracking_nmap.py“ in der Zeile 31 den IP Bereich eintragen der gescannt werden soll. In meinen Fall „192.168.178.1/24“ und in der Zeile 26 und 27 müssen die Login Daten für die Zipabox hinterlegt werden. Dieses Skript verwendet nun die Zipabox API und schaut nach, ob es schon einen virtual Endpoint Sensor mit dem Namen „Dad“ und „Mum“ gibt und wenn nicht, werden die erstellt und der Status wird aktualisiert. Wenn die virtual Endpoints angelegt worden sind, müsst Ihr zur Zeit die Zipabox einmal manuell synchronisieren.

Im letzten Schritt kann man nun einen Cronjob erstellen, dass z.B. der NMAP jede Minute euer Netzwerk scannt und den aktuellen Status, dann an die Zipabox sendet. Der Cronjob könnte dann folgendermassen aussehen auf eurem Server.

0-59 * * * * python /pfad/zum/skript/connection_tracking_nmap.py >/dev/null 2>&1

WICHTIG, dass Skript MUSS unter dem Root User laufen, da nur dann NMAP auch die MAC Adressen ausgibt, die wir benötigen.

Im groben und ganzen war es das dann auch. Das Ergebnis würde dann in der Zipabox wie folgt aussehen:

connection_tracking_example_picture

Auffälligkeiten

Mir ist in meinen Tests aufgefallen (Cronjob wo minütlich das Skript lief), dass NMAP oder mein Handy ganz selten als offline angezeigt wurde für ein Intervall (1 Minute), obwohl mein Handy im WLAN war. Ich habe bis jetzt noch nicht herausgefunden, woran es genau lag, ob NMAP oder mein Handy das Problem ist. Bei meiner Frau (Handy) habe ich das Phänomen nicht beobachten können. Da ich eine FRITZ!Box habe, bevorzuge ich die FRITZ!Box Variante, daher bin ich auf eurer Feedback gespannt,  und ob Ihr so etwas ähnliches beobachten könnt.

Ansonsten wünsche ich euch viel Spaß bei der Umsetzung und falls Ihr Fragen / Hilfe braucht, dann hinterlasst einen Kommentar.

Viele Grüße,

Gregor

21 thoughts on “Connection Tracking (NMAP) mit der Zipabox”

  1. Max sagt:

    Hallo,
    ich nutze schon seit längerer Zeit eine ähnliche Methode wie Deine Fritzbox Variante, dabei habe ich die selben Probleme mit den Iphones, Android scheint zu funktionieren. Das liegt wohl daran dass iPhones das wlan schlafen legen. Linderung hat bei mir eine ähnliche Vorgehensweise wie hier beschrieben gebracht:
    https://community.openhab.org/t/use-networkhealth-binding-for-iphone-detection/3825/14
    Also zunächst mal ein ping auf port 5353 der Apple Geräte. Da diese pings aber von meinem Switch „geschluckt“ werden ist das auch noch nicht 100% zuverlässig, je nachdem in welchem Wifi Segment sich das Apple Device gerade befindet (ich habe mehrere Wifi mit mehreren Repeatern um alle Stockwerke und den Garten abzudecken). Insgesamt also nach wie vor nicht wirklich befriedigend, die Android Geräte der Kinder sind hier leider wesentlich zuverlässiger.

  2. gregor sagt:

    Hallo Max,

    danke für das Feedback. Der Helle hat mich zwar schon vor sowas gewarnt bei dne iPhones, aber den Artikel und vorallem eine „Lösung“ kannte ich noch nicht.

    Daher habe ich es extra in dem Blog Eintrag erwähnt, wenn jemand eine FRITZ!Box hat, sollte definitiv diese Variante bevorzugen. Da habe ich bis jetzt absolut keine Probleme feststellen können. Der Helle hat auch ein iphone und verwendet die FRITZ!Box Variante und da scheint es sauber zu laufen.

    Ich werde demnächst bei meinem Dad diese „nmap“ Variante implementieren und dann werde ich mal sehen, wie es über einen längeren Zeitraum aussieht.
    Daher freue ich mich auch über jedes Feedback, Danke!

    VG,
    Gregor

  3. Claus sagt:

    Hallo Gregor,
    habe Dein geniales Script mittlerweile auch im Einsatz und es funktioniert eigentlich prächtig. Allerdings möchte ich gerne 4 Android Phones tracken und es klappt nur bei dreien. Bei genauerem Hinsehen fiel mir auf, das das fritzhosts.py script leider keine vollständige Liste aus der Fritzbox liest. Was dabei in der known_hosts.yaml landet ist leider nur eine gekürzte Version von dem was ich im Web-UI der Fritzbox an angemeldeten Geräten sehe. Woran kann das liegen ?

    Gruß
    Claus

  4. gregor sagt:

    Hallo Claus,

    vielen Dank für das Feedback, dass freut mich.
    Je nach FritzBox scheint es auf einigen Geräten eine Limitierung zu geben. Stefan lief genau gegen das selbe Problem vermutlich wie Du. Versuch auf deiner FritzBox einige „inaktive“ Geräte zu löschen, dass Du nicht mehr als 16 in der Liste hast. Dann solltest Du auch beim nächsten Lauf den Scripts, dass vierte Handy in der known_hosts Datei sehen.

    Viele Grüße,
    Gregor

  5. Paul sagt:

    Hallo Gregor,
    ich finde nicht die Datei zum downlaod, connection_tracking_nmap_01?
    Wo kann ich die finden?
    Oder könntest du es im Blog verlinken!

    Gruß
    Paul

  6. gregor sagt:

    Hallo Paul,

    stimmt der Download Link war nicht verlinkt. So wenn Du nun auf „connection_tracking_nmap_01“ klickst, dann solltest Du einen Datei Download erhalten.
    Viel Spaß bei der Umsetzung und ich freue mich über jedes Feedback:).

    VG,
    Gregor

  7. Paul sagt:

    Hallo Gregor,

    ich habe so gut wie keine Erfahrung mit Linux,deshalb bin ich auf deine Hilfe angewiesen.
    Muss der RPI direkt am Router angeschlossen sein oder reicht das wenn ich über W-lan drauf zu greife?
    Wenn ich das eingebe : sudo apt-get install python-yaml python-pycurl python-json

    Package python-json is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    E: Package ‚python-json‘ has no installation candidate
    bekomme ich das! Ist das soweit richtig?

    Und dann zu den MAC Adressen: Ist das richtig wenn ich auf den Router zu greife die Adressen dort einsehen kann?

    Und bei Zeile 31, welche IP Adresse muss ich eingeben?
    Bei Zeile 26 und 27, müssen die “ “ Zeichen bleiben ?

    Und dan das mit dem Cronjob, das verstehe ich noch nicht!

    Danke dir schon mal für deine Hilfe.

    Gruß
    Paul

  8. gregor sagt:

    Hallo Paul,

    alles klar, dann schauen wir mal das wir es zum laufen bekommen.

    – LAN / WLAN
    Das ist egal, ob der Raspberry Pi via LAN oder WLAN verbunden ist.

    – python-json
    Das sollte passen, wenn das Paket nicht installiert werden kann. Ich glaube json ist mittlerweile in Python direkt integriert.

    – Mac Adressen
    Ich bin mir gerade nicht ganz sicher, ob ich diese Frage richtig verstehe. Meinst Du das Du die MAC Adressen von deinen Komponenten aus dem Router manuell auslesen willst, um die dann in die „connection_tracking.yaml“ einzutragen? Bitte hier beachten, dass Du Großschreibung verwenden musst für die MAC Adressen.
    Es ist auch normal, dass die ganzen MAC Adressen von deinen Komponenten auf dem Router zu finden sind. Die Router pflegen eine Geräteliste die Du auch normalerweise auch ansehen kannst.

    – Zeile 31
    Das ist die IP Range die Du in deinem Netzwerk verwendest. Also z.B. 192.168.178.1 – 192.168.178.254, oder kürzer ausgeschrieben 192.168.178.1/24. Das heisst das deine Komponenten aus diesem Bereich eine IP Adresse von deinem Router zugeteilt bekommen. Wenn Du immer noch nicht sicher sein solltest, dann trag dort einfach die IP Adresse von deinem Router ein mit dem „/24″ dahinter.

    – Zeile 26,27
    Ja trage bitte deine EMail Adresse und dein Passwort innerhalb von “ “ ein, also z.B. login = „greg@zip.eu“. Das selbe gilt auch für dein Passwort password = „MyPasswort123“.

    Hast Du das Python-nmap Paket installiert? Du kannst python nmap folgendermassen einmal manuell testen, um sicherzugehen, ob das auch wirklich funktioniert.

    pi@raspberrypi:~ $ python
    Python 2.7.9 (default, Mar 8 2015, 00:52:26)
    [GCC 4.9.2] on linux2
    Type „help“, „copyright“, „credits“ or „license“ for more information.
    >>> import nmap
    >>> nm = nmap.PortScanner()
    >>> nm.scan(‚127.0.0.1′, ’22-443‘)

    Ich hoffe ich konnte Dir etwas weiterhelfen. Du kannst auch gerne im Forum einen Beitrag eröffnen und machen da weiter.

    Viele Grüße,
    Gregor

  9. Paul sagt:

    Hallo Gregor,

    habe mir im Forum einen Beitrag eröffnet.
    http://zipabox.de/forums/topic/connection-tracking-nmap/

  10. Gerald sagt:

    Hallo Gregor

    Habe heute deine Anleitung ausprobiert nur leider funktioniert es bei mir nicht es wird zwar nachdem der Rasbi den Cronjob ausführt eine Zipatoapi.pyc angelegt nur leider sehe ich die Endpunkte im Zipatokonto nicht auch nach mehrmaligen synchronisieren ich hoffe du kannst mir helfen

    danke für deine Arbeit

  11. Machiel sagt:

    Ich habe einige problemen mit das script:
    –($:zipabox)– python connection_tracking_nmap.py
    Traceback (most recent call last):
    File „connection_tracking_nmap.py“, line 93, in
    config_data = a.get_virtual_endpoint(virtual_endpoint[‚uuid‘])
    File „/home/secret/zipabox/Zipatoapi.py“, line 185, in get_virtual_endpoint
    c.setopt(c.URL, api_url)
    TypeError: invalid arguments to setopt

    Das virtuele device besteht aber kan niet updated werden glaube ich.

    Wie kan ich das debuggen? Was kan ich probieren?

  12. gregor sagt:

    Hallo Machiel,

    das sieht aus, ob in Zeile 93 ein Fehler ist.

    config_data = a.get_virtual_endpoint(virtual_endpoint[‚uuid‘])

    Die Zeile muss folgendermassen aussehen:

    config_data = a.get_virtual_endpoint(virtual_endpoint[‚uuid‘])

    Ansonsten, wenn Du Interesse hast, dann können wir auch gerne eine kurze Teamviewer Session machen. Dann denke ich, sollte das Problem recht schnell behoben sein.
    ===
    It looks like that the line 93 has a typo in your „connection_tracking_nmap.py“ script. Can you verify, if line 93 looks as follow, please:

    config_data = a.get_virtual_endpoint(virtual_endpoint[‚uuid‘])

    If you like, we can also do a Teamviewer Session in the next days, then the problem should be solved quickly.

    Cheers,
    Gregor

    1. idefix sagt:

      Hallo Gregor,

      ich hänge mit deinem Skript an exakt der gleichen Stelle wie am 22.06.2016 Machiel.
      Ich kann leider keinen Fehler entdecken. Kannst Du mir hier weiterhelfen?

      Gruß Stefan

  13. Stefan sagt:

    Moin.

    Habe den Beitrag mit Spannung gelesen und das ganze mangels Programmierfähigkeiten nachgebaut. Ziel war es, ein Danalock, das unter Android einfach nicht dazu zu bewegen ist, automatisch die Tür zu öffnen, dazu zu bringen, mittels des Anwesenheits-Trackings einerseits automatisch zu öffnen und andererseits bei Abwesenheit automatisch zu verschließen.

    Leider funktioniert das bei mir so wie oben angegeben nicht. Alles läuft soweit – bis auf den Cronjob, der sich auch mittels gnome-Oberfläche (Scheduler) nicht aktivieren lässt. Außerdem klappt das Anwesenheits-Tracking auch nur sehr unzuverlässig, wenn man es manuell anstößt. Mal ist das eine von 2 Smartphones inaktiv, mal das andere – damit kann ich mein Ziel nicht erreichen. Zudem kann der Cronjob offenbar auch nur minütlich ausgeführt werden – schlimmstenfalls stünde ich dann 1 Minute sinnlos vor der Tür rum.

    Warum nicht „einfach“ den Smartphones eine feste IP vergeben und die regelmäßig anpingen? Dann wäre das Problem mit der minimalen Abrufzeit gelöst und auch die Zuverlässigkeit (beim manuellen Test beim pingen 100%) gegeben.

    Spricht da was gegen? Wie gesagt: Ich kann nicht programmieren…

    mfg

    Stefan

    1. gregor sagt:

      Hallo Stefan,

      danke für das Feedback. Zum Teil ist es für mich neu, dass das Skript Probleme verursacht, vorallem mit Android Smartphones. Da habe ich eigentlich zu 99% immer ein positives Feedback erhalten. Ich kann mir das gerne einmal via einer Teamviewer Session anschauen. Wenn Du Interesse haben solltest, dann sag bescheid und ich würde Dir eine Mail schicken.

      Ich bin auch nur ein „Hobby Programmierer“, daher lass mich mal 2-3 Tage dadrüber schlafen, wie ich das Skript umschreiben kann, damit eine IP Adresse ständig gepingt wird. Ich wüsste nicht auf die schnelle, was dagegen sprechen würde. Ich schaue mal, ob ich es anpassen kann und ob es „zuverlässig“ laufen würde.
      Ich melde mich nochmal bei Dir.

      Viele Grüße,
      Gregor

      1. Stefan sagt:

        Super, vielen Dank schon mal!
        mfg

  14. schomby sagt:

    Ach so, vergessen: Klar habe ich Interesse an einer Team-Viewer-/Skype/whatever-Session – ich persönlich finde das Thema Smart Home mit der Zipabox sehr spannend, allerdings stoße ich (wie gesagt) mangels Programmierfähigkeiten/Verständnis immer wieder schnell an Grenzen. Hilfe freut mich da sehr. Ich habe es auch hier im Forum probiert, aber da gibt es leider wenig bis keine Resonanz, vermutlich mangels User…? Das ist sehr schade, denn eine deutsche Anlaufstelle, wo man Tipps und direkte Hilfe bekommt, fehlt mir an der ganzen Sache am meisten. Die Regel-Sammlung hier ist ja leider auch eher… fragmentarisch… 😉 Umso mehr freut mich dein Angebot! mfg

  15. Armin Barnick sagt:

    Hallo erstmal große Lob an die Macher. Bin total begeistert über diese Anwendung und dank Helle läuft sie auch. Jetzt hab ich aber trotzdem eine Frage der Crown Job läuft wenn die Wlan in Reichweite kommen dauert es 1 Minute bis sie erkannt werden aber schalte ich die Wlan aus dann dauert es immer 10 Minuten bis es angezeigt.

    1. gregor sagt:

      Hallo Armin,

      danke für das Feedback. Ich versuche die Tage das bei mir nachzustellen und zu schauen, ob ich mit der NMAP Version, dass selbe Problem habe.

      VG,
      Gregor

      1. Armin Barnick sagt:

        Super Danke

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.