Verbindungsdaten loggen mit Fritzbox und ntopng

Allgemein Linux

Wer saugt da schon wieder das halbe Internet leer und legt den gesamten Internetzugang der Familie lahm. Welche Seiten werden besonders häufig angesurft und welche Geräte zu Hause kommunizieren eigentlich mit welchen Servern und Diensten (Stichwort IoT). Was verbraucht mehr Traffic – Netflix oder Youtube? Du wirst es herausfinden mit deiner Fritzbox und ntopng.

Wer hat sie nicht in Deutschland zu Hause stehen? Gefühlt teilt sich der Router-Markt in Speedport (Telekom) oder Fritzbox (Vodafone, 1&1, etc.). Aber gerade die Fritzbox kann viel mehr, als sie auf den ersten Blick zeigt. Den einen oder anderen überrascht vielleicht schon der Wechsel von der Standard- zur erweiterten Ansicht.

Noch viel interessanter wird ein Klick unten links auf Inhalt, gefolgt von Fritz!Box Support (ggf. nach unten scrollen). Erstaunblich, was man da so alles unter der Haube findet (Direktlink fritz.box/support.lua).

Ich möchte mich in diesem Blogbeitrag auf den Abschnitt Paketmitschnitt konzentrieren.

Ein Klick auf den Link Paketmitschnitte ermöglicht nahezu an jeder physikalischen als auch logischen Schnittstelle des Routers die Bits und Bytes, die so durch die Leitung flitzen, abzugreifen und anderen Anwendungen zuzuführen. Grundsätzlich werden die Datenpakete als pcap im Wireshark-Format mitgeschnitten. Bei einem Klick auf START der jeweiligen Schnittstelle erscheint im Browser ein „Speichern unter…“-Dialogfenster, wo nur noch das Ziel festgelegt werden muss. Kurz darauf werden sämtliche Datenpakete der ausgewählten Schnittstelle zusätzlich auf die Festplatte gespeichert und können bereits zur Laufzeit, also auch nach dem Beenden der Aufzeichnung (STOPP) in voller Länge begutachtet werden. Wireshark ist dafür aus meiner Sicht am geeignetsten.

Wiresharkmitschnitt der Fritzbox

Nett, oder?

Aber es geht noch viel besser. Mit ntopng gibt es eine Applikation, bei der sich diese Datenpaket nicht nur einfach speichern, sondern analysieren und grafisch auswerten lassen. Und im Vergleich zum Speichern als reines pcap-File, welches in kurzer Zeit durchaus die Grenzen deiner Festplatte „sprengen“ kann, wertet ntopng diese Daten für dich aus, speichert die Verbindungdaten und verwirft letzten Endes die Payload – also das was die Megabytes, Gigabytes und Terrabytes deines Internetzugangs so ausmachen. Das Resultat ist eine sehr kompakte Datenbank mit Verbindungsdaten.

Bleibt eigentlich die Frage, wie du diesen PCAP-Datenstrom so umleitest, das er gar nicht erst als Datei gespeichert wird, sondern direkt nach ntopng umgeleitet werden kann. Aber auch da gibt es für dich eine einfache Lösung. Die Entwickler von ntopng haben speziell für die Fritzbox ein Script entwickelt, welches nach wenigen Anpassungen den Datenstrom zur Standard-Ausgabe umleitet und von da aus direkt wieder an ntopng übergibt. Und schon beginnt das große Datensammeln.

Doch machen wir einen Schritt nach dem anderen. Installiere zuerst ntopng und mache dich ein wenig mit der Oberfläche vertraut. Die Repoistories liegen unter https://packages.ntop.org/apt-stable/, ich erläutere dir die Installation unter Debian 10 mit Root-Rechten.

Zuerst öffnest du die Datei sources.list im Editor und fügst an Ende einer jeden Zeile, die mit deb oder deb-src beginnt ein contrib hinten an, sofern nicht bereits vorhanden.

# nano /etc/apt/sources.list
...

Anschließend lädst du das ntopng-deb-Paket herunter, welches dir die Paketquellen und Keys in deine Repositories einfügt und installierst dieses.

# wget https://packages.ntop.org/apt-stable/stretch/all/apt-ntop-stable.deb
# apt install ./apt-ntop-stable.deb 

Dann kann es auch schon mit der Installation von ntopng selbst losgehen:

# apt clean all 
# apt update 
# apt install ntopng ntopdata 

