Créer son propre serveur DNS avec un Raspberry Pi

Pour que les ordinateurs communiquent entre eux sur Internet, chacun des participants a besoin d’une adresse unique : grâce aux adresses IP, les clients savent exactement à quel serveur ils doivent s’adresser. Mais aucun utilisateur ne remarque les chiffres de ces adresses, seulement les noms de domaine. C’est à ceci que servent les Domain Name Systems (DNS). Permettant de convertir les adresses en chiffres et inversement. Les clients doivent ainsi envoyer leurs requêtes à un ou plusieurs serveurs DNS, avant d’obtenir la bonne adresse. Mais ceci prend parfois beaucoup de temps. Il peut donc être utile d’optimiser sa connexion Internet en installant un serveur DNS dédié. Pour ce faire, le Raspberry Pi, un ordinateur petit mais polyvalent, constitue une bonne base. Voici comment fonctionne un DNS et comment créer le sien.

Qu’est-ce au juste qu’un DNS ?

Un domain name system vous aide à trouver votre chemin au sein du réseau basé sur des adresses IP. Dans la ligne d’adresse de votre navigateur, entrez un domaine banal, comme www.exemple.org. Pour communiquer sur Internet, les ordinateurs ont besoin d’adresses Ipv4 ou IPv6. Pour que les communications fonctionnent, il est nécessaire que le nom de domaine reconnaissable soit modifié. C’est ici qu’entre en jeu la résolution des noms de domaines. Pour ce faire, le navigateur doit pouvoir accéder à un cache. Il est possible que l’adresse soit déjà connue du système et n’ait pas à être vérifiée du tout.

Si ce n’est pas le cas, la requête est transmise à un ou plusieurs autres serveurs DNS. Il est d’abord question du serveur DNS du fournisseur d’accès à Internet. Celui-ci aligne la requête dans sa banque de données et, idéalement, livre un résultat. S’il ne trouve aucune entrée pour le domaine, la requête est automatiquement envoyée à l’un des 13 serveurs racine sur Internet, où sont enregistrées toutes les adresses du Web.

En collaboration avec le DNS, il faut aussi noter que la plupart des acteurs d’Internet, en particulier les clients des utilisateurs classiques, ne disposent pas d’une adresse IP fixe. Les fournisseurs d’accès à Internet assignent des adresses IP au sein de leur réseau pour 24h. Après ceci, il s’opère une très courte séparation forcée, à la suite de laquelle il est assigné une nouvelle adresse IP à l’utilisateur. Ce n’est généralement pas un problème, parce que les clients ne sont sollicités que rarement par un acteur extérieur au réseau local ; ils envoient les requêtes au serveur, pas l’inverse.

Pour certaines applications, comme les bureaux à distance ou les petits serveurs de jeu, il est toutefois nécessaire d’installer un serveur séparé. Dans ce cas, il est recommandé d’utiliser un DNS dynamique. Grâce à un DDNS, le serveur domestique se voit assigner un domaine grâce auquel il est accessible. Si vous souhaitez héberger vous-mêmes un serveur DNS en dehors de votre réseau local, il peut être intéressant d’envisager un DynDNS.

Qu’apporte un serveur DNS ?

Pour des raisons très diverses, certains utilisateurs préfèrent passer par leur propre serveur DNS au lieu de chercher les adresses IP. Il est donc judicieux d’installer un serveur indépendant si le réseau est composé de plusieurs appareils et utilisé par plusieurs personnes, par exemple s’il s’agit une grande famille, d’une colocation, ou dans le cas d’un petit bureau. 

  • Vitesse : une requête Web, dans le cas où il n’y a pas de cache, passe par plusieurs routeurs et serveurs, jusqu’à ce que le contenu Web arrive à l’utilisateur. Bien que ces temps d’attente soient en général de l’ordre de millisecondes, le processus peut être accéléré même s’il n’est pas nécessaire d’établir une connexion avec le serveur DNS du fournisseur d’accès.
  • Sphère privée : pour que le domain name system fonctionne, les requêtes doivent être transmises à des serveurs étrangers. Ceci laisse des indices sur Internet, que certains des utilisateurs souhaiteraient effacer. Avec un serveur DNS propre, les données restent privées.
  • Sécurité : lorsque vous hébergez votre propre serveur DNS, vous en contrôlez les entrées.  Les cybercriminels cherchent en général à intercepter les requêtes DNS du fournisseur d’accès Internet et lui fournir une fausse adresse IP. Au lieu du site Web souhaité, vous tombez sur un autre qui lui ressemble. Ceci se pratique particulièrement pour les services de banque en ligne : les données sensibles sont copiées sur un site qui ressemble exactement à l’original, et les pirates s’en servent pour piller les réserves financières. 
  • Filtre de publicité : les bloqueurs de publicité ont accès à une liste de serveurs Web qui doit être verrouillée. Ceci peut se faire au moyen d’un serveur DNS créé soi-même. De cette façon, vous pouvez protéger tous les appareils de votre réseau domestique contre la publicité, sans pour autant avoir à installer un programme supplémentaire sur chaque appareil.
  • Protection enfants : ce qui fonctionne pour la publicité est aussi valable pour la protection des enfants. Les serveurs avec du contenu problématique pour les enfants peuvent facilement être bloqués grâce à un DNS auto-installé.
  • Effet d‘apprentissage : de nombreux utilisateurs installent leur propre serveur DNS simplement pour mieux comprendre le champ de fonctionnalités d’internet. Si l’électricité vient de la prise, le site Web vient du navigateur : si l’on souhaite comprendre les spécificités techniques à l’œuvre en coulisses, rien de plus efficace qu’un projet à faire soi-même. Il en existe de nombreux à faire avec un Raspberry Pi.

Installer un serveur DNS avec Raspberry Pi

Si vous souhaitez installer un serveur DNS sur votre Raspberry Pi, vous aurez besoin, outre du mini-ordinateur, des éléments suivants :

  • Une carte SD sur laquelle est installé Rasbian
  • Une connexion Ethernet sur un routeur Internet
  • Une alimentation électrique par câble micro USB
  • Un client SSH (par exemple PuTTY)

À titre d’exemple, prenons BIND comme base pour installer un DNS sur Raspberry Pi. BIND est un logiciel open-source qui revient à l’Internet Name Domain Server de Berkeley. Le programme est aujourd’hui disponible dans sa neuvième version, et continue d’être développé par l’Internet Software Consortium (ISC).

Il s’agit ensuite de s’assurer que le Raspberry Pi se voit attribuer une adresse IP statique au sein du réseau local. Pour ce faire, il faut ouvrir la configuration réseau ainsi :

sudo nano /etc/network/interfaces

Indiquez ensuite une adresse IP unique au Raspberry Pi.

Conseil :

Nano est un éditeur Linux simple, qu’il est indispensable d’installer sur votre Raspberry Pi.

Il est désormais temps d’installer BIND. Il est judicieux d’installer, outre le programme bind9 lui-même, les deux packs bind9utils et dnsutils. Ceux-ci ne sont certes pas indispensables, mais il s’agit d’outils très utiles pour la maintenance de votre serveur DNS. Entrez ensuite la commande suivante :

sudo apt-get install bind9 bind9utils dnsutils

Bind9 est maintenant installé sur votre système. Il reste un certain nombre de paramètres à régler avant de transformer votre Raspberry PI en serveur DNS. Il s’agit maintenant d’ouvrir le fichier de configuration de bind9 :

sudo nano /etc/bind/named.conf.local

Là, il faut paramétrer deux zones : une pour le Forward-Lookup, par lequel l’adresse IP est cherchée pour le domaine, et le Reverse-Lookup, pour la requête inverse.

sudo nano /etc/bind/named.conf.local 
    zone "home.lan" IN {
            type master;
            file "/etc/bind/db.home.lan";
      };
    zone "1.168.192.in-addr.arpa" {
            type master;
            file "/etc/bind/db.rev.1.168.192.in-addr.arpa";
      };

Le code indique que deux fichiers différents (db.home.lan et db.rev.1.168.192.in-addr.arpa) sont utilisés pour définir les zones. Dans la mesure où vous créez les fichiers vous-mêmes, vous pouvez les renommer comme vous le souhaitez, mais il faut les ranger au bon endroit. Voici comment constituer le dossier pour le Forward-Lookup :

sudo nano /etc/bind/db.home.lan
    
        home.lan. IN SOA raspberry.home.lan. hostmaster.home.lan. (
             2017081401 ; serial
                8H ; refresh
                4H ; retry
                4W ; expire
                1D ; minimum
        )
        home.lan. IN NS raspberry.home.lan.
        home.lan. IN MX 10 raspberry.home.lan.
        localhost        IN A 127.0.0.1
        raspberry        IN A 192.168.1.31

Il est ensuite nécessaire d’ajuster les deux dernières entrées au sein du fichier. Entrez ici les adresses IP de votre Raspberry Pi (auquel vous avez au préalable attribué une adresse IP statique) et de votre routeur. Veillez bien à ce que les noms de domaines se terminent toujours ici par un point. Au début des fichiers, après leur numéro de série, déterminez combien de temps est nécessaire entre deux actions classiques. Les deux indications NS et MX précisent que le nom du serveur et le serveur mail sont installés sur le Raspberry Pi.

Conseil :

Au début des fichiers, inscrivez toujours leur numéro de série : il se présente sous la forme YYYYMMDDXX avec la date (en général année, mois, jour), et un numéro de série croissant, dans le cas où vous en avez créé plusieurs versions le même jour.

