Aller au contenu
medium

Gérez vos zones DNS avec PowerDNS

12 min de lecture

PowerDNS

PowerDNS Authoritative Server est un serveur DNS faisant autorité, réputé pour ses performances et ses multiples backends (BIND, MySQL, PostgreSQL, SQLite), pilotable par une API REST. Il sert vos zones DNS (les enregistrements A, MX, TXT... de vos domaines) et sait signer les réponses avec DNSSEC. Ce guide montre comment l'installer, créer une zone et vérifier la résolution avec dig. Public visé : administrateurs qui hébergent leur propre DNS. Testé avec PowerDNS 4.9.

  • Comprendre le rôle d'un serveur DNS faisant autorité.
  • Installer PowerDNS et choisir un backend adapté.
  • Créer une zone et ses enregistrements.
  • Vérifier la résolution avec dig.
  • Exposer l'API REST pour automatiser la gestion des zones.

L'histoire de PowerDNS débute au début des années 2000, à une époque où les besoins en serveurs DNS évoluaient rapidement. Créé initialement par la société néerlandaise PowerDNS.COM BV, ce projet avait pour ambition de proposer une alternative moderne aux solutions classiques comme BIND, qui dominaient le marché. Contrairement à ces dernières, PowerDNS s'est démarqué dès ses débuts par son approche modulaire et ses performances optimisées.

L'un des tournants majeurs du projet a été son adoption par la communauté open source. Ce choix a permis à PowerDNS de bénéficier d'une large contribution extérieure, enrichissant le logiciel en fonctionnalités tout en assurant une grande stabilité. Il a également permis de mieux répondre aux besoins diversifiés des utilisateurs, qu’ils soient des petites entreprises ou des grandes infrastructures.

Aujourd'hui, PowerDNS se décline principalement en deux modules complémentaires :

  1. PowerDNS Authoritative Server : Conçu pour gérer les zones DNS et fournir des réponses aux requêtes directement liées à ces zones.
  2. PowerDNS Recursor : Un serveur DNS récursif hautement performant, conçu pour résoudre les requêtes en interrogeant d'autres serveurs DNS sur Internet.

Ces deux composants, bien que distincts, partagent une philosophie commune : offrir une solution robuste, facile à configurer et capable de gérer de fortes charges. Grâce à ses mises à jour régulières et à l’implication de sa communauté, PowerDNS continue de figurer parmi les solutions DNS les plus respectées du marché.

PowerDNS se distingue par de nombreuses fonctionnalités qui en font un serveur DNS puissant et polyvalent. Voici une liste des points les plus intéressants :

  • API REST : Intégration native d'une API pour automatiser la gestion des zones DNS.
  • Performance : Optimisé pour gérer un grand nombre de requêtes DNS par seconde.
  • DNSSEC : Prise en charge native pour sécuriser vos enregistrements DNS.
  • Flexibilité des formats de configuration : Compatible avec des fichiers de configuration traditionnels et des outils modernes d'automatisation.
  • Compatibilité multiplateforme : Fonctionne sur la plupart des systèmes Linux et peut s'intégrer dans des environnements containerisés comme avec Docker.
  • Surveillance intégrée : Intégration facile avec des outils comme Prometheus et Grafana pour le monitoring.
  • Journalisation avancée : Des logs détaillés pour le dépannage et l'analyse des performances.
  • Haute disponibilité : Supporte la réplication des zones DNS pour une redondance et une fiabilité accrues.

Ces fonctionnalités permettent à PowerDNS de s'adapter aussi bien à de petites infrastructures qu'à des environnements complexes et hautement disponibles.

L’installation de PowerDNS est relativement simple et peut être effectuée rapidement sur un système Linux. Voici les étapes principales pour installer PowerDNS sur une distribution Debian ou Ubuntu :

Avant tout, assurez-vous que votre système est à jour :

Fenêtre de terminal
sudo apt update && sudo apt upgrade -y

Il faut desactiver le service systemd-resolved pour éviter les conflits avec PowerDNS :

Fenêtre de terminal
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

Mettre à jour le fichier /etc/resolv.conf pour qu'il pointe vers le serveur DNS de votre choix :

Fenêtre de terminal
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

Installons mariadb pour stocker les données des zones DNS :

Fenêtre de terminal
sudo apt install mariadb-server mysql-client -y

Créez une base de données et un utilisateur pour PowerDNS :

Fenêtre de terminal
sudo mysql -u root -p

Le mot de passe par défaut est vide, appuyez simplement sur Entrée.

CREATE DATABASE powerdns;
CREATE USER 'powerdns'@'localhost' IDENTIFIED BY 'securepassword';
GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns'@'localhost';
FLUSH PRIVILEGES;
EXIT;

On va sécuriser la base de données :

Fenêtre de terminal
sudo mariadb-secure-installation

Rentrez le mot de passe root de la base de données, puis répondez aux questions suivantes en appuyant sur Entrée.

On va créer la structure de la base de données pour PowerDNS :

Fenêtre de terminal
sudo mysql -u powerdns -p

Entrez le mot de passe securepassword. Copiez/collez le schéma de la base de données :

CREATE TABLE domains (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(8) NOT NULL,
notified_serial INT UNSIGNED DEFAULT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
options VARCHAR(64000) DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
id BIGINT AUTO_INCREMENT,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
disabled TINYINT(1) DEFAULT 0,
ordername VARCHAR(255) BINARY DEFAULT NULL,
auth TINYINT(1) DEFAULT 1,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX ordername ON records (ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE TABLE comments (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
comment TEXT CHARACTER SET 'utf8' NOT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
kind VARCHAR(32),
content TEXT,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
CREATE TABLE cryptokeys (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT 1,
content TEXT,
PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INT AUTO_INCREMENT,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

Installez PowerDNS et le backend MySQL :

Fenêtre de terminal
sudo apt install pdns-server pdns-backend-mysql -y

Il faut éditer le fichier /etc/powerdns/pdns.conf pour configurer le backend MySQL :

Fenêtre de terminal
sudo vi /etc/powerdns/pdns.conf

Si vous ne maitrisez l'éditeur vi, je vous recommande de lire mon guide sur vi.

# Launch gmysql backend
launch=gmysql
# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=securepassword
gmysql-dnssec=yes

Activez l'api REST en ajoutant les lignes suivantes :

api=yes
api-key=changeme

Une fois terminé ces éditions, redémarrer le service PowerDNS :

Fenêtre de terminal
sudo systemctl restart pdns

Pour tester que PowerDNS fonctionne correctement, utilisez la commande dig ou nslookup :

Fenêtre de terminal
dig @127.0.0.1 example.com

Cela interroge votre serveur local et vous permet de vérifier s’il répond aux requêtes. Vous devriez voir une réponse contenant les enregistrements DNS de votre domaine.

Fenêtre de terminal
; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> @127.0.0.1 example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 22672
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;example.com. IN A
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Sat Jan 25 12:21:43 UTC 2025
;; MSG SIZE rcvd: 40
  1. PowerDNS Authoritative sert vos zones DNS faisant autorité, avec plusieurs backends (BIND, MySQL, PostgreSQL, SQLite).
  2. Une zone décrit les enregistrements d'un domaine (SOA, NS, A, MX...) ; on vérifie la résolution avec dig (validé en lab : www.example.test répond 192.0.2.20).
  3. Le choix du backend dépend du besoin : BIND (fichiers) pour la simplicité, une base SQL pour l'automatisation via l'API.
  4. L'API REST permet de créer et modifier les zones par script (IaC, provider Terraform).
  5. DNSSEC signe les réponses pour garantir leur authenticité face à l'empoisonnement de cache.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn