Fritzbox-monitoring met een Raspberry Pi
Het webfront-end van een Fritzbox toont statistieken over de internetverbinding, belasting en het netwerk. Maar meer dan een paar seconden of een paar dagen kun je niet terugkijken. Met een Raspberry Pi en het monitoringsysteem MRTG kun je de data langer bewaren.
Als het downloaden van een Windows-update blijft hangen, hoef je alleen maar naar de online monitor van je Fritzbox te kijken om er achter te komen dat op dat moment een of meerdere videostreams van huisgenoten de internetverbinding overbelasten. Maar waarom YouTube gisteravond geen genoegen was om naar te kijken, dat beantwoordt de Fritzbox niet – zo lang gaan de data in het webfront-end niet terug. Met een Raspberry Pi kun je deze en andere informatie binnenhalen en langdurig opslaan, zodat je problemen ook achteraf nog op het spoor kunt komen.
Er zijn meerdere monitoringsystemen die een Fritzbox kunnen bewaken, zoals Munin en Check_MK. We hebben hier gekozen voor het slanke MRTG.
INSTALLEREN
Dankzij Docker is het installeren niet moeilijk: in het meest simpele geval volstaat het om Raspbian op de Raspberry Pi te zetten, Docker te installeren en dan een Docker-container van GitHub te klonen. Daarna kun je de internetbelasting al bekijken. Via de UPnP-interface van de Fritzbox heb je echter ook toegang tot andere data van de router. We laten zien hoe je in de interfacedocumentatie van AVM de benodigde informatie vindt.
Het installeren begint met het downloaden van de laatste versie van Raspbian. Op het moment van schrijven was dat die van 8 april 2019. Je hoeft alleen Raspbian Stretch Lite te downloaden, niet de desktopversie. Na het uitpakken moet je de Raspbian-image zetten op een minstens 8 GB grote microSD-kaart. Dat kan, onafhankelijk van het gebruikte besturingssysteem, met het programma balenaEtcher van etcher.io. Ook dat moet je na het downloaden uitpakken voordat je het kunt starten. Sluit de kaartlezer met de microSD-kaart van je Raspberry Pi pas aan nadat je Etcher gestart hebt. Dan gebruikt Etcher die kaart als doel en hoef je niet eerst door een bestandsdialoog heen.
Als de image geschreven is, dan verwijder je de microSD-kaart even om hem dan meteen weer aan te sluiten – dat zorgt ervoor dat je besturingssysteem in elk geval rekening houdt met de veranderde partitionering. Open de (kleinere) bootpartitie op de kaart en maak daar een leeg bestand aan met de naam ssh. Daarmee wordt de SSH-daemon continu geactiveerd en kun je alle andere configuratiestappen makkelijk met behulp van ssh doen. Zo hoef je geen toetsenbord en monitor op de Raspberry Pi aan te sluiten.
Als je een Raspberry Pi Zero W gebruikt of je Pi via wifi wilt verbinden met de Fritzbox, dan heeft Raspbian bovendien de toegangsgegevens voor je wifi nodig. Maak daarvoor op de bootpartitie het bestand wpl_ suppliant.conf aan met de volgende inhoud: ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=NL network={ ssid="fritzbox" psk="690490020945986723"
}
Achter ssid zet je de naam van je wifi en achter psk de bijbehorende netwerksleutel. Dan maakt de Pi bij de eerste keer starten al contact met je wifinetwerk.
De volgende configuratiestappen zet je dan via SSH, bijvoorbeeld vanuit Windows met behulp van Putty of onder Linux en macOS op de console met ssh.
DOCKEREN
Docker voor Raspbian zit in een eigen repository. Voeg die en zijn sleutel toe aan de pakketbronnen: curl -fsSL "https://download.docker.com/linux/ raspbian/gpg" | sudo apt-key add - echo "deb [arch=armhf] https://download.docker. com/linux/raspbian stretch stable" | sudo tee /etc/apt/sources.list.d/docker.list
Vervolgens haal je met apt-get-update de pakketlijsten binnen en installeer je Docker met
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
Dan kun je Docker-image Fritzbox-Bandwidth-Monitor van Thomas Koch downloaden en installeren. Die staat op GitHub. Gebruik het volgende commando: git clone https://github.com/mottobug/fritzboxbandwidth-monitor.git
De bestanden komen dan in de subdirectory fritzbox-bandwidth-monitor. De image bevat een kant-enklaar monitoringsysteem op basis van de Multi Router Traffic Grapher MRTG en Debian Stretch, dat de transferrate van de Fritzbox afvangt en tot een jaar terug grafisch weergeeft. Voorwaarde is dat je het doorgeven van die informatie via UPnP niet hebt uitgezet: zie ‘Home Network / Network’ op het tabblad ‘Network Settings’ bij ‘Transmit status information over UPnP’.
Het configuratiebestand van MRTG staat in de subdirectory assets met de naam mrtg.cfg. Daar staat standaard bij MaxBytes1[fritzbox] de waarde 512000 bytes/sec downstream (4 Mbit/s) en bij MaxBytes2[fritzbox] de waarde 384000 upstream (3 Mbit/s). Vul de juiste waarden in voor je internetsnelheid, zodat de schaal van de grafieken later klopt. Bovendien staat er aan het eind van het configuratie
bestand wat HTML-code, die bij de grafieken ingevoegd wordt. Hier kun je bijvoorbeeld het juiste model van je Fritzbox invoegen en de correcte datasnelheden.
CONTAINERBOUW
Met het commando
sudo docker build -t fritzbox-bandwidth-monitor fritzbox-bandwidth-monitor
maak je van de image een Docker-container met de naam fritzbox-bandwidth-monitor. Die start je met
sudo docker run -d -p 80:80 fritzbox-bandwidthmonitor
In de Docker-container start een cronjob elke vijf minuten MTRG, dat met een shell-script data opvraagt van de Fritzbox, opslaat en grafisch voorbereidt. Voor de weergave gebruik je een browser, daar is bij het starten van de container al poort 80 voor vrijgegeven. Met de standaard hostnaam van de Raspberry Pi kun je de statistieken zien op http://raspberrypi/fritzbox.html – nadat de cronjob voor de eerste keer is voltooid.
MRTG leest bij elke aanroep het configuratiebestand mrtg.conf in en start aan de hand van de definitie Target[fritzbox] het script upnp2mrtg.sh. Als teruggavewaarde krijgt MRTG vier regels met de huidige belasting van de down- en upstream en de uptime en de naam van de Fritzbox.
Van de waarden van de eerste twee regels maakt MRTG grafieken – waarbij het voor het monitoringsysteem eigenlijk totaal onbelangrijk is waar die waarden voor staan. Je kunt ook temperaturen of het aantal binnenkomende gesprekken binnenhalen en visualiseren, zo lang de aanroep van Target[] maar twee numerieke waarden terug levert.
AFLUISTEREN
Het script upnp2mrtg.sh is verantwoordelijk voor de communicatie met de Fritzbox. Standaard gebruikt dit de hostnaam fritz.box voor toegang tot de router en worden SOAP-requests gebruikt om de gewenste data binnen te halen. Met de parameter -a gevolgd door het IP-adres of de hostnaam van de Fritzbox kun je het script omleiden naar andere doelen. Het uitwisselen van data verloopt daarbij via de UPnP-poort 49000, waarover applicaties een groot aantal statusgegevens kunnen oproepen. De zeer omvangrijke informatie kun je vinden via de link op deze pagina.
Je kunt de Fritzbox zelf echter ook met de browser benaderen via poort 49000. Je kunt daar met /fboxdesc.xml, /tr64desc.xml, /igddesc.xml en /usbdesc.xml meerdere XML-bestanden vinden die de functieomvang van de Fritzbox beschrijven. Daarin staan verwijzingen naar andere XML-bestanden, die bijvoorbeeld functienamen en parameters bevatten. Een lijst van alle op te vragen XML-bestanden die voor de betreffende Fritzbox van toepassing zijn, is er volgens AVM helaas niet. Niet bij alle Fritzbox-modellen zijn alle XML-bestanden voorhanden.
Het is van belang om van tevoren na te kijken of een bepaalde in de officiële documentatie van AVM genoemde functie ook geldt voor jouw Fritzbox. Als je bijvoorbeeld bij een Fritzbox 7490 of 7530 de url http:// fritz.box:49000/igddesc.xml in de browser opent, krijg je daar het servicetype WANIPConnection te zien:
...
...
Onder SCPDURL staat een verwijzing naar het bestand /igdconnSCPD.xml, dat gedetailleerde informatie bevat over de functies van die dienst. Als je dat XMLbestand oproept, dan staat daar onder meer de uptime van de internetverbinding in:
...
...
Hoe lang de internetverbinding al bestaat, kun je dus achterhalen met de service urn:schemas-upnp-org:service:WANIPConnection:1 door bij de url http://fritz. box:49000/igdupnp/control/WANIPConn1 dan de actie GetStatusInfo uit te voeren met de parameter NewUptime. Die taak wordt overgenomen door het script upnpquery.sh, dat je bij de link op deze pagina kunt downloaden – je hoeft daarmee alleen de genoemde taken aan te leveren: ./upnpquery.sh urn:schemas-upnp-org:service:WANIPConnection:1 /igdupnp/control/WANIPConn1 GetStatusInfo NewUptime
Met die kennis kun je in het vervolg niet alleen verklaren waarom die laatste update zo eeuwig lang duurde om binnen te halen, maar ook andere statusinformatie aan je Fritzbox ontfutselen voor veel andere projecten.