
Dans ce tutoriel, je vais vous expliquer comment installer un serveur DNS avec PowerDNS et une interface d’administration Web qui s’appel PowerDNS-Admin sous Linux en utilisant Docker pour les bases de données et PowerDns-Admin.
Sommaire
Présentation de PowerDNS
PowerDNS est un serveur DNS open source performant, reconnu pour sa flexibilité, sa modularité et sa compatibilité avec des bases de données telles que MySQL, PostgreSQL ou SQLite. Contrairement aux serveurs DNS traditionnels qui utilisent des fichiers zone statiques, PowerDNS permet de gérer dynamiquement les enregistrements DNS via des backends de bases de données, rendant la gestion bien plus souple dans des environnements complexes.
Il supporte les protocoles DNS récursif et faisant autorité (authoritative), et peut être configuré pour assurer l’un ou l’autre, voire les deux simultanément. Sa conception modulaire permet aussi l’intégration facile avec des API, des systèmes de provisioning ou des interfaces d’administration.
L’un des principaux atouts de PowerDNS est sa compatibilité avec PowerDNS-Admin, une interface web moderne qui facilite la gestion des zones DNS, des utilisateurs et des ACLs. Grâce à cette interface, même les administrateurs non familiers avec la ligne de commande peuvent administrer un serveur DNS complet.
Utilisé par de nombreux fournisseurs d’hébergement, opérateurs réseau et entreprises, PowerDNS est reconnu pour sa stabilité, sa sécurité, et sa capacité à gérer un trafic DNS important. Il s’intègre parfaitement dans des environnements virtualisés ou conteneurisés, notamment avec Docker, et peut être surveillé via des outils comme Prometheus ou Grafana.
La principale utilisation de PowerDNS est de l’utiliser en tant que serveur authoritative pour gérer des zones, c’est à dire qu’il ne va pas traité les requêtes DNS de client pour résoudre des nom DNS, mais héberger des zones en tant que maitre.
Prérequis pour déployer PowerDNS et PowerDNS-Admin
Le plus simple pour déployer PowerDNS va être d’utiliser un serveur Linux sur lequel on va installer directement le serveur PowerDNS, dans ce tutoriel, j’ai utilisé Ubuntu 24.04 qui propose directement PowerDNS via une installation avec APT.
Vous aurez aussi besoin d’avoir Docker d’installé que l’on va utiliser pour les conteneurs suivants :
- Base de données pour PowerDNS
- Base de données pour PowerDNS-Admin
- PowerDNS-Admin qui est un application tier Web qui va nous permettre de gérer le serveur PowerDNS
Installation de PowerDNS sur Linux
On va commencer par installer PowerDNS :
sudo apt install pdns-server -y
Ensuite on installe le connecteur pour la connexion avec MySQL :
sudo apt install pdns-backend-mysql -y
Redémarrer le service :
sudo systemctl restart pdns.serviceInstallation de la base de données pour PowerDNS
Ici, on va utiliser une base de données MariaDB pour stocker les données de PowerDNS, afin de facilité son déploiement et son isolation, on va utiliser Docker.
Commencer par créer le dossier pour le stockage du conteneur :
sudo mkdir -p /containers/mariadb-pdnsAller dans le dossier que l’on vient de créer :
cd /containers/mariadb-pdnsCréer et éditer le fichier docker-compose.yml qui va contenir la définition du conteneur :
sudo nano docker-compose.ymlCopier le contenu ci-dessous dans le fichier docker-compose.yml en changeant les mots de passe des comptes.
services:
mariadb:
image: mariadb:10.5
container_name: pdns-mariadb
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: powerdns
MYSQL_USER: pdns
MYSQL_PASSWORD: changeme
volumes:
- ./mariadb_data:/var/lib/mysqlTélécharger l’image de MariaDB :
sudo docker compose pullDémarrer le conteneur MariaDB :
sudo docker compose up -dOn va maintenant initialiser la base de données, pour cela nous allons injecter sa structure.
Télécharger le fichier de structure de base de données :
sudo https://raw.githubusercontent.com/PowerDNS/pdns/refs/heads/master/modules/gmysqlbackend/schema.mysql.sqlInjecter le fichier dans la base de données :
sudo docker exec -i pdns-mariadb mysql -u root -pchangee powerdns < schema.mysql.sqlLa base de données est prête.
Configurer PowerDNS pour utiliser MariaDB et l’accès à l’API
La configuration de PowerDNS se fait dans le fichier suivant : /etc/powerdns/pdns.conf.
sudo nano /etc/powerdns/pdns.confRechercher launch= et remplacer par launch=gmysql ensuite aller à la fin du fichier.
Ajouter les lignes ci-dessous pour la configuration de la base de données :
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-password=changeme
gmysql-dbname=powerdnsEt pour finir ajouter les lignes suivante pour la configuration de l’API :
api=yes
webserver=yes
api-key=api-key-changeme
webserver-address=0.0.0.0
webserver-allow-from=0.0.0.0/0Sauvegarder le fichier.
Redémarrer le service :
sudo systemctl restart pdns.serviceTester l’API de PowerDNS
Avant de passer à l’installation de PowerDNS-Admin, nous allons vérifier que l’API est bien fonctionnel, pour cela entrer la commande suivante :
curl -s -H 'X-API-Key: api-key-change' http://localhost:8081/api/v1/servers/localhostVous devriez avoir la réponse suivante :
{"autoprimaries_url": "/api/v1/servers/localhost/autoprimaries{/autoprimary}", "config_url": "/api/v1/servers/localhost/config{/config_setting}", "daemon_type": "authoritative", "id": "localhost", "type": "Server", "url": "/api/v1/servers/localhost", "version": "4.8.3", "zones_url": "/api/v1/servers/localhost/zones{/zone}"}Déployer PowerDNS-Admin avec Docker
On passe maintenant au déploiement de l’interface Web pour gérer notre serveur DNS.
Créer le dossier qui va contenir les données des conteneurs :
sudo mkdir -p /containers/powerdns-adminSe déplacer dans le dossier :
cd /containers/powerdns-adminCréer et éditer le fichier docker-compose.yml :
sudo nano docker-compose.ymlCopier le contenu ci-dessous en modifiant les mots de passe et secret :
services:
powerdns-admin:
image: powerdnsadmin/pda-legacy:latest
container_name: pdns-admin
restart: always
depends_on:
- mariadb-pda
environment:
- SQLALCHEMY_DATABASE_URI=mysql://pda:changeme-pda@pda-mariadb/pda
- SECRET_KEY=SECRET-changeùe
- GUNICORN_TIMEOUT=60
- GUNICORN_WORKERS=2
- GUNICORN_LOGLEVEL=DEBUG
ports:
- "9191:80"
mariadb-pda:
image: mariadb:10.5
container_name: pda-mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_DATABASE: pda
MYSQL_USER: pda
MYSQL_PASSWORD: changeme-pda
volumes:
- ./mariadb_data:/var/lib/mysqlTélécharger les images des conteneurs :
sudo docker compose pullDémarrer les conteneurs :
sudo docker compose up -dConfiguration de PowerDNS-Admin
Depuis un navigateur Internet, aller sur l’interface Web : http://ip:9191. Sur la page de connexion cliquer sur Create an account 1.

