Skip to main content

Installer PowerDNS + PowerDNS-Admin | Master-Secondaire

Sur une machine propre (Pas d'autre service, dans la mesure du possible), on installe PowerDNS et PowerDNS-Admin dockerisé pour créer un serveur DNS. Le but ici est de le faire deux fois, sur deux serveurs différents sur deux infras différentes afin d'avoir une redondance. Le deuxième serveur n'hébergera pas l'interface de management PowerDNS-Admin.

Schéma de principe

Installation sur chaque serveur

On commence par mettre à jour la machine

apt update && apt upgrade -y

On installe MariaDB

apt install mariadb-server -y

On sécurise l'installation à la fin de l'installation. Il vaut mieux choisir un mot de passe pour root, qui ne sera pas celui de root système

mysql_secure_installation

On répond oui à toutes les questions pour supprimer les bases de test et les utilisateurs anonymes.

On désactive ensuite resolvd

systemctl disable systemd-resolved
systemctl stop systemd-resolved

On supprime le lien symbolique système vers le fichier de conf resolvd

rm -R /etc/resolv.conf

et on créé un nouveau fichier en dur cette fois, avec l'adresse d'un serveur DNS de notre choix

echo "nameserver 9.9.9.9" > /etc/resolv.conf

On installe PowerDNS et son backend SQL

apt install pdns-server pdns-backend-mysql -y 

L'installeur nous demande si on veut que le backend SQL soit configuré automatiquement, ainsi qu'un mot de passe de connexion. Le mieux est de répondre oui et de taper "Entrée" lors de la demande de mot de passe. Il générera un mot de passe aléatoire

L'installation est à faire de la mème manière sur le serveur secondaire

Configuration DNS sur le serveur primaire (ns1.domaine.fr)

On commence par éditer le fichier de conf PowerDNS

vi /etc/powerdns/pdns.conf

On y modifie les valeurs suivantes pour autoriser le(s) serveur(s) secondaire(s) à faire des mises à jour de zones, ajouter une clé API, mais aussi on y indique que nous éditons le serveur primaire

#################################
# allow-axfr-ips        Allow zonetransfers only to these subnets
#
# allow-axfr-ips=127.0.0.0/8,::1
allow-axfr-ips=51.15.50.2

#################################
# api   Enable/disable the REST API (including HTTP listener)
#
# api=no
api=yes 

#################################
# api-key       Static pre-shared authentication key for access to the REST API
#
# api-key=
api-key=MasUpRkLeaPiquIDoitEtreplusonGueQueCa

#################################
# master        Act as a master
#
# master=no
master=yes

On note la clé API quelque-part, temporairement, on en aura besoin un peu plus tard.

On redémarre PowerDNS

systemctl restart pdns

Configuration DNS sur le serveur secondaire (ns2.domaine.fr)

On édite le même fichier /etc/powerdns/pdns.conf que précédemment, mais sur le second serveur, cette fois.

Les seules modifications à faire sont les suivantes, permettant au serveur se savoir qu'il est secondaire

#################################
# slave Act as a slave
#
# slave=no
slave=yes

#################################
# slave-cycle-interval Schedule slave freshness checks once every .. seconds
#
# slave-cycle-interval=60
slave-cycle-interval=60

Les étapes suivantes permettent d'activer le mode supermasters afin de recevoir les mises à jour de zones du master principal (Dans notre cas, le serveur primaire)

Pour ça, il faut se connecter au SGBD MySQL

mysql -p -u root

On y entre la commande SQL suivante

insert into pdns.supermasters values ('193.212.73.14', 'ns2.domaine.fr', 'admin');

On quitte et on redémarre PowerDNS

systemctl restart pdns

Installation de PowerDNS-Admin sur le serveur principal

Retour sur le serveur principal, on installe les prérequis pour Docker

apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

On importe la clé GPG Docker pour son repo

curl -fsSL https://download.docker.com/linux/ubuntu/gpg |  apt-key add -

On configure le repo pour notre version d'Ubuntu

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Un update du gestionnaire de packets et on installe Docker

apt update && apt install  docker-ce docker-ce-cli containerd.io -y

Une fois terminé, on lance un container Docker pour l'interface de config de PowerDNS

docker run --net=host -d -v pda-data:/data  ngoduykhanh/powerdns-admin:latest

Rien de fou dans cette étape, il nous suffit maintenant de nous connecter à l'interface web de PowerDNS-Admin à l'adresse du serveur : http://ns1.domaine.fr

Je rappelle les précautions à adopter si le serveur est directement accessible sur Internet. Il faudra sécuriser un peu tout ça. Pour ma part mon serveur principal est sur mon réseau local, derrière un pare-feu et son interface web n'est pas accessible sur son IP publique. Le serveur secondaire, lui n'a pas d'interface web.

On commence par créer un compte admin en cliquant sur Create an account

powerdns_admin_login.webp

une fois fait, on arrive sur le dashboard qui recensera les domaines gérés par notre serveur

powerdns_admin_dashboard.webp

Il faut ensuite configurer la clé API et l'adresse API à atteindre pour y passer les requêtes de modif au serveur DNS. On entre l'adresse de loopback du serveur puisque c'est lui qui héberge le service PowerDNS, et on y entre la clé API notée précédemment.

powerdns_admin_api.webp

Création d'une zone et test de la réplication

L'avantage de Power-DNS c'est qu'il possède un outil en ligne de commande : pdnsutil

Pour créer une zone, c'est très simple, on entre

pdnsutil create-zone bidule.fr

la zone vide est créée (PDNS ajoute quand même l'enregistrement SOA pour identifier la zone)

On ajoute les enregistrements NS pour identifier les serveurs DNS de la zone

pdnsutil add-record bidule.fr @ NS ns1.domaine.fr
pdnsutil add-record bidule.fr @ NS ns2.domaine.fr

J'ai fait le choix d'héberger les noms des serveurs DNS sur une autre zone DNS pour sécuriser et faciliter les choses.

On incrémente de 1 le serial de la zone, ce qui devrait déclencher une requête de synchronisation

pdnsutil increase-serial bidule.fr

Si aucune notif est générée on peut la forcer

pdns_control notify bidule.fr

Pour vérifier que la zone a été transférée sur le second serveur, il suffit de lui demander

dig NS bidule.fr @ns2.domaine.fr

La réponse doit ressembler à ceci

; <<>> DiG 9.11.3-1ubuntu1.13-Ubuntu <<>> NS bidule.fr @ns2.domaine.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10667
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1680
;; QUESTION SECTION:
;bidule.fr.		IN	NS

;; ANSWER SECTION:
bidule.fr.	3600	IN	NS	ns2.domaine.fr.
bidule.fr.	3600	IN	NS	ns1.domaine.fr.

;; Query time: 4 msec
;; SERVER: 51.15.50.2#53(51.15.50.2)
;; WHEN: Thu Sep 10 13:58:19 UTC 2020
;; MSG SIZE  rcvd: 90

Tout est fin prêt pour ajouter des enregistrements DNS et gérer notre serveur !