[Tutoriel] Qu'est-ce qu'un serveur DNS et comment en installer un ?

Tags: DNS Sécurité Informatique Tutoriel Services


Bonjour à tous !

Aujourd’hui, on va parler de DNS. On commencera par voir ce qu’est un serveur DNS en commençant par les bases. Ensuite, on verra comment installer un serveur DNS, dans notre cas Unbound. J’avais un mauvais souvenir lors d’une installation il y a quelques années, il s’avère finalement que c’est pourtant super facile à l’heure actuelle !
Si vous êtes intéressé par l’explication des serveurs DNS, la première (et éventuellement la deuxième) partie sont faîtes pour vous. Si vous voulez passer directement à l’installation, c’est ici que ça se passe.

C’est quoi un serveur DNS ?

Pour comprendre ce qu’est un serveur DNS, il est important de commencer par voir comment fonctionne internet.

Les adresses sur Internet

Commencons donc par les bases. Je vais essayer de vulgariser le concept pour que ce soit compréhensible par tout le monde.

Pour accéder à ce site, il existe de nombreux moyen, l’un d’eux consiste à taper son adresse dans la barre d’adresse de votre navigateur. Vous tapez donc www.pofilo.fr.
Votre ordinateur va ensuite demander à votre box de lui donner le contenu disponible à cette adresse. Votre box va alors faire appel à un annuaire pour convertir cette adresse facile à retenir en une adresse avec des chiffres. Cet annuaire va donc faire une correspondance entre www.pofilo.fr et l’adresse IP 149.202.52.52. Votre box connait alors l’adresse dont elle a besoin pour satisfaire votre demande et va effectuer une requête qui va parvenir sur mon serveur ; c’est comme si vous envoyez une lettre de Toulouse à Paris, il y a divers chemins possible mais peu importe, on veut seulement que la lettre arrive (plus vite qu’une lettre à la poste dans notre cas si possible).

Pour revenir sur les adresses IP, c’est un peu comme un numéro de téléphone dans le sens où on peut géolocaliser l’adresse physique à partir du numéro.

Par exemple les 2 premiers numéros téléphoniques français découpent la France métropolitaine en 5 parties, et les 2 suivants délimitent des zones encore plus précises !

Indicateurs téléphoniques en France
Indicateurs téléphoniques en France
Indicateurs téléphoniques en France 2
Indicateurs téléphoniques en France 2

Quand quelqu’un nous appelle depuis un téléphone fixe, on pourrait dans la théorie savoir d’où l’appel vient ! Je dis bien en théorie puisqu’avec le nombre de lignes qui augmentent, les possibilités de conserver les numéros lors des démanagements etc, cette répartition est de moins en moins vrai.

Pour les adresses IP, c’est grosso-modo le même principe à l’échelle mondiale. On peut normalement localiser une IP pour savoir dans quel continent et quel pays elle est utilisée, voire même plus précisément dans certains cas. Si vous voulez connaître votre adresse IP actuelle, vous pouvez allez sur ip.pofilo.fr (Il se peut que cette adresse change si vous réessayer plus tard ou que si vous redémarrez votre box. C’est normal car certains fournisseurs délivrent des IP dynamiques (contraire de statique), c’est à dire qu’il va attribuer une adresse à votre Box à son démarrage et votre Box va la libérer quand elle s’arrête).

Il existe par exemple des sites pour localiser des adresses IP (IP Tracker par exemple). Si vous essayez avec celle de mon serveur, vous verrez qu’il se site en France.

Les serveurs DNS

DNS = annuaire

Je vous ai parlé d’un annuaire permettant de faire correspondance entre www.pofilo.fr et 149.202.52.52. Cet annuaire, c’est tout simplement un serveur DNS (Domain Name System, soit système de noms de domaine pour les francophones).

Il faut savoir qu’il existe des serveurs DNS racine gérés par 12 organisations différentes (2 en Europe, 1 au Japon et 9 aux Etats-Unis d’Amérique). Quelque soit le serveur DNS que vous utilisez (par exemple si vous utilisez internet depuis une Box Orange, celle-ci va utiliser un serveur DNS appartenant à Orange), celui-ci va se renseigner auprès des serveurs racines.