Uuuuund fertig. Der Dienst ntopng wird automatisch gestartet und das Ergebnis kannst du dir im Browser ansehen, in dem du entweder auf dem Rechner, auf dem ntopng gerade läuft http://localhost:3000 oder von einem anderen Rechner im Netzwerk mit http://ip-adresse:3000 die Website aufrufst.

Nach der erstmaligen Anmeldung mit admin/admin wirst du aufgefordert, das Passwort zu ändern. Anschließend siehst du das Dashboard, in dem ntopng eine erste Zusammenfassung der derzeit erkannten Schnittstellen und deren Datenpakete zeigt. Bei jedem Start läuft ntopng zehn Minuten lang in der Enterprise-Edition mit allen Funktionen, anschließend wechselt es in den abgespeckten Community-Modus, welcher aber für die üblichen Zwecke ausreichen sollte. Ansonsten wird es nicht gerade günstig, aber du kannst die Entwickler durchaus anschreiben und nach einen Angebot für Privatnutzer fragen, aber in jedem Fall erwarten dich jährliche Gebühren. Deshalb bin ich bei der Community Edition geblieben.

Oben links kannst du deine vorhanden physikalischen Netzwerkschnittstellen auswählen, über welche dein System verfügt, auf dem ntopng installiert wurde. Du kannst Alarme einrichten, aktuelle Verbindungsdaten einsehen und und und.

Unser Ziel ist jedoch, die Schnittstellen der Fritzbox „abzuschnorcheln“. Zum einen musst du dir darüber klar werden, welche Schnittstelle es sein soll. Ich habe mich für die Routing-Schnittstelle entschieden, da über diese sämtlicher Datenverkehr, welcher rein und raus geht (inklusive Gäste-WLAN), durch muss. Vor allem hat diese ein Beinchen in allen Netzen und kann deshalb auch jeden Client unabhängig von NAT, VPN und anderen Diensten identifizieren. Des weiteren musst du dir darüber bewusst sein, das die Schnittstelle, über die ntopng mit der Fritzbox verbunden ist, mindestens über dieselbe freie Bandbreite wie die „abzuschnorchelnde“ Schnittstelle verfügt.

Negatives Beispiel: Du möchtest deinen kompletten Datenverkehr der Routing-Schnittstelle (das ist sämtlicher Traffic ins und aus dem Internet) z.B. an einem 500MBit/s-Kabelanschluss abgreifen und dann über über WLAN (oder einen 100 Mbit/s-LAN-Anschluss) an deinen ntopng-Server weiterleiten? Dann solltest du dir im klaren darüber sein, das ggf. über einen längeren Zeitraum ganze 500 MBits/s (bei Vollauslastung) parallel durch dein WLAN (oder FastEthernet-Anschluss) durch wollen. Datenstau ist somit vorprogrammiert, du legst zeitweise dein eigenes Heimnetz lahm. Wenn wie in der folgenden Grafik 5 Endgeräte gleichzeitig viel Netzwerklast (Videostreaming z.B.) erzeugen, dann schafft das zwar vielleicht in der Summe noch dein Breitband-Kabelanschluss, aber alle Datenpakete parallel über einen 100 MBit/s-Anschluss an den ntopng-Server auszuliefern, damit ntopng die Datenpakete analysieren kann, wird durch diesen Flaschenhals definitiv nichts. Das Problem wird sogar noch viel gravierender. Die Fritzbox legt die Datenpakete zunächst in eine Queue (Warteschlange) ab, um den Flaschenhals zu kompensieren. Das wird aber nur sehr kurze Zeit „gut“ gehen, da sich das Problem mit dem Flaschenhals ja nicht auflöst und die Datenpakete nicht weniger werden. Dann fängt die Fritzbox recht schnell an, Datenpakete an dem Anschluss zu ntopng zu verwerfen, was zum einen die Analyse extrem fehlerhaft macht. Zum zweiten bekommt die Fritzbox richtig was zu tun und welche Auswirkungen das ggf. auf die CPU der Fritzbox und dessen Gesamtperformance hat…darüber möchte ich gar nicht spekulieren.

                              Internet
                                 ^
                                 ^
                                +--+
                                |  |
                                |  |   500
                                |  |  MBit/s
                                |  |
+-------------------------------+--+-----------+
|                                              |    100    +--------+
|                                              |   MBit/s  |        |
|                 Router                       +-----------+ ntopng |
|                                              |           |        |
|                                              |           |        |
+-------+----------+----------+-------+-------++           +--------+
   100  |     100  |     100  |  100  |       | 100
  MBit/s|    MBit/s|    MBit/s| MBit/s|       |MBit/s
