Donnerstag, 9. November 2017

Fritz!Box 7490 mit Freetz für Unbound flashen

Es ist keine sonderlich schlaue Idee, den Heimnetz DNS auf einen Rechner zu packen, der nur über eine fehleranfällige Powerline mit hoher Latenz angebunden ist - aber das wusste ich ja vorher...

Die (noch) aktuelle Fritz!Box 7490 hat 256MB RAM, 512MB NAND Flash und einen MIPS DualCore mit 600MHz, das sind eigentlich die perfekten Vorraussetzungen für alle Netzwerkaufgaben. Mein Ziel ist daher - unter Beibehaltung der "normalen" Funktionen" - folgende Software auf der Fritz!Box laufen zu lassen:
  • dnsmasq als lokaler DNS- und DHCP-Server
  • unbound als DNSSEC Resolver und QName-Minimization "Anonymizer"
  • AD-Block Filter
Mit Freetz steht ein hervorragendes Projekt für die Modifikation der Fritz!Box bereit. Meine Erfahrungen liegen zwar schon über 10 Jahre zurück (FB-7050, FB-7170), aber so schwer kann's ja wohl nicht sein...

Falls kein Build-Server mit Linux vorhanden sein sollte, kann man das VirtualBox Image von Freetz-Linux verwenden.

Freetz bauen

Zunächst wird die aktuelle Entwicklungsversion ausgecheckt und das YourFritz Tool (für das in_memory Update später) geholt:
 svn co http://svn.freetz.org/trunk freetz-trunk
 git clone https://github.com/PeterPawn/YourFritz.git

In der offiziellen Paketliste fehlt Unbound als Option, daher habe ausgehend von einem IPPF-Post einen eigenen Patch angefertigt. Da die Dateisystemberechtigungen nicht per "pacth" gesetzt werden und das Freetz-Build System auch nicht daran "denkt", müssen die Ausführungsrechte ber "chmod" gesetzt werden - sonst startet Unbound später im Image nicht.
Bei der Gelegenheit patche ich auch gleich noch das OpenSSL Makefile, um später auch Perl mit Net::SSLeay installieren zu können.
Außerdem wird cURL so angepasst, dass es sein Zertifiaktsbundle im OpenSSL Verzeichnis (/mod/etc/ssl) sucht.
wget https://loetzimmer.de/patches/freetz_unbound_1.6.7.patch
wget https://loetzimmer.de/patches/freetz_openssl_ripemd.patch
wget https://loetzimmer.de/patches/freetz_curl_ca-bundle.patch

cd freetz-trunk/
patch -p0 < ../freetz_unbound_1.6.7.patch
patch -p1 < ../freetz_openssl_ripemd.patch
patch -p1 < ../freetz_curl_ca-bundle.patch

### WICHTIG !!! ###
chmod a+x make/unbound/files/root/etc/init.d/rc.unbound
chmod a+x make/unbound/files/root/etc/default.unbound/unbound_conf
chmod a+x make/unbound/files/root/usr/lib/cgi-bin/unbound.cgi

make menuconfig
Paket Unbound 1.6.7 auswählen
Pakete auswählen, z.B. DNSMasq nicht vergessen...
ggfs. die PThread Library auswählen
Um später Arbeitsspeicher auf der Box zu sparen, sollte die PThread-Bibliothek ausgewählt werden, damit Unbound im Threaded-Mode startet und so auf einen gemeinsamen Speicherpool zugreifen kann (sonst würde Unbound bei threads=2 eine Kopie von sich forken).

Um Updates später per Webinterface flashen zu können, erstelle ich ein signiertes Image (und vergebe dafür ein Passwort für den privaten Schüssel). Für den ersten Flash braucht man auch noch ein in_memory Image, deshalb wähle ich diese Option ebenfalls an.
Firmware packaging options
Nachdem das anschließende make durchgelaufen ist, gibt es im Vereichnis images/ eine Datei 7490_06.90-freetz-devel-<SVN-rev>M.de_<date>.image.in-memory die nun für den Flashvorgang benötigt wird.

Image flashen

