Bloquer les publicités et traqueurs au niveau du DNS avec Unbound

Hormis les plugins bloqueurs de publicités comme Ublock Origin au niveau du navigateur, il est aussi possible d’agir au niveau DNS. Je pense que les 2 méthodes sont complémentaires. Le blocage au niveau du DNS permet d’agir sur tout les ordinateurs l’utilisant (par exemple tous les ordinateurs de votre réseau local). C’est à dire que le blocage va fonctionner aussi sur les iMachines, iTéléphones et Androphones plutot réticents à ce que vous bloquiez les publicités qui rapportent des brouzoufs à leur éditeurs.

Si vous avez un DNS local tel que Unbound, c’est très simple à mettre en place. L’idée est télécharger une liste de domaines connus pour fournir uniquement de la publicité ou des traqueurs et de mentir sur leur adresse IP. Votre DNS va dire que ces domaines sont inaccessibles.

On commence par télécharger la liste de domaines à bloquer sur le site de StevenBlack et la convertir au format Unbound :
# cd /etc/unbound/unbound.conf.d
# wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | grep '^0\.0\.0\.0' | grep -v '^0\.0\.0\.0 0\.0\.0\.0' | awk '{print "local-zone: \""$2"\" redirect\nlocal-data: \""$2" A 0.0.0.0\"\nlocal-data: \""$2" AAAA ::\""}' > adslist

On ajoute la prise en charge de cette liste de domaines à bloquer dans notre fichier de configuration d’Unbound :
#Ads blocking
include: "/etc/unbound/unbound.conf.d/adslist"

On redémarre le service:
# systemctl start unbound

Et voila, simple !

J’ai fait pour vous un petit test sur le site web http://www.jeuxvideo.com/

C’est assez parlant ;-)

Sans bloquage au niveau du DNS (temps de chargement 10 secondes):

sans-dns-block

Après bloquage au niveau du DNS (temps de chargement 1 seconde):

avec-dns-block

Je vous invite à suivre mon tutorial pour installer Unbound sur Debian. Ca vous permet également d’accéder à tout le web et échapper à la censure par bloquage DNS.