Cette dernière phrase est en fait en partie fausse. Il faut se rendre compte que pour chaque site différent où vous allez, vous allez générer des requêtes DNS sur les serveurs racines. Même si les 12 organisations gèrent au final plus de 900 serveurs répartis dans à travers le monde (source), on est quand même très nombreux à surfer sur le net au quotidien à travers le monde. Une des solutions pour réduire considérablement les requêtes vers ces serveurs racines est ce que l’on appelle le cache.

Le cache

Reprenons notre exemple. Vous êtes chez Orange et vous voulez accéder à mon site. Le serveur DNS de Orange va demander au serveur racine qui va retourner 149.202.52.52 comme étant l’adresse IP de mon serveur.
5 minutes après, votre cousine qui est également chez Orange et qui habite dans la même ville que vous va aussi sur mon site (sur vos conseils bien sur !). Le serveur DNS de Orange va alors devoir refaire la traduction de www.pofilo.fr. Cependant, il se souvient de cette adresse, il va donc directement retourner l’adresse IP sans passer par les serveurs racines. Il y a en effet très peu de chance que mon serveur ait changé d’adresse entre temps, cette information peut alors être stockée en cache.

Selon la configuration du serveur DNS, le cache peut être défini de quelques minutes à plusieurs heures. Au final, votre Box comporte elle aussi un serveur DNS et quand elle ne connait pas l’adresse (ne la possède pas en cache), elle va demander à Orange qui lui va éventuellement demander aux serveurs racines. Votre Box possède donc également un cache (pas la peine de demander à Orange l’adresse IP de votre moteur de recherche toutes les 30 secondes). Pour pousser le vice encore plus loin, votre navigateur possède également un cache notamment pour les raisons que je vais évoquer dans le petit paragraphe suivant !

L’intérêt du cache est donc de soulager les serveurs DNS de plus haut niveau. Cependant, un autre intérêt qu’apporte le cache est le gain en performances et rapidité. Si votre navigateur ou votre Box connait déjà l’adresse que vous souhaitez, ça évite de faire des requêtes vers les serveurs DNS de plus haut niveau. Moins de requête équivaut logiquement à plus de rapidité.

Petite liste des serveurs les plus connus

Pendant un long moment, Google proposait un serveur DNS sous l’adresse 8.8.8.8 (8.8.4.4 adresse secondaire). Les administrateurs systèmes n’ont pas fini de voir cette adresse un peu partout ! Pourquoi ? Parce que c’est fiable (comme relativement tous les services Google en activité) mais aussi parce que l’adresse est ultra facile à retenir.

Il n’est en effet pas rare que pour tester si un ordinateur possède bien une connection à internet, on comment par faire un ping sur google ping google.fr. (Un ping consiste à vérifier si l’on peut établir la connexion avec un serveur ou non). Le fait que le ping sur google.fr ne fonctionne pas ne veut pas dire que c’est uniquement un problème de connexion mais peut-être un problème DNS. C’est pourquoi cette tentative est souvent suivie d’un ping 8.8.8.8. Si ça fonctionne, alors le problème est côté DNS, sinon côté internet (pare-feu, …).

Pour revenir aux DNS les plus connus, voici tout d’abord une liste des plus connus classés selon leurs performances à travers le monde.

Listes des DNS classés selon leurs performances mondiales en Juin 2018
Listes des DNS classés selon leurs performances mondiales en Juin 2018

Depuis, on a eu la mode des DNS facile à retenir avec 9.9.9.9 et 1.1.1.1. Bref, je vous laisse retrouver ici les principaux DNS avec leurs spécificités propres.

Listes des DNS classés selon leurs performances mondiales en Juin 2018
Listes des DNS classés selon leurs performances mondiales en Juin 2018

Pourquoi installer son propre serveur DNS ?

