C’era una volta BIND, purtroppo (lo dico per i suoi innumerevoli bug) c’è ancora ma, configurare il server DNS tramite file di testo, può risultare scomodo e lento, quindi fortunatamente hanno messo al mondo PowerDNS.

Lo uso da tantissimo tempo ma, quando tutta Internet tremava per il bug dei server DNS, sapere che PowerDNS era completamente immune a tale vulnerabilità, ha rafforzato la mia stima verso questo software.

I principali punti di forza di PowerDNS sono:

  • Backend per svariati database quali ad esempio MySQL e PostgreSQL
  • Facilità di configurazione
  • Sicurezza
  • Versatilità

Prima di procedere con l’installazione è doveroso illustrare le parti che compongono questo software:

  1. pdns-server: il server DNS vero e proprio
  2. pdns-backend-*: il backend dove sono memorizzati i dati ad esempio pdns-backend-mysql utilizzerà MySQL per memorizzare i record DNS
  3. pdns-recursor: un server necessario se si devono risolvere altri domini Internet oltre a quelli gestiti dal server

Installiamo!

Come sempre facile e veloce:

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

Si può notare non ho installato il pacchetto pdns-recursor visto che voglio configurare un server DNS che risponda solo alle query per i domini da lui gestiti.

Creiamo un database ed utente su MySQL chiamato pdns a cui diamo tutti i privilegi:

CREATE USER 'pdns'@'localhost' IDENTIFIED BY '<password_utente>';
GRANT USAGE ON * . * TO 'pdns'@'localhost' IDENTIFIED BY '<password_utente>' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
CREATE DATABASE IF NOT EXISTS `pdns` ;
GRANT ALL PRIVILEGES ON `pdns` . * TO 'pdns'@'localhost';

Inizializziamo le tabelle necessarie attraverso il file SQL incluso nel pacchetto Debian:

mysql -u pdns -p pdns < /usr/share/doc/pdns-backend-mysql/mysql.sql

Il database è pronto, inseriamo dei record di prova:

INSERT INTO `domains` (`id`, `name`, `master`, `last_check`, `type`, `notified_serial`, `account`) VALUES
(1, 'ideafactorytest.tld', NULL, NULL, 'NATIVE', NULL, NULL);
INSERT INTO `records` (`id`, `domain_id`, `name`, `type`, `content`, `ttl`, `prio`, `change_date`) VALUES
(1, 1, 'ideafactorytest.tld', 'SOA', 'ns1.ideafactorytest.tld hostmaster.ideafactorytest.tld 0 7200 3600 604800 3600', 3600, 0, 1235466538),
(2, 1, 'ideafactorytest.tld', 'NS', 'ns1.ideafactorytest.tld', 86400, 0, 1235466538),
(3, 1, 'www.ideafactorytest.tld', 'A', '192.168.1.254', 86400, 0, 1235466538),
(4, 1, 'ns1.ideafactorytest.tld', 'A', '192.168.1.254', 86400, 0, 1235466538);

Ovviamente i dati sono di test e vanno personalizzati secondo le proprie esigenze.

Consiglio di utilizzare tool di MySQL per popolare il database come ad esempio phpMyAdmin, in alternativa c’è Poweradmin che è un software scritto in PHP specifico per PowerDNS ma non mi ha convinto per niente.

Torniamo alla configurazione del server DNS.

Editiamo il file /etc/default/pdns e verifichiamo che ci sia:

START=yes

Adesso è il turno di /etc/powerdns/pdns.conf, vi consiglio di editare:

local-address=<ip_server_dns>

Altrimenti PowerDNS si mette in ascolto su tutti gli IP del server.

Ci sono altre opzioni, come l’abilitazione del webserver che consente di vedere le statistiche d’utilizzo.

Il file di configurazione è di semplice interazione quindi consiglio di dare un occhio a tutti i parametri e rimando alla documentazione ufficiale per configurazioni più elaborate.

Infine configuriamo /etc/powerdns/pdns.d/pdns.local:

launch=gmysql
gmysql-host=localhost
gmysql-user=pdns
gmysql-password=<password_scelta>
gmysql-dbname=pdns

Fine. Proviamo:

/etc/init.d/pdns monitor

Se l’output è qualcosa di simile a questo:

Apr 15 17:05:16 This is module gmysqlbackend.so reporting
Apr 15 17:05:16 This is a standalone pdns
Apr 15 17:05:16 UDP server bound to 192.168.1.254:53
Apr 15 17:05:16 TCP server bound to 192.168.1.254:53
Apr 15 17:05:16 PowerDNS 2.9.20 (C) 2001-2006 PowerDNS.COM BV (Aug  9 2008, 23:00:23, gcc 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) starting up
Apr 15 17:05:16 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.
Apr 15 17:05:16 Set effective group id to 106
Apr 15 17:05:16 Set effective user id to 106
Apr 15 17:05:16 DNS Proxy launched, local port 23998, remote 127.0.0.1:53
Apr 15 17:05:16 Creating backend connection for TCP
% Apr 15 17:05:16 gmysql Connection succesful
Apr 15 17:05:16 About to create 3 backend threads for UDP
Apr 15 17:05:16 gmysql Connection succesf
ul

Significa che PowerDNS si connette a MySQL e la configurazione è andata a buon fine.

Facciamo una query di prova:

host www.ideafactorytest.tld <ip_server_powerdns>

L’output dovrebbe essere:

Using domain server:
Name: <ip_server_powerdns>
Address: <ip_server_powerdns>#53
Aliases:
www.ideafactorytest.tld has address 192.168.1.254

Perfetto!

Come viene gestito il concetto di master/slave in PowerDNS?

Usando come backend un database MySQL, è facile mettere su un altro server sul quale configurare PowerDNS e la replica del database principale oppure, si può fare in modo che entrambi i server DNS usino lo stesso server MySQL ma questa soluzione è poco high available.

Consiglio di leggere la documentazione ufficiale al fine di ottenere il massimo da questo potente server DNS o scrivere eventuali quesiti nei commenti sperando che io riesca a rispondere!:)