Pdns

De MySoLo Wiki.

Sommaire

Introduction

Pdns ou Powerdns est un serveur dns uniquement autoritaire. Plus exactement , il ne sert que des zones ont il est le dns et non qu'il apprend (récursif). Il a la particularité d'avoir été prévu directement pour gérer les zones en bases de données (ou d'autre manière par l'ajout de backend) à la différence de bind ou il est nécessaire de le patcher avec dlz.


Exemple de backend existant: mysql ldap postgres sqlite ...

Dans le cadre d'un hébergement massif de domaine, il convient donc très bien. C'est dans ce cadre là que le choix c'est porté.

Toutes l'installation est basé sur une gentoo, mais il doit y avoir peu de changement si l'installation est effectué sur une debian ou autre.


Le nécessaire

Comme dit plus haut, il y a plusieurs backend possible. Dans notre cas, nous choisissons d'utiliser une base de donnée MySQL. Un accès en lecture/écriture sur la base nécessaire ainsi que la possibilité de donner des droits à l'utilisateur utiliser sur les tables.


Installation

L'installation se fait sous une gentoo. Pour faire simple, nous utilisons l'ebuild disponible.

On active la dernière version de pdns et on active l'installation avec mysql

panthera conf.d # echo "=net-dns/pdns-2.9.22" >> /etc/portage/package.keywords
panthera conf.d # echo "net-dns/pdns mysql" >> /etc/portage/package.use

On lance l'install.

panthera conf.d # emerge -v pdns
...
* Messages for package net-dns/pdns-2.9.22:

*
* PowerDNS provides multiple instances support. You can create more instances
* by symlinking the pdns init script to another name.
*
* The name must be in the format pdns.<suffix> and PowerDNS will use the
* /etc/powerdns/pdns-<suffix>.conf configuration file instead of the default.
*
>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

* GNU info directory index is up-to-date.
panthera conf.d #

Vous noterez le message de fin d'installation. Le script d'init est prévu pour le lancement de plusieurs instances de pdns. Cela tombe bien, cela va nous servir pour notre propre configuration.

un petit test de bon fonctionnement du binaire avant de passer à la suite.

Pour ce test, nous utilisons le backend bind qui comme son nom l'indique, utilise les fichiers de configuration de bind. Si vous utilisez une version antérieur à la 2.9.21 vous pourrez utiliser la commande --bind-exemple-zone en plus. Cela évite d'installer ou d'avoir une configuration de bind pour tester.

En l'occurrence, ici il y a que la zone localhost et 127.0.0.1, mais ça suffira.

panthera powerdns # pdns_server --config-name=pdns --daemon=no --guardian=no --control-console=yes --loglevel=9 --log-dns-details=yes --query-logging=yes \
--launch=bind --bind-config=/etc/bind/named.conf
...
Mar 03 09:03:39 Reading random entropy from '/dev/urandom'
Mar 03 09:03:39 This is a standalone pdns
Mar 03 09:03:39 It is advised to bind to explicit addresses with the --local-address option
Mar 03 09:03:39 UDP server bound to 0.0.0.0:53
Mar 03 09:03:39 TCP server bound to 0.0.0.0:53
Mar 03 09:03:39 PowerDNS 2.9.22 (C) 2001-2009 PowerDNS.COM BV (Mar  3 2009, 00:47:34, gcc 4.1.2 (Gentoo 4.1.2 p1.1)) starting up
Mar 03 09:03:39 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
% Mar 03 09:03:39 Creating backend connection for TCP
Mar 03 09:03:39 [bindbackend] Parsing 3 domain(s), will report when done
Mar 03 09:03:39 [bindbackend] Warning! Skipping 'hint' zone ''
Mar 03 09:03:39 [bindbackend] Done parsing domains, 0 rejected, 2 new, 0 removed
Mar 03 09:03:39 About to create 3 backend threads for UDP
Mar 03 09:03:40 Done launching threads, ready to distribute questions

pdns est en marche. On test dans un autre terminal que cela fonctionne.

> DiG 9.4.3-P1 <<>> localhost A @127.0.0.1
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30556
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;localhost.                     IN      A

;; ANSWER SECTION:
localhost.              604800  IN      A       127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar  3 09:05:43 2009
;; MSG SIZE  rcvd: 43

panthera ~ # dig localhost  NS @127.0.0.1
...
;; QUESTION SECTION:
;localhost.                     IN      NS

;; ANSWER SECTION:
localhost.              604800  IN      NS      localhost.

;; ADDITIONAL SECTION:
localhost.              604800  IN      A       127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar  3 09:07:33 2009
;; MSG SIZE  rcvd: 57

