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é.