+-------++ +-------++ +-------++ +----+---+ +-+------+
|        | |        | |        | |        | |        |
|   PC   | |   PC   | |   PC   | |   PC   | |   PC   |
|        | |        | |        | |        | |        |
|        | |        | |        | |        | |        |
+--------+ +--------+ +--------+ +--------+ +--------+

Positives Beispiel: Du möchtest immer noch dieselbe Routing-Schnittstelle abgreifen (Internet-Anschluss mit 500MBit/s) und verbindest deinen ntopng-Server per 1GBit/s-LAN mit deiner Fritzbox. Dann hast du auf dem Interface immer noch 500MBit/s Reserve für andere Anwendungen. Denn das Management für den ntopng-Server (also Traffic, der auch ohne Paketmitschnitt an dieser Schnttstelle entstehen würde, inklusive Updates und Online-Backups) darf auch nicht unterschätzt werden.

Wie oben bereits erwähnt stellen die ntopng-Entwickler ein passendes Script für die Fritzbox unter https://raw.githubusercontent.com/ntop/ntopng/dev/tools/fritzdump.sh zur Verfügung. Auch ist ein passendes Readme unter https://github.com/ntop/ntopng/blob/dev/doc/README.fritzbox vorhanden. Schauen wir uns das Script einmal näher an. Ich teile das im folgenden in mehrere Abaschnitte auf:

#!/bin/bash
# This is the address of the router
FRITZIP=http://fritz.box
# This is the WAN interface
IFACE="2-0"
# Lan Interface
#IFACE="1-lan"

Nach der Shebang wird die URL für die Fritzbox definiert, das ist im heimischen LAN http://fritz.box, du kannst aber auch http://192.168.178.1 schreiben, sofern du die Standard-Einstellungen nicht geändert hast.

Als nächstes muss du das Interface definieren, welches du abgreifen möchtest. Dafür benötigst du den Namen der Schnittstelle. Dazu öffnest du am besten, während du die Paketmitschnitt-Seite deiner Fritzbox geöffnet hast, den Entwickler-Modus in deinem Browser (für Google Chrome CTRL-SHIFT-i oder STRG-UMSCH-i), aktivierst (ist dann blau) das Symbol oben links an der Entwicklerschnittstelle (der auf ein Dokument zeigende Pfeil) und gehst mit der Maus dann über den START-Button der gewollten Schnittstelle. Auf der rechten Seite siehst du dann unter „value=…“ den gesuchten Namen der Schnittstelle, in meinem Fall „value=3-0“. Und genau diese 3-0 musst du in diesem fall bei IFACE eintragen. Aufgepasst! Du kannst mit diesem Script immer nur eine Schnittstelle auswählen. Selbst wenn du das Kommentarzeichen beim zweiten IFACE-Eintrag entfernst, überschreibst du mit dem zweiten Eintrag den ersten.

Google Chrome Extwicklermodus

ntopng benötigt für den Zugriff auf die Fritzbox eine Session-ID. Dazu musst du beim Scriptaufruf (dazu kommen wir später noch einmal) Benutzername und Passwort übergeben und damit macht das Script dann einen http-Request. Im Ergebnis kommt dann mit ein wenig Voodoo (Authentifizierung durch Hash Challenge) eine Session-ID heraus, welche als Variable SID im Script später weiter genutzt wird.

# If you use password-only authentication use 'dslf-config' as username.
FRITZUSER=$1
FRITZPWD=$2
SIDFILE="/tmp/fritz.sid"
if [ -z "$FRITZPWD" ] || [ -z "$FRITZUSER" ]  ; then echo "Username/Password empty. Usage: $0 <username> <password>" ; exit 1; fi
echo "Trying to login into $FRITZIP as user $FRITZUSER"
if [ ! -f $SIDFILE ]; then
  touch $SIDFILE
