PowerDNS sobre Docker o Podman, fácil y rápido 1

PowerDNS sobre Docker o Podman, fácil y rápido

Que es PowerDNS y DNS como servicio crítico

PowerDNS es un servidor DNS, siendo este un servicio especialmente crítico en cualquier infraestructura que deseemos desplegar, ya que es el principal punto de conexión entre servicios y operadores.

Si de todas las opciones que nos encontramos cuando buscamos un servidor DNS (podemos ver una larga lista en https://en.wikipedia.org/wiki/Comparison_of_DNS_server_software) buscamos las tres siguientes condiciones: que se pueda gestionar fácilmente, despliegue sencillo y OpenSource nos vamos a quedar en una solo opción: PowerDNS y para su gestión PowerDNS-admin.

PowerDNS ( cuyo desarrollo se puede ver en https://github.com/PowerDNS/pdns y tiene más de 1800 estrellas) es un potente servidor DNS cuya características más interesantes para la gestión son disponer de un servicio web con una potente API y ser capaz de almacenar la información en bases de datos, como MySQL.

Y seleccionamos PowerDNS-Admin por dos razones: Está activamente mantenido (https://github.com/ngoduykhanh/PowerDNS-Admin, más de 750 estrellas) y visualmente es un entorno más amigable al tener un formato parecido al que las herramientas de RedHat están usando actualmente.

¿Porqué PowerDNS con PowerDNS-Admin?

Porque conforman un potente paquete donde tenemos las siguientes ventajas:

  • Fácil de instalar
  • Fácil de mantener
  • Interfaz intuitivo
  • Todo está guardado en una base de datos (lo que facilita replicación, copias de seguridad, alta disponibilidad, etc).
  • No requiere configuración especial del navegador (como es el caso de RedHat IDM que requiere instalar el certificado del servidor).
  • Para la gestión de los operadores dispone de autenticación contra múltiples fuentes (LDAP, AD, SAML, Github, Google, etc).
  • Dispone de control sobre los permisos de acceso a los dominios

A estas ventajas hay que unirles la existencia de múltiples contenedores que facilitan sobremanera como desplegar y actualizar está solución.

PowerDNS sobre Docker o Podman, fácil y rápido 2

Desplegar PowerDNS con Docker-Composer

La solución con PowerDNS consta de tres partes: el servidor dns, para el cual haremos uso de contenedor pschiffe/pdns-mysql:alpine (https://github.com/pschiffe/docker-pdns/tree/master/pdns), el servidor de base de datos mariadb a través del contenedor yobasystems/alpine-mariadb
(https://github.com/yobasystems/alpine-mariadb) y el contenedor aescanero/powerdns-admin que hemos explicado en un post anterior (Docker: Reducir el tamaño de un contenedor).

Es importante indicar que los tres contenedores tienen un mantenimiento activo y son de reducido tamaño, lo que permite un rápido despliegue. Los puertos 53/UDP y 9191/TCP deben de estar disponibles en la máquina que ejecute los contenedores.

Para poder dotar de espacio de almacenamiento en la base de datos se le ha añadido un volumen a la base de datos mariadb, para obtener de esa manera persistencia en la configuración de los elementos que conforman la solución.

$ mkdir ~/mysql
$ git clone https://github.com/aescanero/docker-powerdns-admin-alpine
$ cd docker-powerdns-admin-alpine
$ export LOCALPATH="~/mysql"
$ export DOMAIN="disasterproject.com"
$ export DB_USERNAME="powerdns"
$ export DB_USER_PASSWORD="password"
$ export DB_ROOT_PASSWORD="password"
$ export DB_NAME="powerdns"
$ export PDNS_API_KEY="random"
$ docker-compose up -d
$ docker-compose ps

Una vez desplegada la solución accedemos a ella a la URL: http://WHERE_IS_RUNNING_DOCKER:9191 donde se nos aparece la pantalla de inicio de sesión que veremos en la última sección.

Para eliminar el despliegue realizado (excepto la base de datos que tenemos en ~/mysql) ejecutamos:

$ cd ~/docker-powerdns-admin-alpine
$ docker-compose stop
$ docker-compose rm

Desplegar PowerDNS con Podman

Una opción incluso más rápida es desplegar el entorno con Podman (del cual hemos hablado en Elegir entre Docker o Podman para entornos de pruebas y desarrollo y que nos permite lanzar los contenedores explicados en el punto anterior con la diferencia de que se ejecutan en linea y no mediante un guión como el caso anterior.

A diferencia del caso anterior nos obliga a gestionar la red interna de los contenedores, en este caso hemos elegido 10.88.0.254 para el servidor de base de datos, 10.88.0.253 para powerdns-admin y 10.88.0.252, los puertos 53/UDP y 9191/TCP deben de estar disponibles en la máquina que ejecute los contenedores.

mkdir ~/mysql
export LOCALPATH=`pwd`"/mysql"
export DOMAIN="disasterproject.com"
export DB_USERNAME="powerdns"
export DB_USER_PASSWORD="password"
export DB_ROOT_PASSWORD="password"
export DB_NAME="powerdns"
export PDNS_API_KEY="random"

sudo podman run -d -v ${LOCALPATH}:/var/lib/mysql \
-e MYSQL_PASSWORD="${DB_USER_PASSWORD}" \
-e MYSQL_DATABASE="${DB_NAME}" \
-e MYSQL_USER="${DB_USERNAME}" \
-e MYSQL_ROOT_PASSWORD="${DB_ROOT_PASSWORD}" \
--ip 10.88.0.254 --name mysql yobasystems/alpine-mariadb

sudo podman run -d \
-e PDNS_api_key="secret" \
-e PDNS_master="yes" \
-e PDNS_api="yes" \
-e PDNS_webserver="yes" \
-e PDNS_webserver_address="0.0.0.0" \
-e PDNS_webserver_allow_from="0.0.0.0/0" \
-e PDNS_webserver_password="secret" \
-e PDNS_version_string="anonymous" \
-e PDNS_default_ttl="1500" \
-e PDNS_soa_minimum_ttl="1200" \
-e PDNS_default_soa_name="ns1.${DOMAIN}" \
-e PDNS_default_soa_mail="hostmaster.${DOMAIN}" \
-e MYSQL_ENV_MYSQL_HOST="10.88.0.254" \
-e MYSQL_ENV_MYSQL_PASSWORD="${DB_USER_PASSWORD}" \
-e MYSQL_ENV_MYSQL_DATABASE="${DB_NAME}" \
-e MYSQL_ENV_MYSQL_USER="${DB_USERNAME}" \
-e MYSQL_ENV_MYSQL_ROOT_PASSWORD="${DB_ROOT_PASSWORD}" \
-p 53:53 --ip 10.88.0.252 --name powerdns pschiffe/pdns-mysql:alpine

sudo podman run -d -e PDNS_PROTO="http" \
-e PDNS_API_KEY="${PDNS_API_KEY}" \
-e PDNS_HOST="10.88.0.252" \
-e PDNS_PORT="8081" \
-e PDNSADMIN_SECRET_KEY="secret" \
-e PDNSADMIN_SQLA_DB_HOST="10.88.0.254" \
-e PDNSADMIN_SQLA_DB_PASSWORD="${DB_USER_PASSWORD}" \
-e PDNSADMIN_SQLA_DB_NAME="${DB_NAME}" \
-e PDNSADMIN_SQLA_DB_USER="${DB_USERNAME}" \
-p 9191:9191 --ip 10.88.0.253 --name powerdns-admin aescanero/powerdns-admin

Una vez desplegada la solución accedemos a ella a la URL: http://WHERE_IS_RUNNING_PODMAN:9191 donde se nos aparece la pantalla de inicio de sesión que veremos en la última sección.

Desplegar PowerDNS en Kubernetes

Para desplegar este paquete de gestión DNS en Kubernetes, que se realizará en el post Helm v3 para desplegar PowerDNS sobre Kubernetes haremos uso de Helm y al igual que en Como lanzar un paquete (Chart) de Helm sin instalar Tiller veremos que en Helm v3 no se requiere el uso de Tiller.

Accediendo a PowerDNS-Admin

Una vez abierta la consola accedemos al inicio de sesión, donde nuestro primer paso será crear una cuenta entrando en “Create an account”

PowerDNS sobre Docker o Podman, fácil y rápido 3

Este primer usuario será un administrador de PowerDNS y será el que nos debe permitir crear nuevos usuarios, dominios y los permisos de acceso. Creamos el usuario “admin”:

PowerDNS sobre Docker o Podman, fácil y rápido 4

Una vez creado el registro de “admin” procedemos a iniciar sesión:

PowerDNS sobre Docker o Podman, fácil y rápido 5

Que nos permite acceder a la consola de gestión y en el menú de la izquierda vemos la parte de configuración, en donde seleccionaremos “Authentication”:

PowerDNS sobre Docker o Podman, fácil y rápido 6

En los parámetros de configuración, lo primero que hemos de quitar es “Allow users to sign up” para no permitir nuevos registros desde el área de inicio de sesión y si es necesario configurar cualquier medio de autenticación externo que nos ofrece la plataforma.

PowerDNS sobre Docker o Podman, fácil y rápido 7

El siguiente paso es ir a la sección “New Domain” para la creación de nuevos dominios y posteriormente a la sección “Users” donde crearemos nuevos usuarios.

PowerDNS sobre Docker o Podman, fácil y rápido 8

La gestión de los dominios es realmente fácil e intuitiva y la asignación de usuarios a dominios se realiza fácilmente desde la pantalla principal dashboard.

Volver arriba