Das zuvor vom GIT heruntergeladene Paket YourFritz wird zum Flashen benutzt. dazu ist es hilfreich das In-Memory Image gleich in den betreffenden Ordner zu kopieren.
cp images/7490_06.90-freetz-devel-<SVN-rev>M.de_<date>.image.in-memory ../YourFritz/eva_tools/
cd ../YourFritz/eva_tools/

Da die Tools etwas streng bezüglich der Systemvoraussetzungen sind müssen noch ein paar Vorkehrungen getroffen werden:
apt-get install netcat-openbsd socat

perl -pi -e 's/^#!.*sh/#!\/bin\/bash/' eva_*

Der Flash-Vorgang verläuft folgendermaßen:
  1. Fritz!Box starten und abwarten bis zum Boot-Prompt
  2. Umschalten des Boot-FW Images auf das vorherige FW-Image (z.B. von 6.90 auf das zuvor geflashte 6.83). So bleibt das funktionierende Image unangetastet.
  3. Neustart abwarten bis zum Boot-Prompt
  4. Flashen des In-Memory Images per eva_to_memory
Es ist erforderlich, dass der verwendete PC entweder per Switch mit der Fritzbox verbunden ist, bzw. dass das AutoSensing Feature abgeschaltet ist, sonst wacht die Netzwerkschnittstelle erst auf, nachdem der Boot-Einsprungpunkt vorbei ist..
Im Beispiel ist die IP des verwendeten Rechners 192.168.42.42 und die der Fritzbox 192.168.42.1.
./eva_switch_system eth0 192.168.42.1 192.168.42.42
#Box mit Strom versorgen
Abwarten bis die Box neustartet und ggfs. die Box erneut vom Strom trennen und starten.
./eva_discover INTERFACE=eth0 TO=192.168.42.1 FROM=192.168.42.42 BLIP=1 HOLD=0
#Box mit Strom versorgen
./eva_to_memory 7490_06.90-freetz-devel-<SVN-rev>M.de_<date>.image.in-memory 192.168.42.1
Jetzt solte das Image geflasht werden und nach dem anschließenden Reboot das Freetz-Webinterface unter http://fritz.box:81/ erreichbar sein.

Nacharbeit

Wenn alles funktioniert hat, muss Unbound im Webinterface noch auf Automatisch Starten gestellt werden und DNSMasq muss zusätzlich Unbound als Upstream Nameserver verwenden:
127.0.0.1#5353

Ich erlaube als "fallback" bisher noch die Provider Nameserver.
Nicht vergessen, DHCP im Fritz!Box Web-Frontend abzuschalten, sonst gibt es seltsame Effekte zwischen multid und dnsmasq bei der Adressvergabe!

Der Crontab Dienst sollte aktiviert werden und folgender Eintrag hinzugefügt werden (alles eine Zeile!!!):
44 4 1 * * /tmp/root.hints ; wget -q -T 5 -O /tmp/root.hints http://www.internic.net/domain/named.cache 2>/dev/null ; if [ $? -eq 0 -a -n "$(grep -E 'A\.ROOT-SERVERS\.NET\..*A.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' /tmp/root.hints)" ] ; then mv /tmp/root.hints /tmp/flash/unbound/ ; /etc/init.d/rc.unbound restart > /dev/null ; else rm -f /tmp/root.hints ; fi
Und wenn wir schon bei der Crontab sind, können wir hier auch gleich die AdBlock Liste holen:
12 5 * * * wget -q -O - "http://pgl.yoyo.org/as/serverlist.php?hostformat=dnsmasq-server&showintro=0&mimetype=plaintext" | grep -i -v -E "MEINE_AUSNAHMEDOMAIN1|AUSNAHME_2" > /tmp/adhosts && /etc/init.d/rc.dnsmasq restart
Um den AdBlock zu aktivieren fügt man den DNSMasq Optionen (für Experten)
--servers-file=/var/tmp/adhosts
hinzu.

Falls cURL mit Openssl Support installiert wurde, sollte gelegentlich ein aktuelles CA-Bundle geholt werden:
# Freetz: crontab
42 4  1 * * curl -k -s -o /var/InternerSpeicher/opt/etc/ssl/cacert.pem https://curl.haxx.se/ca/cacert.pem

# Freetz: rc.custom
ln -s /var/InternerSpeicher/opt/etc/ssl /mod/etc/ssl