Filtrer via Unbound les pubs et autres

Filtrer via Unbound les pubs et autres

Au début, je ne voulais pas filtrer les sites inadaptés et autres publicités sur le réseau familial, mais le temps passant, les enfants grandissant, il a fallu se rendre à l’évidence : c’est un mal pour un bien, car les accidents sont vites arrivés, la dépendance à l’écran s’installer vite.

Du coup, je me suis lancé dans la mise en place de différents moyens de filtrage (simples et bien évidemment contournables[1], mais suffisant pour le quotidien familial :

  1. le contrôle parental sur l’ordinateur familial (pour limiter les temps d’utilisation),
  2. un proxy filtrant en mode transparent (pour bloquer les contenus violents)
  3. un serveur DNS menteur (pour arrêter les publicités et autres contenus intrusifs).

Cette note porte sur ce dernier dispositif. Les serveurs DNS de la maison tournent sur 2 machines :

  • un routeur/pare-feu open source sous pfSense
  • un serveur de synchronisation de fichiers sous Debian

Comme aucun domaine n’est géré sur ces serveurs, j’utilise unbound pour rendre le service.

Pour cela, j’utilise un script chargé de récupérer la liste noire fournie par Yoyo et l’organise dans un format adapté pour unbound.

Ce script est lancé régulièrement pour mettre à jour la liste noire.

Voici la mise en oeuvre pour pfSense et Debian

pfSense

installation du script

Dans le répertoire /usr/local/etc/unbound, créer le fichier update_adservers.sh avec le contenu suivant :

    #!/bin/sh
    #
    # Convert the Yoyo.org anti-ad server listing
    # into an unbound dns spoof redirection list.

    curl -o yoyo_ad_servers "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&mimetype=plaintext" && \
    cat yoyo_ad_servers | grep 127 | awk '{print $2}' | \
    while read line ; \
        do \
            echo "local-zone: \"$line\" redirect" ;\
             echo "local-data: \"$line A 127.0.0.1\"" ;\
        done > \
        /var/unbound/conf.d/ad_servers.conf
    rm -f yoyo_ad_servers

crontab

La mise à jour de la liste noire se fait via cron, en ajoutant la ligne suivante au fichier /etc/crontab :

    22      16      *       *       *       root    /usr/local/etc/unbound/update_adservers.sh

Puis on relance le démon crond:

    > /usr/local/etc/rc.d/cron.sh restart

configuration unbound

Pour unbound, on ajoute la ligne suivante au fichier de configuration /var/unbound/unbound.conf :

    include: /var/unbound/conf.d/ad_servers.conf

Enfin, on relance unbound après avoir créé la liste noire :

    > /usr/local/etc/unbound/update_adservers.sh
    > ps ax | awk '/sbin\/unbound/ { print "kill -HUP " $1 }'| sh

vérification

Une petite vérification avant de configurer le serveur sous Debian :

dig @10.0.0.1 +nocomments +nostats ad.musicmatch.com

; <<>> DiG 9.8.3-P1 <<>> @10.0.0.1 +nocomments +nostats ad.musicmatch.com
; (1 server found)
;; global options: +cmd
;ad.musicmatch.com.     IN  A
ad.musicmatch.com.  3600    IN  A   127.0.0.1

On obtient bien 127.0.0.1, on a bien empoisonné la réponse spoofing.

Debian

installation du script

Créer un répertoire pour les scripts :

    mkdir /etc/unbound/scripts

Dans le répertoire fraichement créé, mettre le contenu suivant dans le fichier update_adservers.sh :

    #!/bin/sh
    #
    # Convert the Yoyo.org anti-ad server listing
    # into an unbound dns spoof redirection list.

    curl -o yoyo_ad_servers "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&mimetype=plaintext" && \
    cat yoyo_ad_servers | grep 127 | awk '{print $2}' | \
    while read line ; \
        do \
            echo "local-zone: \"$line\" redirect" ;\
             echo "local-data: \"$line A 127.0.0.1\"" ;\
        done > \
    /etc/unbound/ad_servers.conf
    rm -f yoyo_ad_servers

Puis, positionner les droits d’exécution :

    > chmod a+x update_adservers

crontab

Pour mettre à jour, la liste noire des serveurs à bloquer, on va mettre dans le fichier /etc/crontab, une ligne exécutant régulièrement le script précédemment installé :

    23 16   * * *   root    /etc/unbound/scripts/update_adservers.sh

configuration unbound

Enfin pour unbound, on ajoute la ligne suivante au fichier de configuration /etc/unbound/unbound.conf

    include: /etc/unbound/ad_servers.conf

yapluka !

Maintenant, on relance unbound :

    > sudo service unbound reload

et le tour… ha non, il manque encore un truc : demander à cron de prendre en compte les modifications que l’on a faites dans /etc/crontab :

    > sudo service cron reload

Et voilà.

[1]: d’ailleurs quand les enfants comprendront les techniques de ce billet, ils seront capables de le faire. #mémo #debian #freebsd #dns #pfsense