Entrer les informations demandées 1 pour créer un compte et cliquer sur Register 2.

Ensuite identifier vous avec le compte qui vient d’être créé.

A la première connexion, on est tout de suite redirigé vers la page de configuration qui nous indique que l’accès à l’API du serveur PowerDNS n’est pas configuré.

Entrer l’URL d’accès à l’API (http://ip-server-linux:8181/) 1, la clé d’API configurée 2 dans le fichier pdns.conf et la version du PowerDNS 3 qui a été affiché lors du test d’API en local. Cliquer ensuite sur le bouton Save Settings 4 pour enregistrer les informations.

Les informations sont enregistrées et il n’y a plus le message d’erreur.

Créer une zone DNS avec PowerDNS-Admin
Depuis la page principal Dashboard, nous avons normalement les zones qui s’affiche, pour le moment celle-ci est vide, cliquer sur Create Zone 1 qui se trouve dans le menu à droite.

Entrer le nom DNS de la zone 1, ensuite sélectionner le type* de Zone 2, pour SOA-EDIT-API sélectionner DEFAULT 3 et cliquer sur le bouton Create Zone 4.

* en fonction de l’utilisation que vous allez avoir, sélectionner le type Native si vous faites une résolution conditionnel c’est à dire que vous allez indiquer à votre serveur récursif quel serveur DNS gère la zone, si vous souhaitez autoriser le transfert vers un serveur DNS autre qui va héberger une copie, sélectionner le type Primary.
La zone DNS est créé.

Ajouter une enregistrement DNS dans une zone
On va maintenant ajouter un enregistrement DNS à la zone que l’on vient de créer. Cliquer sur la zone 1.

On arrive sur la liste des enregistrements, cliquer sur Add Record 1.

Ajouter un enregistrement 1 puis cliquer sur le bouton Save 2.

L’enregistrement est ajouté, pour que cela soit appliqué, cliquer sur le bouton Save Changes 1.

Cliquer ensuite sur Apply Changes 1.

L’enregistrement est actif coté PowerDNS.

Tester la résolution DNS
Pour ma part, j’ai configuré en amont une redirection conditionnel DNS sur un serveur Windows pour tester la zone.
J’ai utilisé la commande Resolve-DnsName pour tester la résolution.

On peut voir que la résolution de nom fonctionne.
Importer une zone BIND9 dans PowerDNS
Maintenant, on va voir comment importer un fichier de configuration au format Bind9 dans PowerDNS.
Sur le serveur PowerDNS, copier le fichier zone Bind9 :


On va commencer par créer un fichier .sql qui va permettre d’injecter la zone dans PowerDNS :
sudo zone2sql --zone=test.priv.conf --gmysql --zone-name=test.priv > test.priv.sql
Voici le contenu du fichier .sql :

Injecter le fichier dans la base de données :
sudo docker exec -i pdns-mariadb mysql -u pdns -pchangeme powerdns < test.priv.sqlSi tout se passe bien la zone est ajouté dans PowerDNS.

Par défaut la zone est injectée avec un type Native et sans configuration SOA-EDIT-API, dans le cas où vous souhaitez un transfert vers un autre serveur, changer le type et définir un SOA-EDIT-API.
Troubleshooting
Autoriser le transfert de zone DNS
Editer le fichier pdns.conf et ajouter à la fin les lignes suivantes :
master=yes
allow-axfr-ips=X.X.X.X,Y,Z.Z.Z.Z
also-notify=X.X.X.X,Y,Z.Z.Z.ZRedémarrer le service pour la prise en compte :
sudo systemctl restart pdns.serviceConfiguration LXC pour libérer le port 53
Entrer les commandes suivantes :
echo "DNSStubListener=no" /etc/systemd/resolved.conf
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
rebootVous savez comment mettre en place un serveur DNS avec PowerDNS et une interface Web pour le gérer.
Si vous avez GLPI avec un abonnement, il existe un plugin qui permet de gérer le serveur PowerDNS directement depuis celui-ci.
