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:
Haz clic en el botón Crear una cuenta. Deberías ver la siguiente pantalla:
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:
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:
Haz clic en el botón Panel de control. Deberías ver el panel de administración de PowerDNS en la siguiente pantalla:
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