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:
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 página de inicio de sesión del administrador PowerDNS en la siguiente pantalla:
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:
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:
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 en el servidor Ubuntu 20.04. Ahora puedes crear zonas y añadir registros a través de la interfaz web de PowerDNS admin.