Cómo instalar PowerDNS y PowerDNS-Admin en Ubuntu 22.04

PowerDNS es un servidor de nombres autorizado gratuito y de código abierto escrito en C++. Es multiplataforma y puede ejecutarse en sistemas operativos Unix, Linux y macOS. Es compatible con varias bases de datos, como MySQL, MariaDB, PostgreSQL y Oracle, para almacenar archivos y registros de zona.

PowerDNS Admin es una aplicación basada en web que se puede utilizar para gestionar PowerDNS a través de un navegador web. Te permite crear y gestionar zonas DNS utilizando la interfaz web de PowerDNS. Ofrece funciones muy útiles, como compatibilidad con IPv4 e IPv6, dominio masivo, compatibilidad con DNSSec, autenticación AD, LDAP y SAML, entre otras.

En este post, explicaremos cómo instalar PowerDNS y PowerDNS admin en el servidor Ubuntu 22.04.

Requisitos previos

  • Un servidor que ejecute Ubuntu 22.04.
  • Un nombre de dominio válido apuntado con la IP de tu servidor.
  • Una contraseña de root configurada en el servidor.

Instalar y configurar el servidor MariaDB

En primer lugar, tendrás que instalar el servidor de bases de datos MariaDB en tu sistema.

apt-get install mariadb-server -y

Una vez instalado MariaDB, tendrás que crear una base de datos y un usuario para PowerDNS.

En primer lugar, inicia sesión en MariaDB con el siguiente comando:

mysql

Una vez iniciada la sesión, crea una base de datos y un usuario con el siguiente comando:

MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to pdnsadmin@localhost identified by 'password';

A continuación, vacía los privilegios y sal del intérprete de comandos de MariaDB con el siguiente comando:

MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;

Instalar PowerDNS

Antes de empezar, tendrás que desactivar el servicio systemd-resolved de tu sistema. Puedes desactivarlo con el siguiente comando:

systemctl disable --now systemd-resolved

A continuación, elimina el archivo resolv.conf predeterminado y crea uno nuevo:

rm -rf /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf

A continuación, instala el servidor PowerDNS con el siguiente comando:

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

Una vez instalado el PowerDNS, puedes pasar al siguiente paso.

Configurar PowerDNS

En primer lugar, importa el esquema de la base de datos PowerDNS a la base de datos PowerDNS con el siguiente comando:

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

A continuación, tendrás que crear un archivo de configuración PowerDNS y definir los detalles de conexión a la base de datos PowerDNS:

nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Añade las siguientes líneas:

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdnsadmin
gmysql-password=password
gmysql-dnssec=yes
# gmysql-socket=

Guarda y cierra el archivo y, a continuación, establece los permisos adecuados para el archivo pdns.local.gmysql.conf:

chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

A continuación, detén el servidor PowerDNS y prueba el PowerDNS con el siguiente comando:

systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9

Si todo va bien, deberías obtener la siguiente salida:

Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 06 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Aug 06 10:43:47 Done launching threads, ready to distribute questions

A continuación, inicia el servidor PowerDNS con el siguiente comando:

systemctl start pdns

Ahora puedes comprobar el estado del PowerDNS con el siguiente comando:

systemctl status pdns

Deberías ver la siguiente salida:

? pdns.service - PowerDNS Authoritative Server
     Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-08-06 10:37:28 UTC; 8s ago
       Docs: man:pdns_server(1)
             man:pdns_control(1)
             https://doc.powerdns.com
   Main PID: 93982 (pdns_server)
      Tasks: 8 (limit: 2242)
     Memory: 43.1M
        CPU: 166ms
     CGroup: /system.slice/pdns.service
             ??93982 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no

Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: UDP server bound to [::]:53
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to 0.0.0.0:53
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: TCP server bound to [::]:53
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS Authoritative Server 4.5.3 (C) 2001-2021 PowerDNS.COM BV
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: Using 64-bits mode. Built using gcc 11.2.0.
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redi>
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: Creating backend connection for TCP
Aug 06 10:37:28 ubuntu2204 systemd[1]: Started PowerDNS Authoritative Server.
Aug 06 10:37:28 ubuntu2204 pdns_server[93982]: About to create 3 backend threads for UDP
Aug 06 10:37:29 ubuntu2204 pdns_server[93982]: Done launching threads, ready to distribute questions

En este momento, PowerDNS está iniciado y escuchando en el puerto 53. Puedes comprobarlo con el siguiente comando

ss -alnp4 | grep pdns

Deberías obtener la siguiente salida:

