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
une fois fait, on arrive sur le dashboard qui recensera les domaines gérés par notre serveur
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.
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 !



No Comments