Cómo instalar PowerDNS Server y PowerDNS Admin en Ubuntu 20.04

PowerDNS es un servidor de nombres autorizado gratuito y de código abierto. Está escrito en C++ y funciona en los sistemas operativos Unix, Linux y macOS. Utiliza MySQL, MariaDB, PostgreSQL y Oracle para almacenar archivos de zona y registros.

PowerDNS Admin es una herramienta basada en web que se utiliza para gestionar PowerDNS. Puedes crear y gestionar zonas DNS utilizando el navegador web. Incluye un amplio conjunto de funciones. Algunas de ellas se enumeran a continuación:

  • Soporte IPv4 e IPv6
  • Página de estado que muestra información útil
  • Creación/actualización automática de registros PTR inversos
  • Soporte para la creación masiva de dominios
  • Soporte para plantillas de dominio
  • Soporte DNSSec
  • Soporte de autenticación de usuario de BD local, SAML, LDAP, Active Directory

En este tutorial, te mostraremos cómo instalar PowerDNS y PowerDNS admin en un servidor Ubuntu 20.04.

Requisitos previos

  • Un servidor con Ubuntu 20.04.
  • Un nombre de dominio válido apuntado con la IP de tu servidor.
  • Una contraseña de root está configurado el servidor.

Instalar y configurar el servidor MariaDB

Antes de empezar, tendrás que instalar el servidor de bases de datos MariaDB en tu sistema. Por defecto, la última versión de MariaDB no está disponible en el repositorio por defecto de Ubuntu 20.04. Así que tendrás que añadir el repositorio de MariaDB a tu sistema.

Primero, instala los paquetes necesarios con el siguiente comando:

apt-get install software-properties-common gnupg2 -y

Una vez instalados todos los paquetes, añade la clave de firma de MariaDB con el siguiente comando:

apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'

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

add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirrors.ukfast.co.uk/sites/mariadb/repo/10.5/ubuntu focal main'

A continuación, instala el servidor MariaDB ejecutando el siguiente comando:

apt-get install mariadb-server -y

Una vez instalado, 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

En primer lugar, 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, tendrás que importar el esquema de la base de datos PowerDNS a la base de datos PowerDNS. Puedes importarlo con el siguiente comando:

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

A continuación, tendrás que definir los detalles de conexión a la base de datos PowerDNS. Puedes hacerlo editando el archivo pdns.local.gmysql.conf:

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

Cambia 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, da el permiso adecuado al archivo pdns.local.gmysql.conf:

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

A continuación, detén el servidor PowerDNS y verifica 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:

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

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

systemctl start pdns

En este punto, 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=33140,fd=5))                                         
tcp     LISTEN   0        128              0.0.0.0:53             0.0.0.0:*      users:(("pdns_server",pid=33140,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 de Node.js con el siguiente comando:

curl -sL https://deb.nodesource.com/setup_14.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

Definir 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 y reinicia el servicio PowerDNS para aplicar los cambios:

systemctl restart pdns

Configurar Nginx para PowerDNS Admin

A continuación, tendrás que configurar Nginx para PowerDNS admin. Para ello, crea un archivo de configuración del 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 y, a continuación, comprueba si 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 y, a continuación, 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 y, a continuación, 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 Mon 2020-11-02 10:54:19 UTC; 5s ago
TriggeredBy: ? pdnsadmin.socket
   Main PID: 38881 (gunicorn)
      Tasks: 2 (limit: 2353)
     Memory: 62.5M
     CGroup: /system.slice/pdnsadmin.service
             ??38881 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>
             ??38898 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>

Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Started PowerDNS-Admin.
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Starting gunicorn 20.0.4
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Listening at: unix:/run/pdnsadmin/socket (38881)
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Using worker: sync
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38898]: [2020-11-02 10:54:19 +0000] [38898] [INFO] Booting worker with pid: 38898

? pdnsadmin.socket - PowerDNS-Admin socket
     Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-02 10:54:19 UTC; 5s ago
   Triggers: ? pdnsadmin.service
     Listen: /run/pdnsadmin/socket (Stream)
     CGroup: /system.slice/pdnsadmin.socket

Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Listening on PowerDNS-Admin socket.

Accede a la interfaz web de PowerDNS Admin

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

Inicio de sesión de administrador PowerDNS

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

Crear una cuenta

Proporciona tus datos de usuario administrador y haz clic en el botón Registrar para crear una cuenta. Deberías ver la página de inicio de sesión del administrador PowerDNS en la siguiente pantalla:

Iniciar sesión

Proporciona tu nombre de usuario admin, contraseña y haz clic en el botón Iniciar sesión. Deberías ver la interfaz web del administrador PowerDNS en la siguiente página:

Panel de administración PowerDNS

Aquí, 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:

API PowerDNS configurada

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

El panel de control de tu servidor PowerDNS

Conclusión

Enhorabuena! has instalado y configurado correctamente PowerDNS y PowerDNS admin en el servidor Ubuntu 20.04. Ahora puedes crear zonas y añadir registros a través de la interfaz web de PowerDNS admin.

También te podría gustar...