Instalación de Powerdns en Debian 12
¿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
Acceso a la web de prueba
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.