lalahop

Ce billet présente les quelques changements qui surviennent avec la nouvelle version stable d'OpenWRT. Je sais, je suis un peu en retard de plus d'un an m'enfin bon ... 😛

Table des matières

Ce billet est dans la continuité de mes autres billets sur OpenWRT et notamment de ce billet : Créez votre image personnalisée d’OpenWRT : ce qui change avec Backfire 10.03.1. Référez-vous à ces billets si quelque chose ne vous semble pas clair dans ce billet.

Ce qui change / ce que je change

Depuis tout ce temps, il y a eu des mises à jour que ça soit pour la sécurité ou le confort. Passer de Backfire à Attitude Adjustment permet d'en profiter.

Je ne souhaite plus faire de DROP en output sauf ce qui est autorisé. Je souhaite tout autoriser en sortie. D'un point de vue de la sécurité pure, c'est une perte. D'un point de vue du confort des utilisateurs placés derrière ce firewall, c'est un gain. Et comme je ne suis plus le seul utilisateur de ce réseau ... Il suffira de modifier le script /etc/init.d/firewall qui positionne les règles.

J'aurais souhaité remplacer mon récursif-cache DNS actuel, djbdns dnscache, par un autre, comme Unbound. La raison est que dnscache ne supporte pas des types d'enregistrements (exemple : NAPTR) et surtout, il ne fait pas de validation DNSSEC. Malheureusement, en choisissant Unbound et Unbound-anchor, la taille de l'image générée est de 4,5M. En supprimant LuCi, je peux tomber à 4,1M. Dans tous les cas, l'image est trop imposante pour mon WRT54GL. Donc il n'y aura pas encore de récursif-cache validant sur ce réseau puisque je suis contraint de rester avec dnscache.

Je n'ai plus besoin du package ddns-scripts proposé par OpenWRT car je n'utilise plus DynDNS (ou un autre service équivalent) mais ma propre méthode. Il faudra simplement créer le fichier /etc/crontab/root et placer la clé privée dans l'arborescence de Buildroot comme indiqué dans le billet linké.

J'effectuerai la compilation dans un tmpfs. Cela permet un gain important, notamment quand vous utilisez une machine qui est limitée par ses IO disk comme moi. La compilation utilise ccache. Il faudra le configurer car, par défaut, il met ses fichiers dans le home directory de l'utilisateur ... donc le gain du tmpfs dans ce cas-là est quasi-nul ...

Recréer l’image officielle

Presque rien ne change par rapport à mon billet sur Backfire à part l'utilisation d'un tmpfs et quelques URL.

Nous allons d'abord préparer notre Debian Wheezy (qui est devenue stable, depuis 😉 ) pour recevoir Buildroot :

sudo apt-get install asciidoc autoconf bison build-essential fastjar flex gawk gettext git-core intltool libextutils-autoinstall-perl libncurses5-dev libssl-dev libtool subversion zlib1g-dev