udp   UNCONN 0      0             0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=5))
tcp   LISTEN 0      128           0.0.0.0:53         0.0.0.0:*    users:(("pdns_server",pid=93982,fd=7))

Instalar PowerDNS Admin

En esta sección, te mostraremos cómo instalar PowerDNS admin con Nginx.

Instalar las dependencias necesarias

En primer lugar, instala todas las dependencias necesarias para PowerDNS admin con el siguiente comando:

apt-get install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask -y

Una vez instaladas todas las dependencias, añade el repositorio Node.js con el siguiente comando:

curl -sL https://deb.nodesource.com/setup_16.x | bash -

A continuación, instala el Node.js con el siguiente comando:

apt-get install nodejs -y

A continuación, añade el repositorio de yarn con el siguiente comando:

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

A continuación, actualiza el repositorio e instala Yarn con el siguiente comando:

apt-get update -y
apt-get install yarn -y

En este punto, todas las dependencias necesarias están instaladas, ahora puedes proceder al siguiente paso.

Descarga PowerDNS Admin

A continuación, descarga la última versión de PowerDNS admin desde el repositorio Git al directorio raíz de Nginx:

git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns

A continuación, cambia el directorio al directorio descargado y crea un entorno virtual Python con el siguiente comando:

cd /var/www/html/pdns/
virtualenv -p python3 flask

A continuación, activa el entorno virtual e instala todas las dependencias de Python con el siguiente comando:

source ./flask/bin/activate
pip install -r requirements.txt

A continuación, desactiva el entorno virtual con el siguiente comando:

deactivate

Configurar la conexión a la base de datos

A continuación, tendrás que definir los detalles de la conexión a la base de datos PowerDNS en el archivo default_config.py:

nano /var/www/html/pdns/powerdnsadmin/default_config.py

Cambia las siguientes líneas:

SALT = 'yoursecretekey'
SECRET_KEY = 'yoursecretekey'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
HSTS_ENABLED = False
OFFLINE_MODE = False

SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'password'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True

Guarda y cierra el archivo, luego cambia el directorio al pdns y activa el entorno virtual:

cd /var/www/html/pdns/
source ./flask/bin/activate

A continuación, actualiza la base de datos con el siguiente comando:

export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
yarn install --pure-lockfile
flask assets build

A continuación, desactiva el entorno virtual con el siguiente comando:

deactivate

Activar la API PowerDNS Admin

PowerDNS admin utiliza la API JSON para leer estadísticas y modificar el contenido de las zonas, los metadatos y el material de las claves DNSSEC. Puedes habilitarla editando el archivo pdns.conf:

nano /etc/powerdns/pdns.conf

Cambia las siguientes líneas:

api=yes
api-key=yoursecretekey

Guarda y cierra el archivo, luego reinicia el servicio PowerDNS para aplicar los cambios:

systemctl restart pdns

Configurar Nginx como proxy inverso para PowerDNS Admin

A continuación, tendrás que configurar el Nginx como proxy inverso para el admin PowerDNS. Para ello, crea un archivo de configuración de host virtual Nginx con el siguiente comando:

nano /etc/nginx/conf.d/pdns-admin.conf

Añade las siguientes líneas:

server {
  listen	*:80;
  server_name               pdnsadmin.example.com;

  index                     index.html index.htm index.php;
  root                      /var/www/html/pdns;
  access_log                /var/log/nginx/pdnsadmin_access.log combined;
  error_log                 /var/log/nginx/pdnsadmin_error.log;

  client_max_body_size              10m;
  client_body_buffer_size           128k;
  proxy_redirect                    off;
  proxy_connect_timeout             90;
  proxy_send_timeout                90;
  proxy_read_timeout                90;
  proxy_buffers                     32 4k;
  proxy_buffer_size                 8k;
  proxy_set_header                  Host $host;
  proxy_set_header                  X-Real-IP $remote_addr;
  proxy_set_header                  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_headers_hash_bucket_size    64;

  location ~ ^/static/  {
    include  /etc/nginx/mime.types;
    root /var/www/html/pdns/powerdnsadmin;

    location ~*  \.(jpg|jpeg|png|gif)$ {
      expires 365d;
    }

    location ~* ^.+.(css|js)$ {
      expires 7d;
    }
  }

  location / {
    proxy_pass            http://unix:/run/pdnsadmin/socket;
    proxy_read_timeout    120;
    proxy_connect_timeout 120;
    proxy_redirect        off;
  }

}

