Serveur DNS : PowerDNS (Serveur Web sur Debian Squeeze)

Publié le

Le choix de PowerDNS par rapport à Bind est simple : ave PowerDNS, on peut configurer l'ensemble des informations dans une base données, MySQL dans mon cas.

Donc on commencer par stopper et désinstaller bind, qui peut être là :

/etc/init.d/bind9 stop
aptitude purge bind9

Et on install PowerDNS :

aptitude install pdns-server pdns-backend-mysql pdns-recursor libnet-dns-perl

PowerDNS est découpé de deux façon différentes et indépendantes : le serveur qui permet de définir vos zones (vos sites, sous-domaines, etc...) et le recursor qui permet d'effectuer des requêtes DNS vers l'extérieur.

Commençons par la configuration du serveur DNS dans /etc/powerdns/pdns.conf :

allow-axfr-ips=217.70.177.40 217.70.177.53 213.186.33.199
cache-ttl=300
disable-axfr=no
launch=gmysql
local-address=

local-ipv6=::0
do-ipv6-additional-processing=yes

logging-facility=0
loglevel=4
query-cache-ttl=300
recursive-cache-ttl=150
recursor=127.0.0.1:54

L'AXFR est le protocole qui permet a un éventuel secondaire de recopier les zones que vosu avez condifuré sur votre serveur. Dans l'exemple, je les autorise depuis les adresses IP des serveurs de gandi et OVH. On paramètre tout ce qu'il faut pour que le serveur puisse répondre en IPv6. Enfin, on log grâce au syslog N° 0, configuré plus bas.

Puis, passons au recurseur qui est plus simple, dans le fichier /etc/powerdns/recursor.conf

allow-from=127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10
local-port=54
log-common-errors=yes
logging-facility=1
#quiet=yes

On autorise son utilise uniquement pour des adresses locales (donc le serveur lui même) sur le port 54. On log ses éléments grâce au syslog N° 1.

Pour configurer les logs correctement via syslog, editez le fichier /etc/rsyslog.d/pdns.conf pour y mettre : 

local0.* /home/var/log/pdns.log
local1.* /home/var/log/pdns-recursor.log

Et comme pour le PHP-FPM précédement, on ne veut pas gardé ces logs indéfiniments.

Donc on ajoute dans le fichier /etc/logrotate.d/rsyslog en dessous de /var/log/php-suhosin.log :

/var/log/pdns.log
/var/log/pdns-recursor.log

 

PowerDNS est maintenant configuré. Mais il n'au aucune entrée DNS. Pire encore, la base de données de configurations n'existe pas encore.

Commençons par créer la base de données de configuration, nommé serverconf :

mysqladmin -p create serverconf

Puis nous allons créer les tables de cette base, grâche au fichier SQL de création que voici. Vous avez un accès SFTP : utilisez-le pour transférer ce fichier ! Pensez à modifier le mot de passe et le nom d'utilisateur avant de l'exécuter. D'ailleurs, pour l'exécuter en ligne de commande :

mysql -h localhost -u root --password=MOT_DE_PASSE_ROOT_MYSQL serverconf < /path/to/serverconf.sql

Et maintenant, il faut configurer PowerDNS pour utiliser notre structure de base de données correctement. Dans le fichier /etc/powerdns/pdns.d/pdns.local :

gmysql-socket=/var/run/mysqld/mysqld.sock
gmysql-dbname=serverconf
gmysql-user=serverconfuser
gmysql-password=serverconfpass

gmysql-basic-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name='%s'
gmysql-id-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name='%s' and domain_id=%d
gmysql-any-query=select content,ttl,prio,type,domain_id,name from record where name='%s'
gmysql-any-id-query=select content,ttl,prio,type,domain_id,name from record where name='%s' and domain_id=%d
gmysql-list-query=select content,ttl,prio,type,domain_id,name from record where domain_id=%d
gmysql-master-zone-query=select master from domainDNS where name='%s' and type='SLAVE'
gmysql-info-zone-query=select domain_id AS id,name,master,last_check,notified_serial,type from domainDNS where name='%s'
gmysql-info-all-slaves-query=select domain_id AS id,name,master,last_check,type from domainDNS where type='SLAVE'
gmysql-supermaster-query=select account from supermaster where ip='%s' and nameserver='%s'
gmysql-insert-slave-query=insert into domainDNS (type,name,master,account) values('SLAVE','%s','%s','%s')
gmysql-insert-record-query=insert into record (content,ttl,prio,type,domain_id,name) values ('%s',%d,%d,'%s',%d,'%s')
gmysql-update-serial-query=update domainDNS set notified_serial=%d where id=%d
gmysql-update-lastcheck-query=update domainDNS set notified_serial=%d where id=%d
gmysql-info-all-master-query=select domain_id,name,master,last_check,notified_serial,type from domainDNS where type='MASTER'
gmysql-delete-zone-query=delete from record where domain_id=%d
gmysql-wildcard-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name like '%s'
gmysql-wildcard-id-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name like '%s' and domain_id=%d
gmysql-wildcard-any-query=select content,ttl,prio,type,domain_id,name from record where name like '%s'
gmysql-wildcard-any-id-query=select content,ttl,prio,type,domain_id,name from record where name like '%s' and domain_id=%d

Remplacer bien sûr les première ligne par ce que vous aurez utiliser précédement.


Tout est prêt et bien configuré. On redémarre les démons modifiés :

/etc/init.d/rsyslog force-reload
/etc/init.d/pdns-recursor force-reload
/etc/init.d/pdns force-reload

 

Le serveur PowerDNS n'inclue pas à ma connaissance un outil permettant de notifier automatiquement un DNS secondaire d'un changement de zone. Pour palier à cela, j'ai trouver une script perl qui permet d'envoyer cette notification manuellement en ligne de commande. Vous trouverez ce script sur github. Avec la ligne d'installation plus haut, vous devrez avoir tout en place pour l'utiliser.

 

Et on passe à la suite : Le serveur de mail.


Retour au sommaire du tutorial complet.