đŸ Archived View for zergy.net âș blog âș 022-migrer-de-bind-a-powerdns.gmi captured on 2023-05-24 at 17:51:52. Gemini links have been rewritten to link to archived content
âŹ ïž Previous capture (2021-12-03)
âĄïž Next capture (2024-05-10)
-=-=-=-=-=-=-
AprÚs avoir utilisé Bind pendant des années, l'absence de support simple de DNSSEC par Bind dans Debian 8 m'a fait passer à PowerDNS. Petit guide de migration.
Comme toujours, ce guide est plus centrĂ© pour les distrubutions Debian et dĂ©rivĂ©e, mais peut ĂȘtre adaptĂ© Ă d'autres.
PowerDNS est sĂ©parĂ© en deux paquets, pdns-server et pdns-recursor, le premier est le serveur DNS alors que le second est le rĂ©curseur DNS, il est conseillĂ© de ne pas installer les deux sur la mĂȘme machine, mĂȘme si cela est possible.
Vous devrez également installer le paquet pdns-backend-$BACKEND en fonction du systÚme de backend de stockage des données que vous souhaitez utiliser, ici nous utiliserons MySQL, il nous faudra donc installer pdns-backend-mysql
# apt-get install pdns pdns-recursor pdns-backend-mysql
Afin de migrer, il est nécessaire de désactiver temporairement DNSSEC sur votre installation de Bind, ceci vous évitera d'avoir des informations DNSSEC inutiles dans la base de données de PowerDNS, celui-ci n'en ayant pas besoin pour utiliser DNSSEC de son coté.
Le plus simple pour se faire est d'avoir gardé une version non DNSSEC à jour de vos fichiers de zones et de changer leur numéro de version avant de relancer BIND.
Nous utiliseront ici MySQL comme backend pour stocker nos informations de zones, connectez-vous à MySQL par votre moyen préféré (ligne de commande ou PHPMyAdmin) et créez un utilisateur et une base de données pour PowerDNS. Donnez à l'utilisateur créé les droits sur cette base de données.
Pour créer la base manuellement :
mariadb> CREATE DATABASE pdns; mariadb> GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY 'pdnspassword';
Puis, une fois la base de données créée, la structurer comme suit :
mariadb> CREATE TABLE domains ( id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, master VARCHAR(128) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(6) NOT NULL, notified_serial INT UNSIGNED DEFAULT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; mariadb> CREATE UNIQUE INDEX name_index ON domains(name); mariadb> 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, change_date 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'; mariadb> CREATE INDEX nametype_index ON records(name,type); mariadb> CREATE INDEX domain_id ON records(domain_id); mariadb> CREATE INDEX ordername ON records (ordername); mariadb> 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'; mariadb> 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'; mariadb> CREATE INDEX comments_name_type_idx ON comments (name, type); mariadb> CREATE INDEX comments_order_idx ON comments (domain_id, modified_at); mariadb> 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'; mariadb> CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind); mariadb> CREATE TABLE cryptokeys ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, flags INT NOT NULL, active BOOL, content TEXT, PRIMARY KEY(id) ) Engine=InnoDB CHARACTER SET 'latin1'; mariadb> CREATE INDEX domainidindex ON cryptokeys(domain_id); mariadb> CREATE TABLE tsigkeys ( id INT AUTO_INCREMENT, name VARCHAR(255), algorithm VARCHAR(50), secret VARCHAR(255), PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; mariadb> CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
PowerAdmin est une interface web permettant de facilement gérer vos zones, je ne peut que vous conseiller de l'utiliser pour une administration plus simple.
Si vous désirez l'installer dans un sous-domaine, vous devrez mettre une nouvelle fois le fichier de la zone concernée à jour.
Une fois l'archive dĂ©compressĂ©e et votre serveur web configurĂ© -au besoin-, faites pointer votre navigateur internet vers l'URL oĂč vous avez installĂ© PowerAdmin.
L'installation est assez simple, vous devriez vous en sortir. Pensez à indiquer les paramÚtre de connexion à MySQL et à exécuter la commande MySQL qu'il vous donnera, vous devrez également créer le fichier inc/config.inc.php dans le dossier de PowerAdmin avec les informations qu'il vous donnera.
Une fois l'installation terminée, supprimez le dossier install/ dans le répertoire de PowerAdmin.
Le fichier de backend est différent selon celui que vous utilisez, dans notre cas, nous utilisons MySQL, le fichiez est /etc/powerdns/pdns.d/pdns.local.gmysql.conf.
Editez le est indiquez les informations nécessaires.
Par exemple :
# MySQL Configuration # # Launch gmysql backend launch+=gmysql # gmysql parameters gmysql-dnssec gmysql-host=localhost gmysql-port=3306 gmysql-dbname=pdns gmysql-user=pdns gmysql-password=S3cr37 gmysql-dnssec=yes # gmysql-socket=
Si vous ĂȘtes sous Debian 7, pensez Ă supprimer le fichier /etc/powerdns/pdns.d/pdns.simplebind.conf, celui-ci est inutile puisque nous utilisons le Backend MySQL, et sa prĂ©sence, mĂȘme non configurĂ©, semble gĂȘner PowerDNS dans cette version de Debian.
Le fichier de configuration de PowerDNS est /etc/powerdns/pdns.conf, le fichier est commenté et son édition ne devrait pas vous poser trop de problÚme.
Voyons quelques options utiles&bnsp;:
Le fichier de configuration de PowerDNS Recursor est /etc/powerdns/recursor.conf, le fichier est commenté et son édition ne devrait pas, là aussi, vous poser trop de problÚme.
Qelques options utiles&bnsp;:
Si le rĂ©curseur DNS est installĂ© sur la mĂȘme machine que PowerDNS, laissez le port 53 pour le serveur DNS et faites Ă©coutez le rĂ©curseur sur un autre port.
La migration se faitvia la commande zone2sql, vous devrez lui indiquer le fichier de configuration de BIND, généralement /etc/bind/named.conf via l'option --named-conf et le backend utilisé par PowerDNS via une autre option, comme nous utilisons MySQL, l'option sera --gmysql.
Le rĂ©sultat de cette commande doit ĂȘtre insĂ©rĂ© dans la base de donnĂ©es MySQL utilisĂ© par PowerAdmin, il est possible de faire celĂ d'une seule commande via zone2sql --named-conf=/etc/bind/named.conf --gmysql | mysql -u MysqlPdnsUser -p MysqlPdnsDB
Par exemple :
# zone2sql --named-conf=/etc/bind/named.conf --gmysql | mysql -u pdns -p pdns 0% done (/etc/bind/db.local) Warning! Skipping 'hint' zone '' 100% done 10 domains were fully parsed, containing 268 records
Une fois fait, connectez-vous Ă PowerAdmin et vĂ©rifiez que vos zones sont bien prĂ©sentes, si tous s'est bien passĂ©, vous pouvez arrĂȘter BIND et dĂ©marrer PowerDNS Recursor, si utilisĂ©, et PowerDNS.
# systemctl stop bind9 # systemctl start pdns-recursor # systemctl start pdns
VĂ©rifiez dans les journaux systĂšme est avec les commandes ps et ss que les service se sont correctement lancĂ©s. De mĂȘme, utilisez la commande dig afin de vĂ©rifier que PowerDNS est capable de faire une rĂ©solution DNS.
Le passage d'une zone vers DNSSEC se fait via la commande pdnssec secure-zone suivi du nom de la zone.
Il est possible de vérifier que la zone est bien passé à DNSSEC avec la commande pdnssec show-zone suivi du nom de la zone.
# pdnssec secure-zone test.tld # pdnssec show-zone test.tld
Vous pouvez ensuite utiliser la commande pdns_control notify pour forcer la mise Ă jour de la zone sur vos serveurs DNS secondaires.
# pdns_control notify test.tld