Quand on accède à internet de chez soi, toute la partie DNS est transparente pour l’utilisateur, c’est la même chose depuis votre smartphone ou un Hotspot de Wifi public. Dans ce cas, pourquoi s’embêter à posséder son propre serveur DNS ?? (Ce questionnement me fait penser à un article récent de @Dryusdan)

On peut alors retrouver plusieurs raisons (j’en oublie sûrement !).

Confidentialité et vie privée

Au niveau de la confidentialité, si vous demandez à votre serveur DNS de vous traduire l’URL d’un site coquin, il saura que vous fréquentez ce genre de site. Niveau vie privée, c’est donc pas le top.

DNS menteur

Un autre argument recevable concerne ce qu’on appelle les DNS menteurs. Par là, on entend un DNS qui va vous mentir sur les réponses. Par exemple un site de téléchargement (The Pirate Bay) s’est vu être bloqué. Comment le relate NextImpact, la tâche a finalement été aux gros FAI (Fournisseurs d’Accès à Internet) de bloquer ce site (et ses redirections). Cela se fait donc au niveau DNS, si un utilisateur rentre cette adresse, le DNS va répondre qu’elle n’existe pas.

Installation de Unbound

Pourquoi Unbound ?

On retrouve 2 principaux serveurs: Bind9 et Unbound. Ne connaissant pas Bind9, c’est donc un choix arbitraire entre les 2. De plus, Unbound tourne depuis 3-4 ans sur mon serveur, j’ai jamais eu le moindre soucis.

L’installation pour Debian

Installation

Cette installation a été réalisée sous Debian, ça doit être relativement la même chose pour Ubuntu (et pareil pour CentOS avec YUM je présume).

  1. On commence par installer le paquet: sudo apt-get install unbound dnsutils (vous verrez plus tard pourquoi on installe dnsutils)
  2. On se rend dans le dossier de configuration: cd /etc/unbound/unbound.conf.d
  3. On fait une sauvegarde de la configuration par défaut: cp root-auto-trust-anchor-file.conf root-auto-trust-anchor-file.conf.save
    a. On pourrait supprimer ce fichier car il ne contient pas grand chose, mais par principe je préfère le garder au chaud. De plus, dans le fichier /etc/unbound/unbound.conf, on voit que les fichiers de configurations chargés doivent avec l’extension .conf, notre fichier de configuration aura donc cette extension.
  4. On créé un nouveau fichier de configuration: vim perso.conf
  5. On y met la configuration suivante. Si vous avez des points d’amélioration sur cette configuration, n’hésitez pas à le partager en commentaire ou en faisant une Pull Request sur Git.
  6. Il faut désormais changer l’adresse du DNS utilisée par notre serveur (ou ordinateur). Cette méthode peut différer selon les distributions/versions.
    a. vim /etc/dhcp/dhclient.conf
    b. On édite la ligne qui contient supersede domain-name avec supersede domain-name-servers 10.8.0.1;
    c. Par sécurité, on décommente la ligne timeout 60;
  7. On créé le fichier de log: touch /var/log/unbound.log
  8. On donne les bons droits à ce fichier: chown unbound:unbound /var/log/unbound.log
  9. On ajoute le fichier indiquant les serveurs racines: vim /var/lib/unbound/root.hints et y mettre le contenu disponible à cette adresse (j’en ai fait une copie sur mon serveur au 31 mai 2018).
  10. On active unbound pour qu’il démarre avec le serveur/ordinateur: systemctl enable unbound
  11. On redémarre le serveur/ordinateur.

L’installation est terminée, voyons si tout se passe bien :)

Tests de l’installation

On s’assure déjà de retrouver nameserver 10.8.0.1 dans /etc/resolv.conf. En effet, je préfère toujours faire un redémarrage total de la machine pour m’assurer qu’un autre programme ne touche pas également au fichier /etc/resolv.conf. Ca évite de croire que ça marche bien, et 3 mois après, tu fais des mises à jour de ton serveur, tu le redémarres et tu n’as plus internet ! Oui, c’est du vécu :)

