Filtrer les publicités et autres indésirables avec DNS

Un article intéressant de GreenIT.fr 1 m’a rappelé un moyen simple de se débarrasser de la publicité en modifiant le fichier hosts de son poste de travail.

Ne voulant pas faire le travail pour rien je me suis mis en quête du moyen de le faire au niveau du serveur DNS de mon LAN, de manière à en faire profiter toutes les machines.

[EDIT 10/05/2020] Le logiciel Pi-Hole 2qui est d’un an antérieur à cet article et que je ne connaissais pas est maintenant populaire et utilise ces principes et dnsmasq pour faire ce travail. Tout packagé, avec une interface web, des stats, maintenu et avec les sources sur github, c’est la solution qu’il faut prendre !

Bien sûr quelqu’un (Zaur Molotnikov) a déjà fait le boulot, avec le script angry hosts 3 , dérivé du travail de Steven Black 4 , en compilant un fichier hosts et en modifiant dnsmasq.conf pour prendre en compte aussi les sous-domaines des domaines listés dans les listes.

Les explications et le travail sont très intéressants et à consulter, mais angry hosts a néanmoins quelques inconvénients qui seront peut-être résolus plus tard :

  • le script est interactif : il faudrait le modifier pour pouvoir faire ses mises à jour en batch
  • beaucoup de listes en entrée, non paramétrables. Je préfère l’approche de Steven Black.
  • inquiétude sur le suivi du code dans le temps et les apports d’une communauté.

Du coup je vais réutiliser le script de Steven Black et adapter la config de dnsmasq pour faire profiter l’ensemble du réseau local de cette fonctionnalité.

Principe

tux dnsmasqLe principe du filtrage est d’utiliser le serveur DNS du LAN pour résoudre les noms DNS indésirables avec l’adresse IP non routable 0.0.0.0 ou l’adresse local 127.0.0.1 .

Pour l’utiliser sur l’ensemble du réseau local, on va utiliser le serveur dnsmasq, disponible sur tout bon petit routeur opensource qui se respecte, et qui utilise comme référence un ou des fichiers au format du fichier hosts.

Il n’est pas envisageable de maintenir seul la liste des indésirables. Heureusement plusieurs listes sont disponibles sur Internet, pour différentes catégories de sites (pub, malware, porn etc.).

Le script updateHostsFile.py permet de faire la sélection des sources, qui vont être téléchargées. Son utilisation en local (plutôt que l’utilisation d’une source) donne un peu plus de sécurité car il génère le fichier hosts au bon format, ce qui est préférable (il ne faudrait pas qu’une liste soit modifiée et nous fasse prendre un site malveillant pour celui de notre banque…).

Il suffit de faire cette mise à jour de manière régulière et le tour est joué.

Ma config de dnsmasq

3 fichiers de configuration

  • /etc/hosts : celui de la machine (minimal)
  • /etc/hosts.dnsmasq/hosts.lan : pour les machines déclarées de manière statique pour le LAN – à maintenir à la main
  • /etc/hosts.dnsmasq/hosts.banned : autre liste d’indésirable, à maintenir à la main
  • /etc/hosts.dnsmasq/hosts : généré par le script (indésirables)

Récupération du script et installation dans /opt/hosts :

# cd /opt
# git clone --depth 1 https://github.com/StevenBlack/hosts.git hosts

Config /etc/dnsmasq.conf : ajouter les lignes suivantes

addn-hosts=/etc/hosts.dnsmasq/hosts.lan
addn-hosts=/etc/hosts.dnsmasq/hosts
addn-hosts=/etc/hosts.dnsmasq/hosts.banned

Pour mettre à jour la liste d’indésirables

Lancement du script :

# python /opt/hosts/updateHostsFile.py --auto --ip 127.0.0.1 --output /etc/hosts.dnsmasq --skipstatichosts --extensions gambling porn

Prise en compte des nouveaux fichiers par dnsmasq :

# kill -1 `cat /var/run/dnsmasq/dnsmasq.pid`

Pour parfaire le tout on peut mettre en crontab de root le script, et aussi vérifier de temps en temps s’il y a des mise à jour du script.

tux ideaTo Do List

  1. Si nécessaire de récupérer d’autres listes il y a moyen d’écrire (facile) une extension pour updateHostFile.py
  2. Reprendre dans le script  angry hosts la génération des enregistrements pour dnsmasq.conf (gestion des sous-domaines)
  3. Voir l’opportunité de mettre en place  DNSSEC et/ou DNSCrypt .

Références

  1. le principe : Web : éliminer définitivement les publicités
  2. Pi-Hole (github) est la solution packagée qui fait tout ça bien mieux et s’appuie du reste sur la liste de StevenBlack
  3. angryhost : Making the Angry Hosts File Stronger with dnsmasq
  4. hosts de StevenBlack : listes d’indésirables réputées fiables, avec le script qui permet de les mettre à jour et les compiler