Comment installer PowerDNS et son interface PowerDNS-Admin sur Linux

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.

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
PowerDNS install with APT

Ensuite on installe le connecteur pour la connexion avec MySQL :

sudo apt install pdns-backend-mysql -y
PowerDNS install backend MySQL with APT

Redémarrer le service :

sudo systemctl restart pdns.service

Installation 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-pdns

Aller dans le dossier que l’on vient de créer :

cd /containers/mariadb-pdns

Créer et éditer le fichier docker-compose.yml qui va contenir la définition du conteneur :

sudo nano docker-compose.yml

Copier 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/mysql

Télécharger l’image de MariaDB :

sudo docker compose pull

Démarrer le conteneur MariaDB :

sudo docker compose up -d

On 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.sql

Injecter le fichier dans la base de données :

sudo docker exec -i pdns-mariadb mysql -u root -pchangee powerdns < schema.mysql.sql

La 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.conf

Rechercher 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=powerdns

Et 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/0

Sauvegarder le fichier.

Redémarrer le service :

sudo systemctl restart pdns.service

Tester 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/localhost

Vous 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-admin

Se déplacer dans le dossier :

cd /containers/powerdns-admin

Créer et éditer le fichier docker-compose.yml :

sudo nano docker-compose.yml

Copier 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/mysql

Télécharger les images des conteneurs :

sudo docker compose pull

Démarrer les conteneurs :

sudo docker compose up -d

Configuration 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.

PowerDNS-Admin Login page

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

PowerDNS-Admin - Create first accout

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

PowerDNS-Admin Login Page

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é.

PowerDNS-Admin Settings Server

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éé.

PowerDNS-Admin - Zone list

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.sql

Si 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.Z

Redémarrer le service pour la prise en compte :

sudo systemctl restart pdns.service

Configuration 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
reboot

Vous 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.

Romain Drouche
Architecte Système | MCSE: Core Infrastructure
Expert en infrastructures IT avec plus de 15 ans d’expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d’Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.

Laisser un commentaire