Natürlich wollte ich auch Statistiken von der FRITZ!Box in meiner MRTG/Routers2-basierten Monitoring Umgebung haben. Glücklicherweise habe ich ein Tool namens upnp2mrtg gefunden, welches exakt das macht, nämlich die Interface-Statistik des WAN Ports der FRITZ!Box über UPnP abzufragen und für MRTG aufzubereiten. Sehr einfach zu benutzen. Hier also eine Anleitung mit einigen zusätzlichen Hinweisen.
UPnP auf der FRITZ!Box zulassen
Der erste Schritt ist die Kontrolle, ob Universal Plug and Play (UPnP) auf der FRITZ!Box erlaubt ist. Man findet die Einstellung unter Heimnetz -> Netzwerk -> Programme. Das Häkchen bei “Statusinformationen über UPnP übertragen (empfohlen)” muss drin sein, während das Häkchen bei “Änderungen der Sicherheitseinstellungen über UPnP gestatten” draußen bleiben sollte:
Eine potentielle Frage kann ich noch mit “ja” beantworten: Die Abfrage über UPnP funktioniert auch aus anderen IP-Bereichen und über einen aufgebauten VPN-Tunnel hinweg. Beides war für mich wichtig, da ich mehrere FRITZ!Boxen von meinem zentralen Monitoring Server aus überwache und somit alle Boxen über die VPN-Tunnel abfrage.
upnp2mrtg
Zunächst muss man sich das Tool hier herunterladen. Auf meinem Ubuntu Server hat es sofort ohne Probleme funktioniert. (Natürlich darf man nicht vergessen, es ausführbar zu machen: chmod u+x upnp2mrtg ). Wichtig ist dann nur der -a <IP-Adresse> Switch, der die Ziel IP-Adresse der FRITZ!Box bestimmt. Ein kurzer Test sah so aus:
1 2 3 4 5 |
weberjoh@jw-vm01:~$ upnp2mrtg -a 192.168.86.1 692423171 524025935 0 days 18:08:30 h (online) Fritz!Box |
Wie gewohnt habe ich das Tool nach “/usr/local/bin/” verschoben. (Infos zur Verzeichnisstruktur hier.)
Schieße dich selber ab …
… bevor du alles blockierst. Nach ein paar Wochen im Test mit MRTG (Konfig kommt weiter unten) musste ich feststellen, dass das Tool immer wieder den kompletten MRTG Prozess blockiert hat, sobald eine einzelne FRITZ!Box nicht auf die Anfragen geantwortet hat. Sprich: Bei allen Graphen von MRTG waren diese grauen Balken zu sehen. Hier ein Screenshot davon und die Ausgabe von htop auf dem Monitoring-Server welches zeigt, dass cron alle 5 Minuten MRTG neu startet, aber die alten Prozesse noch gar nicht fertig sind:
Deswegen habe ich ein kleines Skript geschrieben, welches das eigentliche upnp2mrtg Skript aufruft und aber nach 3 Sekunden schaut, ob es noch am Laufen ist. Wenn ja, dann wird das upnp2mrtg Skript abgeschossen, damit MRTG alle anderen Geräte zeitnah abfragen und sich dann beenden kann.
Mein “upnp2mrtgwithkill” Skript sieht folgendermaßen aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash /usr/local/bin/upnp2mrtg -a $1 & PID=$! #echo "PID: "$PID sleep 3 if ps -p $PID > /dev/null then # echo $PID" is still running --> kill" kill $PID fi |
Ich habe es auch wieder nach “/usr/local/bin” verschoben und ausführbar gemacht. Als einzigen Parameter braucht es die IP Adresse der abzufragenden FRITZ!Box:
1 2 3 4 5 |
weberjoh@jw-vm01:/usr/local/bin$ upnp2mrtgwithkill 192.168.86.1 4229780344 2069694830 0 days 06:07:05 h (online) Fritz!Box |
Wieder in htop sieht man schön, wie sich die Prozesse gegenseitig aufrufen. Bei einem kill von upnp2mrtg ist außerdem anzumerken, dass ein paar Zombies weiterhin existieren. Diese verschwinden aber auf meinem Ubuntu immer nach ein paar Augenblicken (macht Ubuntu das?). Hier zwei htop Screenshots davon:
MRTG/Routers2 Konfiguration
Jetzt also endlich zur MRTG/Routers2 Konfiguration. Diese sieht relativ einfach aus und erinnert stark an die eines normalen Interfaces welches per SNMP abgefragt wird. Hier wird stattdessen halt mein Skript verwendet:
1 2 3 4 5 6 7 8 9 10 11 |
Target[fdorf_wan]: `/usr/local/bin/upnp2mrtgwithkill 192.168.86.1` Title[fdorf_wan]: Traffic Analysis for WAN -- fdorf #Downstream 16 MBit = 2000000 MaxBytes1[fdorf_wan]: 2000000 #Upstream 1 MBit = 125000 MaxBytes2[fdorf_wan]: 125000 #AbsMax set to 100 MBit AbsMax[fdorf_wan]: 12500000 routers.cgi*Mode[fdorf_wan]: interface routers.cgi*GraphStyle[fdorf_wan]: mirror routers.cgi*ShortDesc[fdorf_wan]: WAN |
Hier ein Beispiel für einen solchen Graphen. Ab 22:15 Uhr wurde ein Live-Stream übers Internet geschaut – zunächst in normaler Qualitätsstufe. Gegen 23:15 Uhr wurde dann auf HQ umgeschaltet, was die Downloadrate direkt verdoppelt hat:
Cool ist natürlich auch, dass Routers2 nicht nur die durchschnittlichen Down-/Uploadwerte, sondern auch die absoluten Werte für den Traffic anzeigt. Das sieht bei mir beispielsweise so aus (im letzten Monat 29,6 GB Download und 4,21 GB Upload):
1 2 3 4 |
Total over last 7 days: In: 4.95 Gbytes Out: 608.94 Mbytes 95th Percentile for last 7 days: In: 188.53 kbps (1.18 %) Out: 38.40 kbps (0.24 %) Total over rolling last month: In: 29.63 Gbytes Out: 4.21 Gbytes 95th Percentile for rolling last month: In: 255.73 kbps (1.60 %) Out: 34.37 kbps (0.21 %) |
Meine komplette FRITZ!Box Konfig
Als Template biete ich hier noch meine komplette FRITZ!Box Konfiguration für MRTG/Routers2 an. Sie beinhält neben dem hier erwähnten Skript noch drei weitere Graphen, nämlich den Traceroute Hop Count (siehe hier) sowie die Ping Zeiten (siehe hier) vom externen und dem internen Interface. Dieses Template macht natürlich nur da Sinn, wo auch über einen VPN-Tunnel die FRITZ!Box abgefragt wird. Hat man den Monitoring-Server im eigenen Netz direkt hinter der FRITZ!Box kann man sich das Traceroute Hop Count und die Pings sparen. Summa summarum ist überdies interessant, dass bei keinem der vier Graphen SNMP zum Einsatz kommt, sondern nur externe Skripte. :)
Man muss lediglich drei Variablen per Suchen-und-Ersetzen anpassen, damit die Konfig fertig ist. Beschrieben ist es am Anfang der Datei.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#Template for a FRITZ!Box by Johannes Weber (https://weberblog.net) # #Replace the following variables: #"192.168.86.1" by your inside IP address #"dyndns.account.com" by your DynDNS name from the Internet-facing interface of the FRITZ!Box #"locationname" by a name related to your location routers.cgi*Icon: modem-sm.gif routers.cgi*ShortDesc: locationname ################################################################################################################ ################################################## Interface WAN ############################################### ################################################################################################################ Target[locationname_wan]: `/usr/local/bin/upnp2mrtgwithkill 192.168.86.1` Title[locationname_wan]: Traffic Analysis for WAN -- locationname #Downstream 16 MBit = 2000000 MaxBytes1[locationname_wan]: 2000000 #Upstream 1 MBit = 125000 MaxBytes2[locationname_wan]: 125000 #AbsMax set to 100 MBit AbsMax[locationname_wan]: 12500000 routers.cgi*Mode[locationname_wan]: interface routers.cgi*GraphStyle[locationname_wan]: mirror routers.cgi*ShortDesc[locationname_wan]: WAN ################################################################################################################ ########################################### Traceroute Hop Count ############################################### ################################################################################################################ Target[locationname_traceroute]: `/usr/local/bin/traceroute2mrtg dyndns.account.com` Title[locationname_traceroute]: Traceroute Hop Counts to dyndns.account.com -- locationname MaxBytes[locationname_traceroute]: 128 Options[locationname_traceroute]: gauge Colours[locationname_traceroute]: BROWN#660000, YELLOW#FFD600, BLACK#000000, ORANGE#FC7C01 YLegend[locationname_traceroute]: Number of Hops Legend1[locationname_traceroute]: Hops Legend3[locationname_traceroute]: Peak Hops LegendI[locationname_traceroute]: Hops: ShortLegend[locationname_traceroute]: routers.cgi*ShortDesc[locationname_traceroute]: Traceroute Hop Count routers.cgi*Options[locationname_traceroute]: fixunit integer maximum nomax noo nopercentile nototal #routers.cgi*GraphStyle[locationname_traceroute]: lines routers.cgi*Icon[locationname_traceroute]: graph-sm.gif ################################################################################################################ ################################################ Ping outside IP ############################################### ################################################################################################################ #Since mrtg-ping-probe outputs integers, the values are multiplied to have milliseconds reportet #i.e., instead of "5" the answer is now "5324" which is interpreted by Factor[] as 5.324 ms Target[locationname_ping]: `mrtg-ping-probe -p '1000*max/1000*min' -s dyndns.account.com` Title[locationname_ping]: Ping Times to dyndns.account.com -- locationname #MaxBytes: 100 ms * 1000 (due to mrtg-ping-probe *1000) MaxBytes[locationname_ping]: 10000000 #AbsMax: 10 seconds #AbsMax[locationname_ping]: 10000000 Options[locationname_ping]: gauge Factor[locationname_ping]: 0.001 Colours[locationname_ping]: RED#FF0000, WHATEVER#123456, DARK RED#800000, WHATEVER2#654321 routers.cgi*ShortDesc[locationname_ping]: Ping Outside routers.cgi*Options[locationname_ping]: fixunit nomax nopercentile nototal routers.cgi*GraphStyle[locationname_ping]: range routers.cgi*Icon[locationname_ping]: clock-sm.gif ################################################################################################################ ################################################ Ping inside IP ################################################ ################################################################################################################ #Since mrtg-ping-probe outputs integers, the values are multiplied to have milliseconds reportet #i.e., instead of "5" the answer is now "5324" which is interpreted by Factor[] as 5.324 ms Target[locationname_ping2]: `mrtg-ping-probe -p '1000*max/1000*min' -s 192.168.86.1` Title[locationname_ping2]: Ping Times to 192.168.86.1 -- locationname #MaxBytes: 100 ms * 1000 (due to mrtg-ping-probe *1000) MaxBytes[locationname_ping2]: 100000 #AbsMax: 10 seconds AbsMax[locationname_ping2]: 10000000 Options[locationname_ping2]: gauge Factor[locationname_ping2]: 0.001 Colours[locationname_ping2]: RED#FF0000, WHATEVER#123456, DARK RED#800000, WHATEVER2#654321 routers.cgi*ShortName[locationname_ping2]: Ping Inside routers.cgi*Options[locationname_ping2]: fixunit nomax nopercentile nototal routers.cgi*GraphStyle[locationname_ping2]: range routers.cgi*Icon[locationname_ping2]: clock-sm.gif |
Hier noch eine Slideshow von den vier Graphen in meinem Montoring-System. Man sieht zum Beispiel, dass der Ping zum outside Interface im Vergleich zum inside Interface stets etwas kürzer ist, da er nicht durch den VPN-Tunnel muss. Interessant sind auch die unterschiedlichen Hop-Counts, die sich immer nach der DSL-Zwangstrennung in der Nacht ergeben:
Das war’s. ;) Viel Spaß damit.
Featured image “Blitzer / Geschwindigkeitsmessung durch die Polizei” by Dirk Vorderstraße is licensed under CC BY-NC 2.0.
Hello,
I do not understand how you have both fritzboxes , servers and switches witth rrdtool
when i follow your guidance i am able to have a html page for my fritzbox but once i have configured router2cgi the program complains that the *.rrd files cannot be found!
can you help?
regards,
Michel
Hi Michel,
have you followed my guide for the mere MRTG/Routers2 installation? It is here:
https://weberblog.net/mrtg-with-rrdtool-and-routers2-installation-from-scratch/
Note the section which is called “Modifying the Default mrtg.cfg”. Please verify whether the MRTG config (/etc/mrtg.cfg) has the “Include: mrtg/*.cfg” line in it. Only with this line, cfg files in the folder “/etc/mrtg/” will be used.
Do you have unique cfg files for your devices? I am using a unique file for every device, e.g., for every FRITZ!Box or switch. Furthermore, ALL Targets must have unique names, such as “Target[192.168.122.2_cpu]: xxx”. You cannot use the same name more than once.
At least, verify that you have the correct lines in your routers2 configuration (routers2.conf):
dbpath = /var/mrtg
confpath = /etc/mrtg
cfgfiles = *.cfg
Maybe this helps?
Regards, Johannes
Hallo Johannes,
erstmal danke für tolle Anleitung.
Ich monitor meine Fritzbox 7490 per upnp2mrtg und ein Cisco AP per snmp mit routers2.cgi.
Jetzt würde ich aber gerne bei der Fritzbox nicht nur das WAN Interface, sondern auch die WLAN (2,4 + 5 GHz) und alle 4 LAN Interfaces monitoren.
Kann man das auch abfragen?
Vielen Dank für deine Hilfe!
Grüße Carsten
Hey Carsten,
leider nein. :( Über UPnP bekommt man (meines Wissens nach) wirklich nur das Internet-Interface abgefragt. Für mich ist diese Lösung auch schon länger nicht mehr befriedigend, da es nicht immer ganz exakt funktioniert. (Also bei einem konstanten Download von einer Stunde schwangt der Wert im Graph manchmal stark, obwohl es in echt nicht so war. Hm.)
Ich werde irgendwann vielleicht mal mit einer alternativen Firmware (Freetz) für die FRITZ!Box herumspielen. Dort kann man dann per snmp wirklich alle Interfaces exakt abfragen. Das wäre natürlich deutlich vernünftiger als dieses Gefrickel hier. ;)
Ciao,
Johannes
Schade!….ja an Freetz habe ich auch schon gedacht, habe aber keine Lust meine Fritzbox zu flashen, läuft eigentlich alles gut.
Naja, mal schauen.
Danke dir!
Grüße Carsten