DNS local et filtrage DNS tout simplement

Il est très simple de mettre en place un petit DNS local dans un environnement domestique (ou professionnel de petite taille). Les avantages peuvent être nombreux : accélérer (un peu) la connexion à internet en gardant en cache les résultats des requêtes DNS les plus fréquentes (soyons toutefois réalistes, le gain restera modeste), attribuer des noms résolus à chacun de vos périphériques et... bloquer certains sites par filtrage DNS .

Le filtrage DNS a l'avantage de concerner tous les périphériques connectés au réseau et d'interdire également la connexion en HTTPS aux sites choisis, ce que le filtrage simple par URL ne permet pas en HTTPS. Ce type de filtrage pourra être pratique pour interdire l'accès à certains sites et couper certains serveurs de publicité. Il existe également des listes de sites aux contenus choquants en libre accès sur le net (souvent générées pour SquidGuard) que l'on pourra également réutiliser. Un utilisateur pourra bien sûr contourner ce filtrage en spécifiant des serveurs DNS différents ou en utilisant un proxy ou tunnel de son choix.

Pour la mise en place du filtrage DNS, déployons le logiciel dnsmasq qui est à la fois un serveur DHCP et un serveur DNS. Bien sûr, la fonction DHCP peut-être désactivée si elle est déjà réalisée par un autre service sur le réseau. Toutefois, notons que dnsmasq ne pourra alors pas automatiquement inclure dans les DNS les entrées correspondantes aux noms d'hôte des périphériques connectés (et auxquels une adresse a été attribuée par DHCP).

DNSMasq

Commençons par installer dnsmasq avec le sélecteur de paquet de son choix - l'exemple ci-dessous est valable pour Debian ou les distributions dérivées : aptitude install dnsmasq

Nous allons ensuite paramétrer le service dans /etc/dnsmasq.conf :

Paramétrage du DNS

  • Par défaut, dnsmasq cherche à effectuer la résolution de nom en consultant les associations du fichier /etc/hosts et en relayant les requêtes aux serveurs DNS spécifiés dans /etc/resolv.conf (ces 2 fichiers se trouvant sur la machine hébergeant dnsmasq). Si ce comportement ne vous sied pas, il est possible de commander à dnsmasq de ne pas prendre en compte ces fichiers (toute la configuration sera donc faite dans /etc/dnsmasq.conf)
no-resolv
no-hosts
  • On précise ensuite l'adresse des serveurs DNS à qui il faut relayer toute requête que dnsmasq n'aura pas su résoudre en local :
server=8.8.8.8
server=8.8.4.4
  • On ajoute ensuite les entrées spécifiques que l'on souhaite voir résolues par dnsmasq :
address=/site-interdit.com/192.168.1.1
address=/autre-site-interdit.biz/192.168.1.1

Les 2 sites mentionnés seront donc résolus vers 192.168.1.1. On peut imaginer que 192.168.1.1 héberge un serveur web qui affichera une page signalant à l'utilisateur le blocage.

  • Pour activer le cache DNS, on prendra le soin d'ajouter la ligne :
cache-size=500

500 requêtes sont donc toujours conservées en mémoire par dnsmasq. A modifier à votre volonté selon la RAM disponible et le nombre de requêtes reçues...

  • Et pour activer les logs et garder une trace de toutes les requêtes DNS reçues (par exemple pour analyser l'utilisation du cache et son optimisation) :
log-facility=/var/log/dnsmasq.log
log-queries

Paramétrage du DHCP

  • Voici maintenant le paramétrage du DHCP si l'on décide d'utiliser cette fonctionnalité. On commencera par définir les adresses que le serveur peut allouer ainsi que la durée de renouvellement :
dhcp-range=192.168.1.5,192.168.1.199,255.255.255.0,12h
  • On pourra ensuite ajouter des adresses fixes pour certains hôtes reconnus par leur adresse MAC :
dhcp-host=00:00:ab:cd:ef:12,ordinateur1,192.168.1.5
dhcp-host=00:00:ab:cd:ef:34,ordinateur2,192.168.1.6
  • Le serveur DHCP peut également communiquer à tous les clients l'adresse de la passerelle vers internet :
dhcp-option=option:router,192.168.a.b

Pour expliquer à tous les clients d'utiliser dnsmasq comme seul serveur DNS, on ajoutera finalement :

dhcp-option=6,192.168.c.d

en remplaçant bien sûr 192.168.c.d par l'adresse à laquelle dnsmasq répondra !

  • Last but not least, il faut bien sûr que le serveur DNS soit accessible. Donc il faudra faire le nécessaire pour que le pare-feu accepte les communications entrantes et sortantes sur le port 53. Si le pare-feu est iptables, voilà qui devrait faire l'affaire :
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

Voilà votre petit serveur DHCP et DNS accessible sur votre réseau local avec les éventuels raccourcis ou filtrages de vos choix !