Instalación de Powerdns en Debian 12

powerdns

¿Que es powerdns?

Powerdns es un servidor de nombres de dominio (DNS) moderno, de alto rendimiento y extensible. Permite a los administradores de sistemas alojar sus propios servidores de nombres, ya sea para uso público o privado. Su arquitectura modular permite a los administradores de sistemas elegir entre una variedad de backends de almacenamiento de datos, incluidos BIND zonefiles, bases de datos relacionales o bases de datos NoSQL.

Requisitos

  • Sistema Debian 12 actualizado.
  • Privilegios de root o sudo.
  • Acceso a internet.

Instalación

Al instalar PowerDNS, tenemos pensar en el backend que vamos a utilizar para almacenar los datos de DNS. En este caso vamos a utilizar MariaDB.

Si queremos utilizar otro backend, podemos encontrar mas información en la documentación oficial de PowerDNS.

Instalamos powerdns y los paquetes necesarios para el backend de MariaDB:

root@powerdns:~# apt install mariadb-server mariadb-client pdns-server pdns-backend-mysql -y

Ahora vamos a crear la base de datos y el usuario para powerdns:

root@powerdns:~# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE powerdns;
grant all privileges on powerdns.* to powerdns_user identified by 'password' with grant option;
flush privileges;
exit

Añadimos el contenido del esquema de la base de datos:

root@powerdns:~# mysql -u root -p powerdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql

Ahora vamos a configurar el backend de MariaDB, para ello vamos a editar el archivo de configuración de powerdns:

root@powerdns:~# nano /etc/powerdns/pdns.conf

Buscamos la sección de launch y la modificamos de la siguiente manera:

launch=gmysql
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns_user
gmysql-password=password
gmysql-dnssec=yes

Reiniciamos el servicio de powerdns:

root@powerdns:~# systemctl restart pdns

Ya tenemos instalado powerdns y configurado con el backend de MariaDB.

Configuración

Ahora para probar que todo funciona correctamente vamos a crear una zona de prueba llamada ’example.local’ con los siguientes registros:

| Tipo | Nombre | Valor | | A | dns.example.local | 192.168.50.42 | | A | <www.example.local> | 192.168.50.25 | | CNAME | prueba.example.local | <www.example.local> |

Para ello vamos a utilizar la herramienta pdnsutil:

root@powerdns:~# pdnsutil create-zone example.local

Añadimos los registros:

root@powerdns:~# pdnsutil add-record example.local dns A 192.168.50.42
root@powerdns:~# pdnsutil add-record example.local dns A 192.168.50.25
root@powerdns:~# pdnsutil add-record example.local prueba CNAME www.example.local

Comprobamos que los registros se han añadido correctamente:

root@powerdns:~# pdnsutil list-zone example.local

Oct 22 19:44:03 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
$ORIGIN .
dns.example.local       3600    IN      A       192.168.50.42
example.local   3600    IN      SOA     a.misconfigured.dns.server.invalid hostmaster.example.local 0 10800 3600 604800 3600
prueba.example.local    3600    IN      CNAME   www.example.local.
www.example.local       3600    IN      A       192.168.50.25

Si nos cuesta utilizar pdnsutil, podemos añadir los registros manualmente en la base de datos, aunque no es lo mas habitual:

Los registros que hemos añadido con pdnsutil podemos añadirlos manualmente de la siguiente manera:

root@powerdns:~# mysql -u powerdns_user -p
MariaDB [(none)]> use powerdns;
MariaDB [powerdns]> INSERT INTO records (domain_id, name, type, content, ttl, prio) SELECT id, 'dns.example.local', 'A', '192.168.50.42', 3600, 0 FROM domains WHERE name='example.local';
Query OK, 1 row affected (0,003 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [powerdns]> INSERT INTO records (domain_id, name, type, content, ttl, prio) SELECT id, 'www.example.local', 'A', '192.168.50.25', 3600, 0 FROM domains WHERE name='example.local';
Query OK, 1 row affected (0,002 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [powerdns]> INSERT INTO records (domain_id, name, type, content, ttl, prio) SELECT id, 'prueba.example.local', 'CNAME', 'www.example.local', 3600, 0 FROM domains WHERE name='example.local';
Query OK, 1 row affected (0,002 sec)
Records: 1  Duplicates: 0  Warnings: 0

Comprobamos que los registros se han añadido correctamente:

MariaDB [powerdns]> SELECT * FROM records WHERE domain_id IN (SELECT id FROM domains WHERE name='example.local');

+----+-----------+----------------------+-------+--------------------------------------------------------------------------------------+------+------+----------+-----------+------+
| id | domain_id | name                 | type  | content                                                                              | ttl  | prio | disabled | ordername | auth |
+----+-----------+----------------------+-------+--------------------------------------------------------------------------------------+------+------+----------+-----------+------+
|  1 |         1 | example.local        | SOA   | a.misconfigured.dns.server.invalid hostmaster.example.local 0 10800 3600 604800 3600 | 3600 |    0 |        0 | NULL      |    1 |
|  5 |         1 | dns.example.local    | A     | 192.168.50.11                                                                        | 3600 |    0 |        0 | NULL      |    1 |
|  6 |         1 | www.example.local    | A     | 192.168.50.25                                                                        | 3600 |    0 |        0 | NULL      |    1 |
|  7 |         1 | prueba.example.local | CNAME | www.example.local                                                                    | 3600 |    0 |        0 | NULL      |    1 |
+----+-----------+----------------------+-------+--------------------------------------------------------------------------------------+------+------+----------+-----------+------+
4 rows in set (0,000 sec)

Prueba desde un cliente

Ahora vamos a probar que todo funciona correctamente desde un cliente, para ello vamos a utilizar la herramienta dig y accederemos desde el cliente a la web de prueba:

prueba con dig

root@power-cli1:~# dig @192.168.50.42 dns.example.local

; <<>> DiG 9.18.19-1~deb12u1-Debian <<>> @192.168.50.42 dns.example.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7162
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;dns.example.local.             IN      A

;; ANSWER SECTION:
dns.example.local.      3600    IN      A       192.168.50.11

;; Query time: 0 msec
;; SERVER: 192.168.50.42#53(192.168.50.42) (UDP)
;; WHEN: Sun Oct 22 20:11:58 CEST 2023
;; MSG SIZE  rcvd: 62

prueba con el navegador

Acceso a la web principal

web1

Acceso a la web de prueba

web2

Como podemos ver, las comprobaciones han sido correctas y podemos resolver con nuestro servidor de DNS sin problemas.

Con esto ya tenemos instalado y configurado PowerDNS en Debian 12.