Guarda y cierra el archivo, después comprueba si el Nginx tiene algún error de sintaxis con el siguiente comando:

nginx -t

Deberías obtener la siguiente salida:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

A continuación, cambia la propiedad del pdns a www-data:

chown -R www-data:www-data /var/www/html/pdns

Por último, reinicia el servicio Nginx para aplicar los cambios:

systemctl restart nginx

Crear un archivo de servicio Systemd para PowerDNS Admin

A continuación, tendrás que crear un archivo de servicio systemd para administrar el servicio PowerDNS.

En primer lugar, crea un archivo de servicio pdns con el siguiente comando:

nano /etc/systemd/system/pdnsadmin.service

Añade las siguientes líneas:

[Unit]
Description=PowerDNS-Admin
Requires=pdnsadmin.socket
After=network.target

[Service]
PIDFile=/run/pdnsadmin/pid
User=pdns
Group=pdns
WorkingDirectory=/var/www/html/pdns
ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Guarda y cierra el archivo, después crea un archivo pdnsadmin sockt con el siguiente comando:

nano /etc/systemd/system/pdnsadmin.socket

Añade las siguientes líneas:

[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/pdnsadmin/socket

[Install]
WantedBy=sockets.target

Guarda y cierra el archivo, luego crea los archivos y directorios necesarios con el siguiente comando:

echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
mkdir /run/pdnsadmin/
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/

A continuación, recarga el demonio systemd con el siguiente comando:

systemctl daemon-reload

A continuación, activa el servicio pdnsadmin para que se inicie al reiniciar el sistema con el siguiente comando:

systemctl enable --now pdnsadmin.service pdnsadmin.socket

A continuación, verifica el estado de ambos servicios con el siguiente comando:

systemctl status pdnsadmin.service pdnsadmin.socket

Deberías obtener la siguiente salida:

? pdnsadmin.service - PowerDNS-Admin
     Loaded: loaded (/etc/systemd/system/pdnsadmin.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-08-06 10:52:44 UTC; 9s ago
TriggeredBy: ? pdnsadmin.socket
   Main PID: 98696 (gunicorn)
      Tasks: 2 (limit: 2242)
     Memory: 63.1M
        CPU: 913ms
     CGroup: /system.slice/pdnsadmin.service
             ??98696 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>
             ??98697 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdns>

Aug 06 10:52:44 ubuntu2204 systemd[1]: Started PowerDNS-Admin.
Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Starting gunicorn 20.0.4
Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Listening at: unix:/run/pdnsadmin/socket (98696)
Aug 06 10:52:44 ubuntu2204 gunicorn[98696]: [2022-08-06 10:52:44 +0000] [98696] [INFO] Using worker: sync
Aug 06 10:52:44 ubuntu2204 gunicorn[98697]: [2022-08-06 10:52:44 +0000] [98697] [INFO] Booting worker with pid: 98697

? pdnsadmin.socket - PowerDNS-Admin socket
     Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-08-06 10:52:44 UTC; 9s ago
   Triggers: ? pdnsadmin.service
     Listen: /run/pdnsadmin/socket (Stream)
     CGroup: /system.slice/pdnsadmin.socket

Aug 06 10:52:44 ubuntu2204 systemd[1]: Listening on PowerDNS-Admin socket.

Acceder a PowerDNS Admin

Ahora puedes abrir tu navegador web y acceder a la interfaz web del administrador PowerDNS utilizando la URL http://pdnsadmin.example.com. Serás redirigido a la siguiente página:

Administrador PowerDNS

Haz clic en el botón Crear una cuenta. Deberías ver la siguiente pantalla:

Establecer nueva contraseña

Proporciona tus datos de usuario administrador y haz clic en el botón Registrar para crear una cuenta. Deberías ver la interfaz web de administración PowerDNS en la siguiente pantalla:

Panel de administración PowerDNS

Proporciona la URL de la API PowerDNS para conectarte a PowerDNS y gestionarlo. A continuación, haz clic en el botón Actualizar para guardar los cambios. Deberías ver la siguiente página:

Configuración PDNS

Haz clic en el botón Panel de control. Deberías ver el panel de administración de PowerDNS en la siguiente pantalla:

Cuadro de mandos

Conclusión

Enhorabuena! has instalado y configurado correctamente PowerDNS y PowerDNS admin con Nginx en el servidor Ubuntu 22.04. Ahora puedes crear zonas y añadir registros a través de la interfaz web de PowerDNS admin y luego probarlo. No dudes en preguntarme si tienes alguna duda

También te podría gustar...