Adsuck pour remplacer privoxy

Sur les trois machines clientes chez moi (dont deux avec l’OS à la pomme et de browsers douteux), filtrer les pubs du web au niveau du réseau tout entier est vital, puis il m’arrive de tester des browsers autres que firefox (dans le genre webkit-gtk/bindings vim) et là adblock ne m’est d’aucuns secours.

Pendant un temps j’utilisais privoxy sur mon routeur OpenBSD, mais je lui ai trouvé plusieurs defauts :

  • Les regexp de base sont très éfficaces mais il y a malheureusement beaucoup de faux positifs.
  • Le temps de traitement amène une lenteur parfois perceptible.
  • Je l’avais en proxy transparent, donc y’a toujours quelqu’un au bout du ‘telnet machin 80’ (ça peut être génant)
  • Configuration et maintenance pas franchement agréable.

Du coup en reinstallant le routeur j’ai cherché une alternative, et j’ai trouvé adsuck. C’est du filtrage dns, assez violent mais beaucoup plus rapide et tout aussi éfficace.

Pour le moment ce soft est codé par et pour OpenBSD, mais ça doit pas être méchant à compiler sur autre chose.

L’install :

# export PKG_PATH=ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/packages/i386/
# pkg_add adsuck
# cat >> /etc/rc.local << EOF
if [ "" != "NO" -a -x /usr/local/sbin/adsuck ]; then
echo -n ' adsuck'; /usr/local/sbin/adsuck $adsuck_flags
fi
EOF
# cat >> /etc/rc.conf.local << EOF
adsuck_flags="-c /var/adsuck -l 127.0.0.1 -p 54 -f /files/resolv.conf /files/hosts.small /files/Hosts.pub /files/local.pub"
EOF

Comme j’ai un vrai serveur DNS (pour le réseau local mais aussi pour mes domaines), j’ai lancé adsuck sur le port 54 (dns normal c’est 53) et fait une redirection pour le réseau local avec pf, adsuck va lui même servir de proxy entre le réseau local et le serveur DNS qui tourne sur localhost en particulier.

# echo "nameserver 127.0.0.1" > /var/adsuck/files/resolv.conf
# touch /var/adsuck/files/local.pub

On lance une première fois :

# adsuck -c /var/adsuck -l 127.0.0.1 -p 54 -f /files/resolv.conf /files/hosts.small /files/Hosts.pub /files/local.pub

Si ça se lance, on peut rediriger le traffic du réseau local vers adsuck :

table <local> const { 192.168.0.0/24 }
rdr pass on $ext_if proto udp from <local> to $ext_if port domain -> lo0 port 54
# Si vous êtes vraiment méchant vous pouvez enlever le 2ème $ext_if :)

Maintenant sur une machine du réseau local :

% host www.smartadserver.com dns1.proxad.net
www.smartadserver.com has address 91.103.138.65
% host www.smartadserver.com
Host www.smartadserver.com not found: 3(NXDOMAIN)

Et vous voilà avec un net plus très neutre mais épuré de toute publicité. Pour rajouter des sites, je vous ai fait créer un /var/adsuck/files/local.pub, la syntaxe est simple :

127.0.0.1 domaine_moisi.com

Et pour faire relire les listes à adsuck :

# kill -USR1 `pgrep adsuck`