panthera ~ # dig localhost SOA @127.0.0.1
...
;; QUESTION SECTION:
;localhost.                     IN      SOA

;; ANSWER SECTION:
localhost.              604800  IN      SOA     localhost. root.localhost. 2008122601 28800 14400 604800 86400

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar  3 09:07:44 2009
;; MSG SIZE  rcvd: 77

panthera ~ # dig 1.0.0.127.in-addr.arpa PTR @localhost
...
;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 86400   IN      PTR     localhost.

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar  3 09:09:11 2009
;; MSG SIZE  rcvd: 63

Nous avons bien le A, le NS, le SOA et le PTR aussi des zones localhost et reverse 127.0.0.1. A priori, le binaire fonctionne. crtl+c pour stopper le serveur pdns.


Configuration

L'installation de pdns a créer le fichier d'init pdns dans /etc/init.d et le fichier pdns-conf dans /etc/powerdns. equery nous le montre ou qlist.

panthera etc # equery f pdns | grep /etc
/etc
/etc/init.d
/etc/init.d/pdns
/etc/powerdns
/etc/powerdns/pdns.conf
panthera etc #


Fichier d'init

On copie le fichier d'init de pdns afin de travailler sur l'instance voulu.

panthera ~ # cp /etc/init.d/pdns /etc/init.d/pdns.ns01

Comme vu dans le message d'installation, il faut aussi créer ou copier le fichier de configuration

panthera ~ # cp /etc/powerdns/pdns.conf /etc/powerdns/pdns-ns01.conf

Voilà, on prêt à passer à la configuration.


Fichier Configuration pdns

Sécurité Minimal

Pour la sécurité, un utilisateur et group pdns est déja créé par l'ebuild d'install.

Ensuite, on créer un répertoire ou sera chrooté pdns.

panthera ~ # mkdir /home/dns/ns01

Si l'on veut utiliser la possibilité de master/slave de pdns, il est nécessaire que l'utilisaeur pdns puisse écrire dans le répertoire créé. Idem, si vous voulez utiliser une socket unix pour la connections à la base, le fichier devra se situer ici par un lien par exemple.

chown pdns:root /home/dns/ns01
chmod 600 /home/dns/ns01

Cela devrait suffire. Le but ici, étant au final d'utiliser la réplication par base, je m'étalerais pas dessus (tout du moins pas pour le moment).

Configuration pour pdns

panthera ~ # vi /etc/powerdns/pdns-ns01.conf
...
chroot=/home/dns/ns01
setgid=pdns
setuid=pdns

setgid/uid sont normalement déjà configuré.

De base, pdns écoutera sur toutes les ip (0.0.0.0). Pour configurer l'ip ( ou les ip ) qu'il écoutera.

local-address=192.168.0.1


Le backend mysql

Le backend utilisé sera le backend générique sql pour mysql. Il est nommé gmysql.

panthera ~ # vi /etc/powerdns/pdns-ns01.conf
...
launch=gmysql

Les paramètres de configuration des backends génériques sont toute sous la forme: "backend-xxxx" ou "backend" sera remplacé par le nom du backend lui même. gmysql ici.

gmysql-dbname=dns
gmysql-host=127.0.0.1
gmysql-port=33062
#gmysql-socket
gmysql-password=password
gmysql-user=user

Cela parle d'eux même, je vais pas les décrire.


La base de donnée

La structure de la database utilisée. En fait elle est reprise en partit du site de powerdns. On suppose que l'utilisateur de la base pour pdns est dns. (sinon changé l'utilisateur sur les GRANT en fin du sql ). De même on utilisera le moteur InnoDB. Si vous voulez utiliser MyISAM ou autre, supprimer le ' CONSTRAINT records_ibfk_1 FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE CASCADE' et changer les type= par le moteur voulu.

Le FOREIGN KEY permet d'effacer automatiquement toutes les entrées d'un domaine lorsque celui-ci est supprimé de la table domains. Mais , cela n'est pris en charge par MySQL que sur le moteur InnoDB.

panthera # mysql -u root -h 127.0.0.1 -P 33061 -p << EOF
 
CREATE DATABASE dns;
 
USE dns;
 
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 DEFAULT NULL,
account         VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (id)
)type=InnoDB;
 
CREATE UNIQUE INDEX name_index ON domains(name);
 
CREATE TABLE records (
id              INT AUTO_INCREMENT,
domain_id       INT DEFAULT NULL,
name            VARCHAR(255) DEFAULT NULL,
type            VARCHAR(6) DEFAULT NULL,
content         VARCHAR(255) DEFAULT NULL,
ttl             INT DEFAULT NULL,
prio            INT DEFAULT NULL,
change_date     INT DEFAULT NULL,
PRIMARY KEY(id),
CONSTRAINT records_ibfk_1 FOREIGN KEY (domain_id)
REFERENCES domains (id) ON DELETE CASCADE
)type=InnoDB;
 
 
 
CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
 
CREATE TABLE supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
);
 
GRANT SELECT ON dns.supermasters TO dns;
GRANT ALL ON dns.domains TO dns;
GRANT ALL ON dns.records TO dns;
 
EOF

Terminé pour la partie base de donnée. Bien sur, il est nécessaire, pour que le service puisse supporter de grosse charge, d'effectuer de la réplication de base, voir de faire mettre la base dns ou tables en mémoire ou d'utiliser le moteur MEMORY, etc... Mais c'est pas le but ici. J'expliquerais peut être larchitecture que je mets en place plus tard :)

test

Voilà, la configuration de base est terminé. Plus que à lancer pdns

panthera powerdns # /etc/init.d/pdns.ns01 monitor
* Starting PowerDNS (ns01) in monitor mode ...
Mar 05 16:24:18 Reading random entropy from '/dev/urandom'
Mar 05 16:24:18 This is module gmysqlbackend.so reporting
Mar 05 16:24:18 This is a standalone pdns
Mar 05 16:24:18 UDP server bound to 192.168.0.1:53
Mar 05 16:24:18 UDP server bound to 192.168.0.1:53
Mar 05 16:24:18 PowerDNS 2.9.22 (C) 2001-2009 PowerDNS.COM BV (Mar  3 2009, 00:47:34, gcc 4.1.2 (Gentoo 4.1.2 p1.1)) starting up
Mar 05 16:24:18 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Mar 05 15:24:18 Chrooted to '/home/dns/ns01'
Mar 05 15:24:18 Set effective group id to 1001
Mar 05 15:24:18 Set effective user id to 104
% Mar 05 15:24:18 Creating backend connection for TCP
Mar 05 15:24:18 gmysql Connection succesful
Mar 05 15:24:18 About to create 3 backend threads for UDP
Mar 05 15:24:18 gmysql Connection succesful
Mar 05 15:24:18 gmysql Connection succesful
Mar 05 15:24:18 gmysql Connection succesful
Mar 05 15:24:18 Done launching threads, ready to distribute questions

On insert quelque entrée dans la base pour tester.

panthera mysql # mysql -u root -h 127.0.0.1 -P 33061 -p dns << EOF
INSERT INTO domains (name, type) VALUES ('test.com', 'NATIVE');
INSERT INTO records (domain_id, name, content, type,ttl,prio)
VALUES (1,'test.com','localhost ahu@ds9a.nl 1','SOA',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
VALUES (1,'test.com','dns-us1.powerdns.net','NS',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
VALUES (1,'test.com','dns-eu1.powerdns.net','NS',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
VALUES (1,'www.test.com','199.198.197.196','A',120,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
VALUES (1,'mail.test.com','195.194.193.192','A',120,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
VALUES (1,'localhost.test.com','127.0.0.1','A',120,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio)
VALUES (1,'test.com','mail.test.com','MX',120,25);
EOF

Et on interroge le serveur dns.

panthera mysql # host -v -t SOA test.com 192.168.0.1
Trying "test.com"
Using domain server:
Name: 192.168.0.1
Address: 192.168.0.1#53
Aliases:
....
;; QUESTION SECTION:
;test.com.                      IN      SOA

;; ANSWER SECTION:
test.com.               86400   IN      SOA     localhost. ahu.ds9a.nl. 1 10800 3600 604800 3600

Received 82 bytes from 192.168.0.1 #53 in 0 ms

panthera mysql # host -v -t MX test.com 192.168.0.1
Trying "test.com"
Using domain server:
Name: 192.168.0.1
Address: 192.168.0.1#53
Aliases:
.....
;; QUESTION SECTION:
;test.com.                      IN      MX

;; ANSWER SECTION:
test.com.               120     IN      MX      25 mail.test.com.

;; ADDITIONAL SECTION:
mail.test.com.          120     IN      A       195.194.193.192

Received 63 bytes from 192.168.0.1#53 in 0 ms

Voilà, tout fonctionne.

on arrête pdns en tapant QUIT dans le terminal ou il tourne.

et on le lance en daemon

panthera powerdns # /etc/init.d/pdns.ns01 start
* Starting PowerDNS (ns01) ...                                                                                                                                                                  [ ok ]

Lancement au boot

Pour lancer pdns au boot, il suffit d'un:

panthera ~ # rc-update -a pdns.ns01 default
* pdns.ns01 added to runlevel default

Changer le default par votre runlevel.

Voila terminé.

Récupérée de « http://mysolo.org/w/index.php/Pdns »
développement
Google AdSense