Eine FRITZ!Box kann eine feine Sache sein, aber so manchmal gibt’s auch kleine Makel, wie z.B. diesen: Bei einem Kunden streikt schon fast regelmässig das WLAN.
Oft geht die Performance zurück und manchmal bleiben Geräte als Verbunden „hängen“, obwohl diese nicht mal mehr ansatzweise in der Nähe sind (Live beobachtet z.B. mit meinem Notebook als auch mit diversen Smartphones und Tablets). Helfen tut in aller Regel ein Neustart.
Nun ist es lästig alle paar Tage sich mit dem Webinterface verbinden zu dürfen, um einen Neustart auszulösen. Unterm Tag ist das zwecks „arbeiten können“ sowieso eher ungut. Abhilfe schafft das Auslösen des Neustarts z.B. von einem sowieso immer laufenden System aus wieetwa Server, NAS oder ähnliches.
Im Netz kursieren hierzu viele Beispiele. Wichtig ist, dass das verwendete Skript mit aktuellen Firmware-Versionen funktioniert. Ältere Skripte die auf die WEBCM-Schnittstelle setzen können nicht mehr angewendet werden. Eine weitere Möglichkeit wäre telnet zu verwenden, sofern man es vorher aktiviert. Ohne größere Umwege geht es über das Router-Verwaltungsprotokoll TR-064.
Ein sehr schönes und leicht zu verstehendes Skript für Linux liefert Nico Hartung:
loggn.de – FRITZ!Box oder Repeater automatisch neustarten lassen – Linux Bash-Skript
Bei meinen Tests klappte das Auslösen eines Neustarts aber nur mit einem Benutzer, der FRITZ!Box-Einstellungen ändern darf. Nur mit dem Weboberflächen-Kennwort kommt folgende Fehlermeldung:
<?xml version="1.0"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <s:Fault> <faultcode>s:Client</faultcode> <faultstring>UPnPError</faultstring> <detail> <UPnPError xmlns="urn:dslforum-org:control-1-0"> <errorCode>606</errorCode> <errorDescription>Action Not Authorized</errorDescription> </UPnPError> </detail> </s:Fault> </s:Body> </s:Envelope>
Dieses Verhalten ist bekannt:
Authentifizierung nicht möglich
Dokumentation der FRITZUSER Variable verbessern
D.h. einen neuen FRITZ!Box-Benutzer anlegen, bei diesem den Haken setzen bei
- FRITZ!Box Einstellungen
Benutzer mit dieser Berechtigung können alle Einstellungen der FRITZ!Box sehen und bearbeiten.
Diese Zugangsdaten dann in das Skript bei den entsprechenden Variablen eintragen.
FreeBSD / pfSense
Das Skript lässt sich nahezu unverändert unter FreeBSD bzw. pfSense verwenden. Man muss lediglich die erste Zeile von
#!/bin/bash
zu
#!/bin/sh
ändern.
Apropos pfSense: Beim besagten Kunden läuft eine pfSense, die dort lediglich als OpenVPN-Server dient. Das Skript kann man einfach via (Win)SCP im Pfad
/usr/local/etc/
ablegen und mittels ssh noch ausführbar machen:
chmod 0755 /usr/local/etc/fritzbox-reboot.sh
ssh muss für beides (natürlich) vorher in pfSense aktiviert sein. Mit der Cron-Erweiterung kann der Zeitpunkt für den automatischen Neustart via Web-Interface bequem geplant werden. Ein Beispiel für täglich 04:30 Uhr:
Was ist mit Windows?
Gerne hätte ich eine Lösung für Windows, da man nicht überall etwas unixoides vorfindet. Bei der Recherche bin ich über ein Powershell-Skript gestolpert:
Administrator.de – Powershell: FritzBox über TR-064 im Netzwerk konfigurieren und auslesen
Leider lies sich dieses nicht erfolgreich ausführen. Sozusagen als Plan B habe ich dann versucht den curl-Befehl vom zuvor genannten Skript unter Windows zum Laufen zu bekommen.
Also erstmal curl für Windows heruntergeladen, entpackt und im bin-Ordner das Skript als Windows-Batch hinterlegt und natürlich OS-bedingt geändert. Dieses sieht aktuell so aus:
@echo off set IP=192.168.178.1 set FRITZUSER=<Benutzername> set FRITZPW=<Kennwort> set location=/upnp/control/deviceconfig set uri=urn:dslforum-org:service:DeviceConfig:1 set action=Reboot curl -k -m 5 --anyauth -u %FRITZUSER%:%FRITZPW% http://%IP%:49000%location% -H Content-Type: text/xml; charset="utf-8" -H SoapAction:%uri%#%action% -d ^<?xml version='1.0' encoding='utf-8'?^>^<s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'^>^<s:Body^>^<u:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'^>^</u:Reboot^>^</s:Body^>^</s:Envelope^> -s > output.log 2>&1
Leider meldet die FritzBox immer dieses zurück:
<HTML> <HEAD> <TITLE>500 Internal Server Error (ERR_INVALID_REQ)</TITLE> </HEAD> <BODY> <H1>500 Internal Server Error</H1> <BR>ERR_INVALID_REQ<HR> <B>Webserver</B> Wed, 20 Feb 2019 13:04:50 GMT </BODY> </HTML>
Mit anderen Worten: Es klappt nicht. Auch dann nicht, wenn man alles (ohne Variablen) in eine Zeile packt. Seltsam finde ich, das der Aufruf, wenn man sich diesen mittels echo sowohl unter Linux als auch Windows anzeigen lässt identisch aussieht:
Linux:
curl -k -m 5 --anyauth -u <Benutzername>:<Kennwort> http://192.168.178.1:49000/upnp/control/deviceconfig -H Content-Type: text/xml; charset="utf-8" -H SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot -d <?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><u:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'></u:Reboot></s:Body></s:Envelope> -s
Windows:
curl -k -m 5 --anyauth -u <Benutzername>:<Kennwort> http://192.168.178.1:49000/upnp/control/deviceconfig -H Content-Type: text/xml; charset="utf-8" -H SoapAction:urn:dslforum-org:service:DeviceConfig:1#Reboot -d <?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><u:Reboot xmlns:u='urn:dslforum-org:service:DeviceConfig:1'></u:Reboot></s:Body></s:Envelope> -s
Evtl. hat ja noch jemand einen Tipp