HeimProjekt: Fritzbox Internetbandbreite messen und visualisieren

Die aktuellen Zeiten sind schon seltsame Zeiten. Cloud-Anbieter und die Unternehmens-ID laufen in Kapaztätsengpässe, Home Office ist der quasi-Standard für jene, die zum Arbeiten nicht vor Ort sein müssen. Netflix und YouTube reduzieren die Qualität ihrer Streams um die heimischen Internetanschlüsse nicht zu überlasten.
So wurde auch mir klar, dass es eine gute Idee ist die Auslastung meiner Fritzbox bzw. die Auslastung der Internetbandbreite über überwachen (zu „monitoren“).

Das Ziel

Wie eingangs bereits beschrieben, ist das Ziel die Auslastung meines Internetanschlusses zu
1. Messen
2. die Messdaten zu speichern
3. die erfassten Daten zu visualisieren
4. das ganze muss möglichst einfach sein und auf einem bestehenden RaspberryPi laufen

Die Lösung

Was benötigt es für die Lösung
1. den oben beschriebenen Raspi (Model 3), ich habe mich für Ubuntu entschieden (https://ubuntu.com/download/raspberry-pi)
2. fritzconnection und collectd zum Messen
3. InfluxDB zum speichern der Messdaten
4. Grafana zum Visualisieren

Die Vorbereitung

Als erstes aktualisieren wir das ubuntu auf dem Raspi

sudo apt update
sudo apt upgrade -y

Als nächstes kommen ein paar Basis-Pakete

# Common
sudo apt install -y apt-transport-https software-properties-common

# Python 2.7 // collectd // pip
sudo apt install -y python collectd python-pip python-lxml

Ich nutze gerne apt Repositories zur Installation von Softwaren. Zum einen hat man dann typischer weise nicht das Problem, dann man x-verschiedene Abhängigkeiten installieren muss, zum anderen ist die Wartung, also das Updaten, deutlich einfacher.
Also brauchen wir noch die Repos für InfluxDB und Grafana

# InfluxDB
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

# Grafana
curl -sL https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"

# update sources
sudo apt update

InfluxDB

Das Repo für InfluxDB ist hinzugefügt, also kann es per apt installiert werden.

sudo apt update
sudo apt install -y influxdb

Grafana

Das Repo für Grafana ist ebenfalls hinzugefügt, also auch hier per apt installieren.

sudo apt update
sudo apt install -y grafana

FritzBox Benutzer

Zum Auslesen der Daten aus der Fritzbox wird ein Benutzeraccount benötigt, dass das darf. Dieser wird in der Fritzbox GUI unter System > Fritz!Box Benutzer angelegt. Der Account benötigt das Recht FRITZ!Box Einstellungen.
Diesem Beispiel heißt der Account fritzcollectd und hat als Kennwort <someverysecurepassword>.
Hier bitte eigene (sichere) Werte eintragen.

fritzcollectd

fritzcollectd wird per pip, also den “ package installer for Python„, installiert. Außerdem noch ein paar Abhängigkeiten von fritzcollectd selbst.

sudo pip install fritzconnection
sudo pip install requests
sudo pip install fritzcollectd

Die Konfiguration

Nun ist alles was benötigt wird installiert, also geht es weiter mit der Konfiguration.

InfluxDB

Als erstes wird der InfluxDB Dienst konfiguriert. Dazu wird die Datei /etc/influxdb/influxdb.conf mit dem bevorzugten Text-Editor bearbeitet. Angepasst wird der Abschnitt [collectd].

[[collectd]]
enabled = true
bind-address = "127.0.0.1:25826"
database = "collectd"
typesdb = "/usr/share/collectd/types.db"

Damit die Änderungen greifen muss der Dienst neugestartet werden. Zudem schalten wir den Dienst gleich auf „enabled“, damit dieser beim Systemstart auch mitgestartet wird. Dazu werden folgende Befehle verwendet:

sudo systemctl restart influxdb
sudo systemctl enable influxdb

collectd

Als nächstes ist der collectd Dienst dran. Die Konfigurationsdatei /etc/collectd/collectd.conf enthällt folgenden Eintrag. Somit werden .conf Dateien im Ordner /etc/collectd/collectd.conf.d berücksichtigt.

<Include "/etc/collectd/collectd.conf.d">
        Filter "*.conf"
</Include>

Somit erstellen wir eine neue Konfigurationsdatei.

sudo nano /etc/collectd/collectd.conf.d/fritzcollectd.conf

Darin werden folgende Werte eingetragen. Dabei den Benutzernamen und das Kennwort verwenden, das unter dem Abschnitt FritzBox Benutzer eingetragen wurden.

LoadPlugin python
LoadPlugin network
<Plugin network>
        Server "127.0.0.1" "25826"
</Plugin>
<Plugin python>
        Import "fritzcollectd"
        <Module fritzcollectd>
                Address "fritz.box"
                Port 49000
                User "fritzcollectd"
                Password "<someverysecurepassword>"
                Hostname "FritzBox"
                Instance "1"
                Verbose "False"
        </Module>
</Plugin>

Auch hier muss der Dienst neugestartet werden, und auch schon wie vorher „enable“n wir den Dienst im selben Schritt.

sudo systemctl restart collectd
sudo systemctl enable collectd

Treten hierbei fehler auf, können diese mit folgenden Befehl ausgelesen werden:

sudo journalctl -xe

Grafana

Grafana wird ebenfalls über apt installiert.

sudo apt install -y grafana

Grafana wird nicht per Konfigurationsdateien konfiguriert, sondern über die Web-GUI. Also nur noch den Dienst starten und aktivieren (enable).

# To start the service and verify that the service has started:
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server

# Configure the Grafana server to start at boot:
sudo systemctl enable grafana-server.service

Zur Konfiguration von Grafana wird nun die Web-GUI aufgerufen. Diese lauscht auf den Port 3000. Wer also den Hostnamen von dem Raspi nicht geändert hat, kann dazu diese URL verwenden http://ubuntu:3000. Standard-Login ist admin / admin.

Nach der obligatorischen Kennwortänderung kann direkt die Datenquelle angelegt werden. Dies geschieht nach folgenden Werten:

Typ: InfluxDB (wer hätte das gedacht?!?)
Name: InfluxDB_local_collectd (Der Name ist frei wählbar, aber ich weiß gerne was ich gerade nutze)
URL: http://localhost:8086
Database: collectd

Ist die Datenquelle angelegt braucht es noch die Visualisierung. Diese gibt es bereits bei Grafana.com und muss nur importiert werden.
Das im Menü den Import-Button wählen.

Das fertige Dashboard hat die ID 713. Einfach eintragen und es geht automatisch weiter.

Jetzt nur noch den Namen von dem Dashboard anpassen (nur bei Bedarf), den Ordner für das Dashboard auswählen sowie die vorher angelegte InfluxDB-Datenquelle (InfluxDB_local_collectd).

Und fertig ist das Dashboard und wird auch mit Daten versorgt.

Wer mag (so wie ich das mag) kann noch die Data Retention für die InfluxDB anpassen. Die Konfiguration erfolgt dabei über den Shell-Befehl influx.
Das sind die notwendigen SQL Befehle:

USE collectd
CREATE RETENTION POLICY "1y" ON "collectd" DURATION 52w REPLICATION 1
SET RETENTION POLICY "1y" on "collectd" DEFAULT

Achtung: dies setzt ggf. die gesammelten Daten zurück.

Abschließender Hinweis

Dieser Blog-Eintrag beschäftigt sich ausschließlich mit der Implementierung der Lösung, jedoch nicht mit Dingen wie z.B. die Härtung von der InfluxDB, Grafana und anderen Komponenten. Auch auf Verschlüsselung, wie z.B. die Umstellung von http auf https, wird nicht eingegangen.
Bitte darauf aufpassen!

Quellen

Ich habe mir das nicht alles selbst ausgedacht und möchte natürlich nicht meine Quellen verheimlichen.

http://www.andremiller.net/content/grafana-and-influxdb-quickstart-on-ubuntu
https://huskynarr.de/monitoring-der-fritzbox-mit-grafana-auf-dem-raspberry-pi-3/
https://fritzconnection.readthedocs.io/en/1.2.1/sources/install.html

https://grafana.com/grafana/download?platform=arm
https://grafana.com/docs/grafana/latest/installation/debian/#install-from-apt-repository
https://grafana.com/docs/grafana/latest/installation/configuration/

https://grafana.com/grafana/dashboards/713