5/5 - (1 vote)

Mémo pour installer un serveur DNS classic (port 53), DOH (port 443) et DOT (port 853).

Pré-requis

Un serveur web

Dans mon cas, une instance sur Oracle Cloud en « Always Free » :

  • VM.Standard.E2.1.Micronamed.conf.local
  • Ram : 1Go
  • 2 vCPU
  • Ubuntu 20.04 LTS / Debian 11

Ne pas oublier la sécurité (Fail2ban, PSAD, Logwatch, hardening, etc.) et d’ouvrir les ports 53, 443 et 853 (en plus du 22).
Pour Let’s Encrypt, il faut aussi ouvrir le port 80.

Et bien sûr un nom de domaine qui pointe sur le serveur.

Ce mémo concerne ipv4 et ipv6.

Désactivation du service systemd-resolved

Supprimer le lien symbolic :
Pour mémo, le lien d’origine est  :
Et créer le fichier /etc/resolv.conf avec le contenu suivant :
Le serveur en lui même n’utilisera pas le serveur DNS installé.
Au cas où ce dernier aurait un soucis de configuration, son accès deviendrait compliqué.

Bind9

Version utilisée au moment de ce mémo :

Installation de bind9 :

Fichier /etc/bind/named.conf.local.
Cette configuration permet de consulter les requêtes dans le fichier de log /var/log/named/query.log.

Fichier /etc/apparmor.d/local/usr.sbin.named

Prise en compte de la configuration dans AppArmor :

Créer le répertoire /var/log/bind avec un propriétaire et un groupe à bind :

Fichier /etc/bind/named.conf.options ipv4 uniquement.
Voir plus bas pour la version ipv4+ipv6.

Ce fichier permet :

  • [Option] D’utiliser Cloudflare comme serveur DNS. A désactiver si on ne souhaite pas utiliser les DNS root.
  • De ne pas répondre aux demandes IPv6.
  • D’écouter uniquement sur le port 5300 pour l’ip 127.0.0.1.
  • D’autoriser l’interrogation du serveur que pour 127.0.0.1 (queriesfrom).
  • Autorise la récursivité.
  • Active la validation dnsssec si disponible.
  • Ne renvoie pas la version de Bind pour des raisons de sécurité.

La partie commentée « querylog no; » permet de ne pas activer la log au besoin.

La partie forward est désactivée pour intérroger les DNS racine (root DNS).
A décommenter au besoin.
Les ips configurées sont celles de Cloudflare.

Pour configurer Bind9 uniquement pour IPV4, éditer le fichier /etc/default/named.
A la ligne :

Modifier en :

Ne pas démarrer Bind9 de suite.

Fichier /etc/bind/named.conf.options ipv4+ipv6

 

dnsdist

Version utilisée au moment de ce mémo :

A adapter en fonction de la disponibilité : https://repo.powerdns.com/
Prendre « dnsdist – version X.X.X (stable) ».

Choisir la version la plus récente en fonction de sa distribution.

Installation de dnsdist 1.5 pour Ubuntu 20.04 LTS Focal :

On va figer la source du paquet en provenance uniquement de dépôt officiel.
Créer le fichier /etc/apt/preferences.d/dnsdist et ajouter ce contenu :

Importer la clé publique du dépôt de PowerDNS :

Installer dnsdist :

Fichier de configuration /etc/dnsdist/dnsdist.conf.
Pour la partie certificat, laisser tel quel. On voit après.
Basé sur https://dnsprivacy.org/running_a_dns_privacy_server/using_dnsdist/ et mes recherches ici et là…

La version ipv4+ipv6 :

 

Nginx

Dans le cas où un serveur Nginx est installé, exemple de configuration Nginx ipv4+ipv6 à adapter suivant les besoins :

 

Let’s Encrypt

Version utilisée au moment de ce mémo :

Installation :

Pour le moment, la chaine « ISRG Root X1 » est demandée pour les smartphones Android (pas testé avec iPhone).

Création du certificat pour un serveur sans Nginx (cas d’un serveur autonome) :

Avec un Nginx installé, utiliser cette commande et répondre aux questions :

Les certificats seront donc dans le répertoire : /etc/letsencrypt/live/

Dans la configuration de dnsdist, il faut qu’ils soient dans /etc/dnsdist/.

Script hook pour copier les certificats et relancer le service dnsdist à la mise à jour de Let’s Encrypt.
En cas d’hébergement de plusieurs nom de domaine, il permet de n’exécuter la copie que si le domaine du serveur DNS est effectivement renouvelé.
Fichier : /etc/letsencrypt/renewal-hooks/deploy/deploy-dnsdist.sh

Remplacer url.monserveurdns.tld par le domaine.

Exécution des services

Tester la configuration de dnsdist :

Résultat :

Avec ipv6 :

Tester la configuration de Bind9 :

Démarrer bind9 puis dnsdist. Attendre 10 secondes entre chaque.
Le serveur bind9 doit être complètement démarré avant de démarrer Dnsdist.

Vérifier le status des services :

S’il y a une erreur dans le fichier /var/log/syslog, vérifier la configuration.

Quand tout va bien pour dnsdist :

Tester le serveur DNS

J’utilise Doggo.

Test du DNS sur le port 53 :

Test du DNS DOH sur le port 443 :

Test du DNS DOT sur le port 853 :

Test du certificat pour DOT sur le port 853 :

Un autre outil pour tester : kdig

Exemple pour tester DOT :

Configuration dans Android

Configuration globale du smartphone Android.
Dans les paramètres > Réseau et internet > DNS privé, saisir le nom de domaine utilisé.

Configuration pour Chrome, Vivaldi, etc. (parceque la configuration précédente ne suffit pas pour ces navigateurs à base de Chromium/Blink) :
Rechercher « Confidentialité et sécurité » > « Utiliser un DNS sécurisé ».
Saisir l’url : « https://dot.monserveurdns.tld/dns-query »

Et voilà !

AdBlock

Pour rajouter en bonus un bloqueur de pub.

Voir https://github.com/Trellmor/bind-adblock

Je conseille de faire le git clone dans le répertoire /opt.

Fichier /etc/bind/named.conf.options, rajouter les 3 lignes « response-policy ». A adapter en fonction.

FIchier /etc/bind/named.conf.local, ajouter ces lignes à la fin :

Exclure des domaines (whitelist), éditer le fichier /opt/bind-adblock/config.yml.
Exemple pour ne pas bloquer le domaine t.co (les liens dans Twitter) :

Créer le fichier /etc/bind/db.rpz.dot.monserveurdns.tld :

J’ai rajouté l’option –no-bind pour pouvoir relancer le serveur DNS indépendamment.

Relancer le service DNS :

Si tout est ok, il faut rajouter 2 cron qui vont mettre à jour la liste 2 fois par jour :