PowerDNS master/slave + PowerAdmin

Je sais, il existe plein de tutoriels pour expliquer la mise en place de PowerDNS en master/slave. Seulement, j’ai du mixer plusieurs tutoriels pour arriver à quelque chose de pleinement fonctionnel.
L’objectif est d’avoir 2 PowerDNS avec backend MySQL et PowerAdmin pour l’interface de gestion.

Je suis parti sur une Debian Jessie pour ces 2 serveurs.
Il faut ajouter les repositories pour avoir accès à PowerDNS en paquet et MariaDB 10.1

Création du fichier  »/etc/apt/source.list.d/pdns.list »
deb http://repo.powerdns.com/debian jessie-auth-40 main
Création du fichier  »/etc/apt/source.list.d/maria-10.1.list »
deb [arch=i386,amd64] http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main
Mise à jour des repo et import de la clé apt


apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1B0C6205FD380FBB # repo powerdns
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CBCB082A1BB943DB #repo mariadb
apt-get update

Installation et configuration des services sur le master

PowerDNS

Installation

On installe d’abord PowerDNS avec le backend MySQL

apt-get install pdns-server pdns-backend-mysql pdns-recursor pdns-tools mariadb-server

Ensuite, on créé la base de données et l’utilisateur associé ainsi que la définition du serveur master (indispensable pour la réplication):

DROP DATABASE powerdns;
CREATE DATABASE powerdns character set utf8;
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY '******';
FLUSH PRIVILEGES;
USE powerdns;
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)
) Engine=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(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;

CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername);

CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) NOT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;

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) NOT NULL,
comment VARCHAR(64000) NOT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);

CREATE TABLE domainmetadata (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
kind VARCHAR(32),
content TEXT,
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);

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;

CREATE INDEX domainidindex ON cryptokeys(domain_id);

CREATE TABLE tsigkeys (
id INT AUTO_INCREMENT,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

INSERT INTO supermasters VALUES ('192.168.0.1','ns1.int.core-us.fr','admin');
exit

Il suffit ensuite d’appeler le script pour (re)créer la base:

mysql /root/powerdns.sql

Configuration

On supprime les fichiers dans  »/etc/powerdns/pdns.d/ »

rm /etc/powerdns/pdns.d/*

On crée le fichier de connexion à la base mariadb : /etc/powerdns/pdns.d/pdns.local.gmysql.conf

# MySQL Configuration file
launch=gmysql
gmysql-host=localhost
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=********

On édite le fichier /etc/powerdns/pdns.conf pour définir le mode de fonctionnement:

allow-recursion=0.0.0.0/0
allow-axfr-ips=192.168.0.2/32
config-dir=/etc/powerdns
daemon=yes
disable-axfr=no
guardian=yes
local-address=0.0.0.0
local-port=53
log-dns-details=on
#log-failed-updates=on
loglevel=3
module-dir=/usr/lib/x86_64-linux-gnu/pdns
master=yes
slave=no
setgid=pdns
setuid=pdns
socket-dir=/var/run
version-string=powerdns
include-dir=/etc/powerdns/pdns.d

PowerAdmin

L’interface web est installée sur le master uniquement et nécessite Apache2 et PHP\\

apt-get install -y apache2 gettext libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php-pear php5-imap php5-mysql php5-xmlrpc php5-mhash php5-mcrypt

On récupère l’archive via le site : http://www.poweradmin.org/ ; on dépose le fichier dans /home/www et on décompresse l’archive :

cd /home/www/
tar zxvf poweradmin-2.1.7.tgz
chown -R www-data: poweradmin-2.1.7

On créé ensuite le vhost pour avoir accès à l’interface :
/etc/apache2/sites-available/pdns.conf

ServerName pdns.core-us.fr
ServerAdmin webm@core-us.fr
DocumentRoot /var/www/poweradmin-2.1.7/
ErrorLog ${APACHE_LOG_DIR}/pdns_error.log
CustomLog ${APACHE_LOG_DIR}/pdns_access.log combined
<Directory /home/www/poweradmin-2.1.7/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Installation et configuration des services sur le slave

PowerDNS

Installation

On installe d’abord PowerDNS avec le backend MySQL

apt-get install pdns-server pdns-backend-mysql pdns-tools mariadb-server

Il convient ensuite de créer la base de données. Pour cela, 2 méthodes :
– on lance le même script que pour le master
– on fait un dump de la base du master pour l’importer sur le slave

Configuration

On supprime les fichiers dans /etc/powerdns/pdns.d/

rm /etc/powerdns/pdns.d/*

Puis on créé le fichier de connexion à la base mariadb : /etc/powerdns/pdns.d/pdns.local.gmysql.conf

# MySQL Configuration file
launch=gmysql
gmysql-host=localhost
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=********

Et le fichier de configuration /etc/powerdns/pdns.conf

allow-recursion=0.0.0.0/0
config-dir=/etc/powerdns
daemon=yes
disable-axfr=yes
guardian=yes
launch=gmysql
local-address=0.0.0.0
local-port=53
log-dns-details=on
loglevel=3
master=no
module-dir=/usr/lib/x86_64-linux-gnu/pdns/
recursor=8.8.8.8
setgid=pdns
setuid=pdns
slave=yes
slave-cycle-interval=60
socket-dir=/var/run
version-string=powerdns
include-dir=/etc/powerdns/pdns.d