fi
SID=$(cat $SIDFILE)
# Request challenge token from Fritz!Box
CHALLENGE=$(curl -k -s $FRITZIP/login_sid.lua |  grep -o "<Challenge>[a-z0-9]\{8\}" | cut -d'>' -f 2)
# Very proprieatry way of AVM: Create a authentication token by hashing challenge token with password
HASH=$(perl -MPOSIX -e '
    use Digest::MD5 "md5_hex";
    my $ch_Pw = "$ARGV[0]-$ARGV[1]";
    $ch_Pw =~ s/(.)/$1 . chr(0)/eg;
    my $md5 = lc(md5_hex($ch_Pw));
    print $md5;
  ' -- "$CHALLENGE" "$FRITZPWD")
  curl -k -s "$FRITZIP/login_sid.lua" -d "response=$CHALLENGE-$HASH" -d 'username='${FRITZUSER} | grep -o "<SID>[a-z0-9]\{16\}" | cut -d'>' -f 2 > $SIDFILE
SID=$(cat $SIDFILE)

Als nächstes wird die ermittelte SID verifiziert und letztendlich mit wget der Mitschnitt der Schnittstelle gestartet. Am Ende der Zeile wird mittels Pipe (|) die Ausgabe an ntopng an das Interface (-i -) STDOUT übergeben.

# Check for successfull authentification
if [[ $SID =~ ^0+$ ]] ; then echo "Login failed. Did you create & use explicit Fritz!Box users?" ; exit 1 ; fi

echo "Capturing traffic on Fritz!Box interface $IFACE ..." 1>&2

# In case you want to use tshark instead of ntopng
#wget --no-check-certificate -qO- $FRITZIP/cgi-bin/capture_notimeout?ifaceorminor=$IFACE\&snaplen=\&capture=Start\&sid=$SID | /usr/bin/tshark -r -

wget --no-check-certificate -qO- $FRITZIP/cgi-bin/capture_notimeout?ifaceorminor=$IFACE\&snaplen=\&capture=Start\&sid=$SID | ntopng -i -

Ich habe in die letzte Zeile meiner fritzdump.sh weitere Modifikationen eingefügt, um der Anwendung gleich meine lokalen Netzwerke (Standard-LAN und Gäste-WLAN) zu übergeben, sowie eine Datenbank (nindex) für die Speicherung der Netzwerkflüsse festzulegen. So kann ich auch über eine sehr lange Zeit hinweg Verbindungsdaten auswerten. Beachte hierbei bitte den Datenschutz.

wget --no-check-certificate -qO- $FRITZIP/cgi-bin/capture_notimeout?ifaceorminor=$IFACE\&snaplen=\&capture=Start\&sid=$SID | ntopng -m "192.168.178.0/24,192.168.179.0/24" -F nindex -i -

Genug zur Theorie, ändere mit dem Editor deiner Wahl das Interface in der Datei fritzdump.sh ab. Anschließend gebe dem Script Ausführungsrechte.

# nano fritzdump.sh
...
IFACE="3-0"
...
# chmod +x fritzbox.sh

Im vorletzten Schritt legst du dir auf der Fritzbox einen neuen Benuter an und gibst ihm das Recht, auf die Einstellungen zuzugreifen. Dieser Schritt ist notwendig, da AVM seit OS-Version 7.25 einiges an dem Benutzermanagement geändert hat und so dass selbst der Standard-Nutzer jetzt über einen Benutzernamen verfügt. dslf-config, wie im Script aufgeführt, hat bei mir zumindst nicht mehr funktioniert.

Benutzer anlegen

Im letzten Schritt beendest du erst einmal die laufende Instanz von ntopng, unterbindest zukünftig den automatischen Start und startest das modifizierte Script, indem du gleich noch Benutzername und Passwort mitgibst (das waren im Script die Variablen $1 und $2): fritzdump.sh <USER> <PASSWORD> &
Mit dem & am Ende der Zeile erzwingst du die Ausführung im Hintergrund, so dass das Script auch weiter läuft, wenn du das Terminal schließt.

# killall ntopng
# systemctl disable ntopng
# fritzdump.sh ntopng MySuperSecureP@ssw0rd &
Trying to login into http://fritz.box as user ntopng
Capturing traffic on Fritz!Box interface 3-0 ...
28/Jun/2021 10:45:11 [Ntop.cpp:2347] Setting local networks to 192.168.178.0/24,192.168.179.0/24
28/Jun/2021 10:45:11 [Redis.cpp:157] Successfully connected to redis 127.0.0.1:6379@0
28/Jun/2021 10:45:11 [Redis.cpp:157] Successfully connected to redis 127.0.0.1:6379@0
28/Jun/2021 10:45:11 [NtopPro.cpp:320] [LICENSE] Reading license from Redis
28/Jun/2021 10:45:11 [NtopPro.cpp:464] [LICENSE] Unable to validate license [Empty license file]
28/Jun/2021 10:45:11 [NtopPro.cpp:533] WARNING: [LICENSE] Invalid license [Empty license file]
28/Jun/2021 10:45:11 [NtopPro.cpp:550] WARNING: [LICENSE] ntopng will now run in Enterprise L edition for 10 minutes
28/Jun/2021 10:45:11 [NtopPro.cpp:552] WARNING: [LICENSE] before returning to community mode
28/Jun/2021 10:45:11 [NtopPro.cpp:554] WARNING: [LICENSE] You can buy a permanent license at http://shop.ntop.org
28/Jun/2021 10:45:11 [NtopPro.cpp:556] WARNING: [LICENSE] or run ntopng in community mode starting
28/Jun/2021 10:45:11 [NtopPro.cpp:557] WARNING: [LICENSE] ntopng --community
28/Jun/2021 10:45:11 [Ntop.cpp:2452] Registered interface stdin [id: 3]
28/Jun/2021 10:45:11 [main.cpp:312] PID stored in file /var/run/ntopng.pid
28/Jun/2021 10:45:11 [Geolocation.cpp:140] Loaded database GeoLite2-ASN.mmdb [/usr/share/GeoIP/GeoLite2-ASN.mmdb][ip_version: 6]
28/Jun/2021 10:45:11 [Geolocation.cpp:140] Loaded database GeoLite2-City.mmdb [/usr/share/GeoIP/GeoLite2-City.mmdb][ip_version: 6]
28/Jun/2021 10:45:11 [Geolocation.cpp:60] Using geolocation provided by MaxMind (https://maxmind.com)
28/Jun/2021 10:45:12 [HTTPserver.cpp:1554] Web server dirs [/usr/share/ntopng/httpdocs][/usr/share/ntopng/scripts]
28/Jun/2021 10:45:12 [HTTPserver.cpp:1557] HTTP server listening on 3000
28/Jun/2021 10:45:12 [Utils.cpp:764] User changed to ntopng
28/Jun/2021 10:45:12 [NetworkInterface.cpp:2641] Started flow dump loop on interface stdin [id: 3]...
28/Jun/2021 10:45:12 [NIndexFlowDB.cpp:106] Successfully open DB /var/lib/ntopng/3/flows
28/Jun/2021 10:45:12 [NIndexFlowDB.cpp:109] [nIndex] Successfully created flow database index [/var/lib/ntopng/3/flows]
28/Jun/2021 10:45:12 [NetworkInterface.cpp:2607] Started flow user script hooks loop on interface stdin [id: 3]...
28/Jun/2021 10:45:12 [main.cpp:382] Working directory: /var/lib/ntopng
28/Jun/2021 10:45:12 [main.cpp:384] Scripts/HTML pages directory: /usr/share/ntopng
28/Jun/2021 10:45:12 [Ntop.cpp:440] Welcome to ntopng x86_64 v.4.2.210624 - (C) 1998-20 ntop.org
28/Jun/2021 10:45:12 [Ntop.cpp:450] Built on Debian GNU/Linux 10 (buster)
28/Jun/2021 10:45:12 [NtopPro.cpp:741] [LICENSE] System Id:     ABBAKAFFEEAFFEEA
28/Jun/2021 10:45:12 [NtopPro.cpp:742] [LICENSE] Edition:       Enterprise L (Bundle)
28/Jun/2021 10:45:12 [NtopPro.cpp:743] [LICENSE] License Type:  Time-Limited [Empty license file] License
28/Jun/2021 10:45:12 [NtopPro.cpp:763] [LICENSE] Validity:      Until Mon Jun 28 10:55:11 2021
28/Jun/2021 10:45:12 [PeriodicActivities.cpp:107] Started periodic activities loop...
28/Jun/2021 10:45:13 [startup.lua:50] Processing startup.lua: please hold on...
28/Jun/2021 10:45:18 [startup.lua:144] [lists_utils.lua:758] Refreshing category lists...
28/Jun/2021 10:45:19 [startup.lua:144] [lists_utils.lua:696] Category Lists (695 hosts, 4601 IPs, 99 JA3) loaded in 1 sec
28/Jun/2021 10:45:19 [startup.lua:218] Startup completed: ntopng is now operational
28/Jun/2021 10:45:19 [PeriodicActivities.cpp:168] Each periodic activity script will use 2 threads
28/Jun/2021 10:45:19 [NetworkInterface.cpp:2749] Started packet polling on interface stdin [id: 3]...

Und so schaut das ganze dann im Browser aus:

Startseite ntopng CE

Aktualiserungen von ntopng

Um zukünftig ntopng auf Stand zu halten, genügt die übliche Linux-Vorgehensweise:

# killall ntopng
# apt update 
# apt upgrade 
# fritzdump.sh ntopng MySuperSecureP@ssw0rd &

Viel Spaß bei der Analyse. Und denk dir ein besseres Passwort aus 😉

Schreibe einen Kommentar

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