Migrer PowerDNS de Debian 9 à 10
Suite a quelques problèmes avec PowerDNS après la mises à jour vers Debian Buster, voici quelques conseils pour préparer votre migration.
La mises à jour d'un système Debian, ou tout autres système à mises à jour non continue, est toujours un moment assez critique, si la procédure n'est pas très difficile, la quantité de choses à mettre à jour abouti souvent sur de la casse.
Lors de la mise à jour de Debian 9 (Stretch) vers Debian 10 (Buster) j'ai eu la désagréable surprise de voir que suite à des incompatibilités de configuration entre les versions de PowerDNS et PowerDNS-Recursor incluses dans Debian 9 et celles de Debian 10, ceux-ci ne fonctionnaient plus, voici comment préparer le terrain pour ne pas casser PowerDNS et PowerDNS-Recursor lors de la mises à jour vers Debian 10.
Le cas étudié ici correspond au mien, où PowerDNS et PowerDNS-Recursor sont tout deux installé sur le même ordinateur, il faudra sans doute adapter en fonction de votre configuration.
Installer DNSDist
Jusqu'a sa version 4.0, PowerDNS pouvait communiquer avec PowerDNS-Rrecursor via les options de configuration allow-recursion
, recursive-cache-ttl
et recursor
présentent dans son fichier de configuration, avec la version 4.1, fournie dans Debian 10, ce n'est plus possible, la communication entre les deux doit passer par un troisième composant nommé DNSDist.
DNSDist est un répartiteur de charge créé par les auteurs de PowerDNS, il peux être utilisé avec un ou plusieurs serveurs DNS. Dans notre cas, nous l'utiliseront juste pour faire communiquer PowerDNS et PowerDNS-Recursor, l'installation se fait comme n'importe quel paquet.
# apt install dnsdist
Configuration
PowerDNS
Il vous faudra pour commencer, il faudra commenter les paramètres allow-recursion
, recursive-cache-ttl
et recursor
, penser à noter les valeurs données pour allow-recursion
, nous en auront besoin plus tard pour configurer DNSDist.
Il vous faudra ensuite modifier les valeurs de local-ipv6
, local-address
et local-port
, dans mon cas, DNSDist et PowerDNS étant sur la même machine, j'ai paramétré comme suit :
local-ipv6=::1 local-address=127.0.0.1 local-port=5300
Vérifiez également que les paramètres query-local-address
et query-local-address6
sont paramétré pour écouter sur toutes les interfaces.
query-local-address=127.0.0.1 query-local-address6=::1
Si votre PowerDNS communique avec un serveur secondaire, pensez que les la communication avec ce serveur passera par DNSDist, du coup ses requêtes proviendront à PowerDNS avec l'IP de DNSDist, pensez donc à modifier la valeur de allow-axfr-ips
en conséquence.
Dans le cas d'un serveur secondaire, le problème est le même, mais il faudra modifier la valeur de allow-dnsupdate-from
. Dans tout les cas, n'hésitez pas à consulter les journaux système si vos échanges de zones entre serveurs ne passent pas.
PowerDNS-Recursor
Modifier les valeurs de local-address
et local-port
, dans mon cas, DNSDist et PowerDNS-Recursor étant sur la même machine, j'ai paramétré comme suit :
local-address=127.0.0.1, ::1 local-port=5301
Comme pour PowerDNS, vérifiez que les paramètres query-local-address
et query-local-address6
sont paramétré pour écouter sur toutes les interfaces.
query-local-address=127.0.0.1 query-local-address6=::1
Enfin, il faudra paramétrer la valeur forward-zones
si votre serveur DNS est utilisé pour résoudre des zones privées ou publiques vous appartenant afin de les faire résoudre par PowerDNS, l'exemple donnée ici contient également les syntaxes pour des zones inverse IPv4 ou IPv6 :
forward-zones=private.lan=127.0.0.1:5300, example.net=127.0.0.1:5300, 1.a.8.0.0.0.c.0.0.0.0.d.f.ip6-arpa=127.0.0.1:5300, 1.168.192.ip-arpa=127.0.0.1:5300
DNSDist
Dans notre cas, la configuration de DNSDist ressemblera à ceci :
-- dnsdist configuration file, an example can be found in /usr/share/doc/dnsdist/examples/ setLocal('IPADDRESS:PORT') addLocal('ANOTHERIPADDRESS:PORT') setACL({'0.0.0.0/0', '::/0'}) -- Allow all IPs access newServer({address='127.0.0.1:5300', pool='auth'}) newServer({address='127.0.0.1:5301', pool='recursor'}) recursive_ips = newNMG() recursive_ips:addMask('NETWORKMASK1') -- These network masks are the ones from allow-recursion in the Authoritative Server recursive_ips:addMask('NETWORKMASK2') addAction(NetmaskGroupRule(recursive_ips), PoolAction('recursor')) addAction(AllRule(), PoolAction('auth')) -- disable security status polling via DNS setSecurityPollSuffix("")
setLocal
indique sur quel coupe IP et port écoute DNSDist, vous pouvez ajouter une directiveaddLocal
pour ajouter un second couple d'écoute. Le port par défaut est le 53.- Les deux directives
newServer
indiquent sur quelles adresses IP et ports écoutent PowerDNS et PowerDNS-Recursor. PowerDNS est identifié viapool='auth'
et PowerDNS-Recursor viapool='recursor'
- Remplacer la variable
NETWORKMASK1
derecursive_ips:addMask('')
par l'un des sous-réseaux qui étaient présent dans l'optionallow-recursion
de PowerDNS. Vous pouvez ajouter plusieurs directivesrecursive_ips:addMask('')
.
Si vous utilisez IPv6, vous devrez les noter sous la forme [Mon:IP:v6]:Port
, les réseau IPv6 se notent sous la forme [Réseau:IP:v6]/Masque
.
Redémarrer les services
Couper les services PowerDNS, PowerDNS-Recursor et DNSDist, puis, les redémarrer.
# systemctl stop pdns pdns-recursor dnsdist # systemctl start pdns pdns-recursor dnsdist
Installer PowerDNS-Admin
Jusqu'à Debian 9, il était possible d'utiliser PowerAdmin afin de gérer PowerDNS via une interface web, cependant, celui-ci n'étant plus maintenu depuis juin 2014, il n'est plus fonctionnel sous Debian 10 suite au passage à PHP 7.3, autant passer à une autre solution telle PowerDNS Admin avant de mettre à jour le système.
Préliminaires
Si vous utilisiez PowerAdmin avec PowerDNS utilisant en utilisant une base de données MariaDB/MySQL, il sera nécessaire de supprimer des tables dans la base de données de PowerDNS, connectez-vous à la base de PowerDNS et ne laissez que les tables suivantes :
- comments
- cryptokeys
- domainmetadata
- domains
- records
- supermasters
- tsigkeys
Installation
PowerDNS-Admin nécessite le paquet yarn
qui n'est pas founir avec Debian, vous pouvez cependant utilisez les dépôts de Yarn pour l'installer.
# apt -y install curl # curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - # echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list # apt update
Puis, installer les paquets nécessaires au fonctionnement de PowerDNS-Admin.
# apt install jq yarn libmariadbclient-dev python-mysqldb python3-dev libsasl2-dev libffi-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev pkg-config
Remplacez libmariadbclient-dev
par libmysqlclient-dev
si vous utilisez MySQL et non MariaDB
On peut ensuite procéder à l'installer de PowerDNS-Admin.
Commençons par créer la base de données MariaDB/MySQL nécessaire à PowerDNS-Admin
# mysql -u root -p Password: mariadb> CREATE DATABASE powerdnsadmin; mariadb> GRANT ALL PRIVILEGES ON powerdnsadmin.* TO 'powerdnsadminuser'@'%' IDENTIFIED BY 'strongpassword'; mariadb> FLUSH PRIVILEGES; mariadb> quit
On peut ensuite récupérer la dernière version de PowerDNS-Admin et installer les dépendances Pythons nécessaires :
# git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/powerdns-admin # cd /opt/powerdns-admin # virtualenv -p python3 flask # . ./flask/bin/activate (flask)# pip install -r requirements.txt
On copie le fichier de configuration modèle et on le personnalise.
(flask)# cp config_template.py config.py (flask)# vim config.py
# DATABASE CONFIG #You'll need MySQL-python SQLA_DB_USER = 'powerdnsadmin' SQLA_DB_PASSWORD = 'strongpassword' SQLA_DB_HOST = 'localhost' SQLA_DB_NAME = 'powerdnsadmin'
Remplir la base de données de PowerDNS-Admin et générer les assets avec Yarn :
(flask)# export FLASK_APP=app/__init__.py (flask)# flask db upgrade (flask)# flask db migrate -m "Init DB" (flask)# yarn install --pure-lockfile (flask)# flask assets build
Configuration
PowerDNS
Pour commencer, PowerDNS-Admin nécessite pour fonctionner d'activer l'API de PowerDNS afin de pouvoir communiquer avec lui. Modifier la configuration de PowerDNS et activer les options liées à la gestion de son API.
api=yes api-key=secret webserver=yes webserver-port=8081
Modifiez à votre convenant, l'API sera disponible à l'adresse http://localhost:8081/
via le mot de passe secret
dans le cas ci-dessus.
PowerDNS-Admin demandera aussi de connaître la version de PowerDNS, pour en être sûr, vous pouvez demander à PowerDNS de vous retourner son numéro de version via son API.
# systemctl retart pdns # curl -v -H 'X-API-Key: secret' http://127.0.0.1:8081/api/v1/servers/localhost | jq . * Trying 127.0.0.1... […] "version": "4.1.5", […]
SystèmeD
Créer le fichier de configuration /etc/systemd/system/powerdns-admin.service
nécessaire afin d'enregistrer PowerDNS-Admin comme service auprès de SystemD.
[Unit] Description=PowerDNS-Admin After=network.target [Service] User=root Group=root WorkingDirectory=/opt/powerdns-admin ExecStart=/opt/powerdns-admin/flask/bin/gunicorn --workers 2 --bind unix:/opt/powerdns-admin/powerdns-admin.sock app:app [Install] WantedBy=multi-user.target
Puis l'activer.
# systemctl daemon-reload # systemctl enable powerdns-admin # systemctl start powerdns-admin
Si vous utilisez NGinx, le Virtual Host pour PowerDNS-Admin ressemblera au suivant :
server { listen *:80; server_name powerdns-admin.example.net; index index.html index.htm index.php; root /opt/powerdns-admin; access_log /var/log/nginx/powerdns-admin.local.access.log combined; error_log /var/log/nginx/powerdns-admin.local.error.log; client_max_body_size 10m; client_body_buffer_size 128k; proxy_redirect off; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 32 4k; proxy_buffer_size 8k; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_headers_hash_bucket_size 64; location ~ ^/static/ { include /etc/nginx/mime.types; root /opt/powerdns-admin/app; location ~* .(jpg|jpeg|png|gif)$ { expires 365d; } location ~* ^.+.(css|js)$ { expires 7d; } } location / { proxy_pass http://unix:/opt/powerdns-admin/powerdns-admin.sock; proxy_read_timeout 120; proxy_connect_timeout 120; proxy_redirect off; } }
Redémarrez NGinx et vérifiez que la page de login de PowerDNS-Admin s'affiche, si c'est le cas, il ne vous reste plus qu'à créer un utilisateur et a indiquer les paramètres relatifs à l'API de PowerDNS pour commencer à vous en servir.