34 réactions sur “ Bloquer les publicités et traqueurs au niveau du DNS avec Unbound ”

  1. Chris

    Merci pour le tuto, actuellement j’ai la même chose avec pi Hole et ça va plutôt bien, je ne connaissais pas unbound :-)

  2. Matlink

    Joli tuto, bien pratique.
    Ça m’a l’air moins simple sur Bind9 malheureusement (faut créer des zones et tout).
    Mais effectivement c’est pratique quand t’as des appareils sur lesquels tu ne peux pas mettre d’adblocker (genre ceux qui sont pas rootés).

  3. bunam

    ok pour les ordis ça peut être bien, je vais essayer…

    sinon pour iOS il existe des bloqueurs de contenu, j’en utilise 2 :
    Focus
    Refine

    Dans l’os c’est fait de telle manière que ceux-ci n’on pas accès à ma navigation, ils ont juste le droit de fournir la liste des trucs a bloquer.

    Aussi on peut les désactiver temporairement quand certains sites le demandent ;p en appuyant longtemps sur le bouton « recharger la page » un menu apparaît : « Recharger sans les blogueurs de contenu ».

    Quoi qu’on en dise, Apple défend le mieux qu’elle puisse ces clients…

  4. azawa

    pourquoi utiliser le fichier adslist_tmp ?
    on peut raccourcir la commande en :

    wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | grep '^0\.0\.0\.0' | awk '{print "local-zone: \""$2"\" redirect\nlocal-data: \""$2" A 0.0.0.0\""}' > adslist

  5. Tuxicoman

    @Chris : C’est en lisant par hasard un article sur PiHole que je me suis dit « Hey, c’est pas mal. Je dois pouvoir faire ca aussi même sans raspberry » :-)

  6. greg

    merci,
    ca marche au top
    pour ceux qui utilisent dnsmasq :
    dans dnsmasq.conf ajouter :
    addn-hosts=/etc/dnsmasq.hosts (pensez a adapter le chemin a votre conf)

    wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts –no-check-certificate > /etc/dnsmasq.hosts (problème de certificat ???)

    le format est déjà tout bon :-)
    un petit restart du service dnsmasq
    et enjoy!

  7. cool

    moi j’ai pas bien compris, si j’installe Unbound, ça va l’installer sur le pc X où je fais la manip non? Donc si admettons je n’est pas de bloqueur de pub installé sur mes autres machines (droid, autres pc), et que la machine X avec Unbound est éteinte, j’aurais de la pub sur mes autres machines? ça fait que mes autres machines serait dépendante de la machine X?

    Merci bien

    Au passage, je suis d’accord sur « Quoi qu’on en dise, Apple défend le mieux qu’elle puisse ces clients… ». Mais bon c’est peut être juste pour bien continuer à les enfler… Ils réinvente la roue tout les 6 mois et tout le monde trouve ça formidable.

  8. Tuxicoman

    Je n’ai pas bien compris ton commentaire. Tu peux te documenter sur DHCP pour mieux comprendre quel DNS est utilisé sur les machines de ton reseau.
    Et oui, si ton serveur/relay DNS est eteint, il faudra bien en fournir un autre à tes machines si tu veux qu’elles resolvent les noms de domaines.

  9. Tuxicoman

    Quand à Apple, ils protegent surtout leur business (pas de concurrence sur l’app store ni le materiel). Ce qui fait du sens. Le hasard fait que contrairement à facebook, google et maintenant microsoft, leur business model n’est (pas encore) axé sur les données personelles.

  10. Antoine

    Merci pour l’astuce. J’utilise déjà unbound comme DNS local et ça fonctionne. Par contre, j’ai un petit souci quand j’applique ton tuto.
    Je récupère bien le fichier adslist formaté pour unbound dans /etc/unbound/unbound.conf.d :
    local-zone: « exemple.com » redirect
    local-data: « exemple.com A 0.0.0.0 »

    Par contre, si j’insère la ligne
    include: « /etc/unbound/unbound.conf.d/adslist »
    à la fin de mon fichier unbound.conf dans /etc/unbound, j’ai un problème après redémarrage du service. Mon navigateur me renvoie alors une erreur d’adresse introuvable à toute tentative de connexion. Si je commente la ligne, je n’ai aucun souci de connexion.

    Une idée ? Merci

  11. Antoine

    @Tuxicoman : oui oui «  », erreur copier/coller dans mon commentaire précédent

  12. cool

    Merci bien de ta réponse, je vais me renseigner sur tout ça. Et pour la Pomme, étant fervent adepte de linux et du monde du libre que je trouve admirable, je ne peux pas m’empêcher de dire quelque chose…

  13. David_5.1

    Sinon, sed, c’est bon, mangez-en ;-D (Pour curl ou wget, je ne suis pas capable de dire s’il y a des raisons d’utiliser un plutôt que l’autre…)
    curl https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | sed -ne ‘s/^\(0\.0\.0\.0\) \([^ ]*\)/local-zone: « \2 » redirect\nlocal-data: « \2 A 0.0.0.0\ »/p’ – > adslist

    Ça évite d’appeler grep pour rien.

    On peut aussi faire la même chose avec awk :
    wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | awk ‘/^0\.0\.0\.0/{print « local-zone: \ » »$2″\ » redirect\nlocal-data: \ » »$2″ A 0.0.0.0\ » »}’ > adslist

    @Antoine : En fait, il faut ajouter « server: » au début du fichier pour que ça marche chez moi (Debian Jessie, unbound 1.4.22), par exemple en faisant un script (car directement en crontab, c’est lourd…) :
    #!/bin/sh

    (
    echo « server: »
    curl -s « https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts » |
    sed -ne ‘s/^\(0\.0\.0\.0\) \([^ ]*\)/local-zone: « \2 » redirect\nlocal-data: « \2 A 0.0.0.0\ »/p’ –
    ) > /etc/unbound/unbound.conf.d/adsfilter
    /bin/systemctl restart unbound.service

    Voilà !

    Et merci pour la bonne idée, je n’avais que du filtrage dans mon navigateur pour le moment (uMatrix + uBlock origin).

  14. bougie

    Il faut mettre la ligne include dans la section « server ».

  15. Antoine

    @David_5.1 : merci ça fonctionne avec « server: » au début du fichier adslist
    @Tuxicoman : en fait les guillemets sont modifiés entre la saisie du texte dans la zone « Comment: » et le texte affiché sur le site après ajout du commentaire.

  16. Pat

    Bonjour,
    Dans ma configuration je n’autorise que mon localhost ainsi :
    interface: 127.0.0.1
    et j’ai comme Antoine le même problème lorsque je veux ajouter cette liste, et que je relance unbound j’ai ceci dans mes logs :
    Failed to start (null).
    Dependency failed for Host and Network Name Lookups.
    Unit unbound.service entered failed state.

    Esce que c’est du faite que le redirect est pour le Ads pointe vers 0.0.0.0 car celui ci dans mon fichier conf unbound est en mode « refuse »

    bien à vous

  17. Pat

    RE,
    en utilisant unbound-checkconf j’ai pu voir que c’était une erreur concernant la duplication de Ads car j’avais laisser quelques unes des adresses encore dans mon fichier .conf, donc fausse alerte !! ça fonctionne.
    encore merci pour le tuto @++

  18. Tuxicoman

    Pour faire la même chose en local sur ta machine? Je ne pense pas qu’on puisse inclure de fichier dans le /etc/hosts donc ce serait pénible à maintenir. Installe unbound en local sur ta machine et voilà !

  19. Anonyme

    Hello,
    mon fichier adlist est dans : /etc/unbound/unbound.conf.d/

    J’avais pour la mise à jour manuel fait un petit fichier update.sh dans le même répertoire comme ça :

    ###
    #!/bin/bash

    echo « Supprimer adslist ? »
    read
    rm /etc/unbound/unbound.conf.d/adslist
    echo  » adlist supprimé !!! »
    sleep 2

    echo « Mise à jour de la nouvelle liste ? »
    read
    wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | grep ‘^0\.0\.0\.0’ | awk ‘{print « local-zone: \ » »$2″\ » redirect\nlocal-data: \ » »$2″ A 0.0.0.0\ » »}’ > adslist
    echo « Téléchargement de la liste avec succès !!! »
    sleep 2

    echo « Redémarrage Unbound serveur ? »
    read
    /etc/init.d/unbound restart
    echo « Unbound a redémarré correctement !!! »
    sleep 2

    echo quittez ?
    read

    echo « Bye »
    exit 0
    ##############
    un petit chmod +x update.sh ensuite
    ./update.sh et faire « enter » pour chaque étape !

    biensur si c’est pour le mettre dans CRON en automatique il faut alors dans le scripts laisser que les commandes rm fichier adlist, le wget complèt et le restart de unbound dans le fichier sh et ensuite mettre /etc/unbound/unbound.conf.d/update.sh dans CRON a la suite du choix d’execution de la commande !!

    @+

  20. Ping Comment bloquer les publicités avec un Raspberry Pi

  21. Tuxicoman

    C’est complémentaire, dans les cas où tu ne peux pas installer ublock dans le logiciel qui diffuse la pub.

  22. Michel

    J’ai installé Unbound, le fichier adslist et inséré include dans le fichier de configuration. Le status et drill me disent qu’Unbound tourne correctement, mais rien ne dit s’il utilise effectivement adslist. Y a-t-il un moyen de voir ce qu’il fait?
    Merci

  23. mickel64

    j’ai cette alerte
    Connexion à raw.githubusercontent.com (raw.githubusercontent.com)|151.101.192.133|:443… connecté.
    Erreur : le certificat de « raw.githubusercontent.com » n’est pas de confiance.
    une petite explication ??

  24. Shlublu

    Super. J’utilisais une liste plus réduite (celle de yoyo, au format conf Unbound) jusqu’à présent. Mais ce que tu proposes est bien meilleur ! Merci beaucoup, ainsi qu’à Steven Black !

  25. Shlublu

    Ah, j’ai juste fait une petite modif à ton script, pour supprimer les deux premières lignes de adslist et qui mappent inutilement 0.0.0.0 sur 0.0.0.0.

    Il suffit de remplacer:
    grep ‘^0\.0\.0\.0’

    par:
    grep ‘^0\.0\.0\.0’ | grep -v ‘^0\.0\.0\.0 0\.0\.0\.0’

    Merci encore!

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.