On va regarder si la configuration fonctionne avec la commande dig wikipedia.fr (je vous avait fait installer dnsutils pour cette commande, un apt-get sans serveur DNS fonctionnel n’aurait pas pu vous trouver où aller chercher le paquet).
On se moque un peu que ce soit l’adresse de Wikipédia ou de Tartempion, mais je voulais un site assez neutre ^^

Parmi les quatre dernières lignes retournées par la commande, vous devriez trouver:

;; Query time: 38 msec
;; SERVER: 10.8.0.1#53(10.8.0.1)

Essayez de faire la commande une seconde fois, le temps de réponse devrait être à 0 ms grâce au cache.

Voilà, votre DNS est désormais prêt :)

Personnellement, à la fin du fichier de configuration, j’aime bien rajouter (changez l’adresse IP, c’est celle de mon serveur ^^):

local-zone: "abc.xyz" redirect
local-data: "abc.xyz A 149.202.52.52"    

Pour ceux qui ne sont pas familier avec cette syntaxe, ça veut dire que je demande à mon serveur DNS de rediriger les requêtes abc.xyz vers 149.202.52.52.

  • Pourquoi abc.xyz ? Parce que c’est facile à retenir.
  • Pourquoi 149.202.52.52 ? Parce que c’est l’adresse de mon serveur, je suis censé retomber sur mon site.
  • Pourquoi faire mentir son DNS ? Pour s’assurer qu’il fonctionne quand on l’utilise ! Si je tape abc.xyz et que je tombe sur la page d’Alphabet (société mère de Google), c’est que ma configuration (serveur ou client) n’est pas bonne (ou que j’ai oublié de m’y connecter !).

Faire mentir son DNS

Attends, tu critiques les DNS des FAI qui mentent, tu fais déjà mentir le tien, et tu veux le faire mentir encore plus ? C’est pas de l’hypocrisie ??
Non. Je fais ce que je veux.
C’est une réponse débile, mais elle a le mérite d’être claire. Certes je fais mentir mon DNS, mais je contrôle le mensonge.

Le mensonge est une preuve d’intelligence. Boris Cyrulnik.

Pour cela, on va se baser sur cette liste. Elle a l’avantage d’être maintenue par la communauté. On peut également choisir ce que l’on désire bloquer, on peut y mettre une liste blanche, une liste noire et c’est fait en python :)

  1. On se rend dans le dossier de configuration: cd /etc/unbound/unbound.conf.d
  2. On récupère la liste (changer l’URL si vous voulez une autre liste bien sûr) que l’on formatte pour Unbound: 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
  3. On édite le fichier perso.conf en y ajoutant la ligne: include: "/etc/unbound/unbound.conf.d/adslist"

Utiliser Unbound avec OpenVPN

J’avais fait un tutoriel d’installation d’OpenVPN, vous pouvez le retrouver ici.
Vérifiez dans la configuration (/etc/openvpn/server.conf) que le serveur soit sur la bonne range d’IP: server 10.8.0.0 255.255.255.0. Après cela, il suffit de changer l’adresse DNS configurée: push "dhcp-option DNS 10.8.0.1".
Nous avions mis access-control: 10.8.0.0/24 allow dans la configuration de Unbound, c’était pour autoriser les utilisateurs du serveur VPN à l’utiliser.

Il vous suffit de redémarrer le serveur VPN systemctl restart openvpn et quand vous serez connecté à celui-ci, vous utilisez votre serveur DNS ! Pour le tester, essayez une adresse sur laquelle vous mentez (c’est pour ça que je mentais sur abc.xyz) et regardez le résultat :)

Conclusion

Après cet article relativement long (j’ai mis énormément de temps à l’écrire ^^), vous savez maintenant ce qu’est un DNS et comment en installer un et l’utiliser avec OpenVPN. L’intérêt n’est pas forcément que chacun installe son serveur DNS mais au moins de comprendre ce que c’est. Il toujours sympa de savoir comment fonctionne ce qu’on utilise au quotidien, non ?

Pour finir, je vous laisse avec un article de Stéphane Bortzmeyer qui conseille notamment à chacun de ne pas installer son DNS sans une bonne raison notamment pour éviter d’éventuelles surcharges sur les serveurs racines.

Commentaires