Créez ensuite le fichier Reverse-Zone :

sudo nano /etc/bind/db.rev.1.168.192.in-addr.arpa
    @ IN SOA raspberry.home.lan. hostmaster.home.lan. (
        2017081401 ; serial
        8H ; refresh
        4H ; retry
        4W ; expire
        1D ; minimum
    )
               IN NS raspberry.home.lan.
    1         IN PTR router.home.lan.
    31        IN PTR raspberry.home.lan.

Dans cet exemple, l’adresse de votre réseau local commence par 192.168.1. Si ce n’est pas le cas, il suffit de remplacer ces données par la bonne adresse à l’emplacement correspondant dans le fichier et dans le nom du fichier. Souvenez-vous qu’un autre nom de fichier doit être entré ici : /etc/bind/named.conf.local.

Lorsque vous installez un serveur DNS sur un Raspberry Pi, celui-ci fonctionne comme un cache pour les requêtes DNS. Ceci signifie que, dès qu’une requête de résolution de noms est envoyée, l’entrée est sauvegardée sur votre serveur DNS. Les requêtes DNS sont également transférées à d’autres serveurs. Vous pouvez les spécifier dans /etc/bind/named.conf.options. Pour ce faire, il faut ouvrir le fichier et modifier les adresses IP dans l’entrée « Forwarders » :

sudo nano /etc/bind/named.conf.options 
    forwarders {
      1.2.3.4;
      5.6.7.8;
    };

Vous pouvez par exemple entrer l’adresse IP du serveur DNS de votre fournisseur d‘accès Internet, ou celle d’un système ouvert. Celle de Google, par exemple, est très connue (8.8.8.8). Pour les utilisateurs qui souhaitent s’affranchir d’un fournisseur commercial, il est possible de de choisir un système gratuit, comme par exemple Digitalcourage e. V. (85.214.20.141).

Vous avez désormais configuré un serveur DNS sur un Raspberry Pi avec BIND. Pour que les modifications soient effectives, il faut maintenant redémarrer le programme :

sudo service bind9 restart

Oder:

sudo service bind9 stop
sudo service bind9 start

Si des erreurs persistent au démarrage du serveur DNS, il peut valoir la peine de jeter un œil au fichier d’identification /var/log/syslog. Après avoir redémarré votre Raspberry Pi, il n’est pas nécessaire de redémarrer le serveur DNS manuellement, donc vous pouvez configurer un redémarrage automatique du système :

sudo update-rc.d bind9 defaults

Il s’agit maintenant d’entrer le nouveau serveur DNS dans les paramètres de votre routeur, pour que les requêtes de résolutions de noms soient exécutées sur le Raspberry Pi. Il s’agit d’entrer l’adresse du Raspberry Pi dans les paramètres de l’appareil (auxquels on accède depuis l’interface). Vous avez désormais le contrôle sur les entrées DNS, et pouvez bloquer certains serveurs, par exemple pour vous protéger de pages malveillantes. Enfin, il faut verrouiller le DNS ; ceci se passe dans un dossier dans lequel vous entrez d’abord le fichier de configuration de bind9 :

sudo nano /etc/bind/named.conf

Ce fichier est inséré en tant que nouvelle entrée dans celui qui existe déjà, et terminé par un point-virgule :

include „/etc/bin/named.conf.blocked“;

Entrez ensuite dans ce fichier les domaines que vous souhaitez bloquer. Pour vous aider à savoir quels sont les domaines verrouillés, vous avez accès à différentes listes. Dans cet exemple, nous utilisons une liste du projet DNS BH, qui fournit un fichier zone pour BIND. Ce type de fichier est téléchargeable et s’ouvre avec un programme de traitement de texte.

zone "malware-example.ga"  {type master; file "/etc/namedb/blockeddomain.hosts";};

À la fin de la ligne, un fichier est ouvert, et exécuté lorsque le domaine correspondant est demandé. Voici comment créer ce fichier :

sudo nano /etc/namedb/blockeddomain.hosts

Entrez ensuite le code suivant :

$TTL        86400
@             IN            SOA         raspberry.home.lan. hostmaster.home.lan. (
                                                        2017081401 ; serial
                                                        8H ; refresh
                                                        2H ; retry
                                                        10D ; expire
                                                        1D ; minimum
)
    NS raspberry.home.lan.
    A 127.0.0.1
* IN            A             127.0.0.1

Ici encore, veillez bien à ce que toutes les bonnes valeurs soient entrées pour chaque domaine (dans ce cas raspberry.home.lan). Ensuite, redémarrez à nouveau bind9. Votre serveur DNS doit maintenant être correctement configuré et prêt à être utilisé.

Conseil :

Avec un Raspberry Pi, il est également possible d’installer d’autres types de serveurs. On peut notamment utiliser le mini-ordinateur pour en faire un serveur Web, ou en serveur email.