Nous allons créer le tmpfs (source : tmpfs : utiliser sa RAM comme répertoire de stockage. - Génération Linux. Personnellement, /tmp utilise déjà tmpfs. J'augmente donc simplement sa taille :

sudo mount -t tmpfs -o remount,size=7G tmpfs /tmp

En dessous de 8G de RAM, oubliez l'idée d'un tmpfs car la compilation du toolchain, du noyau et des packages que je sélectionne occupe facilement 5G/5,5G. Avec 8G de RAM, vous pouvez avoir un tmpfs de 7G qui vous permettra de compiler le cross-compiler, le noyau et les packages que vous voudrez (j'insiste : vous ne pourrez pas compiler tous les packages en "module").

Avec 7G sur 8G attribués au tmpfs, faites attention à ne pas lancer des applications gourmandes en RAM comme Firefox ou Eclipse (au pif hein 😛 ) en parallèle sinon le noyau va s'énerver et vous allez recevoir la visite de l'OOM Killer.

On se positionne dans notre tmpfs, on récupère les sources d'Attitude Adjustment (pour connaître l'adresse des dépôts : GetSource - OpenWrt) puis on se positionne dans le dossier des sources :

cd /tmp
svn co svn://svn.openwrt.org/openwrt/branches/attitude_adjustment
cd attitude_adjustment/

Dans la suite de ce billet, sauf mention contraire, je considérerai que votre répertoire courant est attitude_adjustment, c'est-à-dire la racine du buildroot.

On s'assure que tout le nécessaire est bien présent :

make defconfig && make prereq

On met à jour la liste des packages disponibles :

./scripts/feeds update -a && ./scripts/feeds install -a

Ensuite, on efface les fichiers de configuration de la compilation (créés automatiquement par make menuconfig, par exemple, nous y reviendrons) :

rm .config && rm .config.old

On récupère le fichier de configuration officiel (ici : déclinaison brcm47xx) :

wget http://downloads.openwrt.org/attitude_adjustment/12.09/brcm47xx/generic/config.brcm47xx_generic -O .config

Pour raccourcir le temps de la compilation, on désactive la compilation de l'image builder (« Build the OpenWrt Image Builder ») et du SDK (« Build the OpenWrt SDK ») :

make menuconfig

Par défaut, tous les packages sont compilés (en module) puis exclus de l’image finale. Pour éviter cette perte de temps lors de la compilation, on va demander à ce que les packages qui ne seront pas intégrés à l’image ne soient pas compilés. Pour cela, on commente les lignes qui finissent par “=m” (module) avec la commande suivante :

sed -i 's,^.*=m,# & is not set,g' .config

On configure ccache pour écrire dans le tmpfs au lieu du home directory de l'utilisateur courant :

export CCACHE_DIR=/tmp/.ccache

On lance la compilation :

make -j 9

La compilation va se vautrer :

make[3] -C package/dnsmasq compile
make -r world: build failed. Please re-run make with V=s to see what's going on
make: *** [world] Erreur 1

Je n'ai pas creusé l'origine de cette erreur mais il suffit de relancer la compilation (avec la même commande que ci-dessus) et cette fois, ça se passe sans emcombres.

Ajouter/supprimer des packages

Je garde les mêmes logiciels qu'avant (à l'exception de ddns-scripts, comme expliqué ci-dessus) et je ne supprime plus ppp/ppp-mod-pppoe (ce cela me semble être sans effet mais je n'ai pas creusé la question). Donc ça nous donne :

  • etherwake dans Network.
  • tcpdump-mini dans Network.
  • djbdns-dnscache dans Network -> IP adresses and Names.
  • ntpd dans Network -> Time Synchronization.
  • iptables-mod-conntrack-extra dans Network -> Firewall -> Iptables.
  • luci-i18n-french dans LuCi -> Translations

Je me suis rendu compte que Busybox intègre un serveur NTP minimaliste qui ne fournit pas le support des queries (il ne répond pas aux requêtes d'administration) ni les tools additionnels qui vont bien (ntpq par exemple). Source : NTP client/ NTP server sur le Wiki OpenWRT. Comme je souhaite conserver l'implé ntpd "classique" de l'université du Delaware (pour la possibilité de monitoring / de jouer avec ntpq principalement et aussi car c'est une valeur sûre à mes yeux depuis le temps que je l'utilise), je désactive le support NTP de Busybox dans base system -> busybox -> Networking utilities

On lance la compilation avec la méthode habituelle :

sed -i 's,^.*=m,# & is not set,g' .config
make -j9

La compilation va planter sur OpenSSL (qui est activé et compilé par dépendance pour ntpd, même si vous n'avez pas coché le support ntpd-ssl, mais qui ne sera pas intégré à l'image finale semble-t-il) :

make[6]: Entering directory `/media/montmpfs/attitude_adjustment/build_dir/target-mipsel_uClibc-0.9.33.2/openssl-1.0.1e/crypto/sha'
ccache_cc -I.. -I../.. -I../modes -I../asn1 -I../evp -I../../include  -fPIC -DOPENSSL_PIC -DZLIB_SHARED -DZLIB -DDSO_DLFCN -DHAVE_DLFCN_H -I/media/montmpfs/attitude_adjustment/staging_dir/target-mipsel_uClibc-0.9.33.2/usr/include -I/media/montmpfs/attitude_adjustment/staging_dir/target-mipsel_uClibc-0.9.33.2/include -I/media/montmpfs/attitude_adjustment/staging_dir/toolchain-mipsel_gcc-4.6-linaro_uClibc-0.9.33.2/usr/include -I/media/montmpfs/attitude_adjustment/staging_dir/toolchain-mipsel_gcc-4.6-linaro_uClibc-0.9.33.2/include -DOPENSSL_SMALL_FOOTPRINT -DHAVE_CRYPTODEV -DOPENSSL_NO_ERR -DTERMIO -fhonour-copts -Wno-error=unused-but-set-variable -msoft-float -fpic -fomit-frame-pointer -Wall -DSHA1_ASM -DSHA256_ASM -DAES_ASM -c   -c -o sha256-mips.o sha256-mips.S
sha256-mips.S: Assembler messages:
sha256-mips.S:1960: Error: opcode not supported on this processor: mips1 (mips1) `bnel $5,$23,.Loop'
make[6]: *** [sha256-mips.o] Error 1

La solution est donné sur la ML OpenSSL-dev : sha256-mips.S:1960: Error: opcode not supported on this processor: mips1 (mips1) `bnel $5,$23,.Loop'. La correction se fait comme suit :

sed -i 's/bnel/bne/' ./build_dir/target-mipsel_uClibc-0.9.33.2/openssl-1.0.1e/crypto/sha/asm/sha512-mips.pl

Le reste du billet Créez votre image personnalisée d’OpenWRT : ce qui change avec Backfire 10.03.1 (modifier les options du noyau, modifier les options de busybox, configurer les logiciels, ...) est encore valable donc je ne le reprends pas ici.

On constate que l'image de base occupe 3,2M au lieu de 3M pour une image Backfire 10.03.1 et que mon image personnalisée occupe 3,5M contre 3,2M à l'époque Backfire. Cela signifie que l'on s'approche de plus en plus de la limite de stockage d'un WRT54GL, qui, si la taille de l'image continue à augmenter, ne pourra plus accueillir de logiciels supplémentaires (comme etherwake, dnscache, ...) ...