zorun.nsd

Rol de Ansible para NSD

Este rol de Ansible instala y configura NSD, un servidor DNS autoritativo. También permite publicar zonas DNS en NSD.

Instalación

Este rol está disponible en Ansible Galaxy.

Características

Este rol es compatible con NSD3 y NSD4, y permite gestionar tanto la configuración de NSD como los archivos de zona, en modo maestro o esclavo, con o sin transferencia de zona (TSIG).

Lo más notable, comparado con otros roles de NSD (elnappo, reallyenglish, creicm, adarnimrod, hudecof), es que tiene las siguientes características:

  • Permite almacenar datos de zona en archivos de zona "clásicos", en lugar de tener que escribir zonas como variables de Ansible aquí.
  • Los archivos de zona se analizan como plantillas Jinja, en caso de que necesites algo dinámico.
  • Soporta tanto escenarios de maestro como de esclavo, o incluso una mezcla de ambos (algunas zonas funcionando como maestro y otras como esclavo, en el mismo servidor NSD).
  • Configuración de NSD completamente genérica (tienes la libertad de definir cualquier atributo de configuración soportado por NSD, no hay una lista codificada en el rol). Esto es similar aquí pero con una sintaxis más simple (expansión automática de listas).
  • Soporta transferencias de zona: claves TSIG, notificar a esclavos...
  • ¡Esperemos que sea flexible pero sencillo de usar!

Sin embargo, no maneja cosas como la configuración del cortafuegos o correos electrónicos, y solo soporta Debian por ahora.

Casos de uso

Nota: ¡todos estos casos de uso pueden utilizarse de forma independiente para cada zona! Es decir, un solo servidor NSD puede ser tanto maestro para example.com como esclavo para example.org.

Multi-maestro puro

Si todos tus servidores DNS están configurados con Ansible, esta es la configuración más sencilla: todos los servidores son maestros para la zona, y los datos de la zona se despliegan utilizando Ansible.

En esta configuración, no hay necesidad de transferencias de zona basadas en DNS.

Multi-maestro con esclavos adicionales no configurados por este rol

En esta configuración, se configuran uno o más maestros utilizando Ansible, como en el caso anterior. Sin embargo, también se configura la transferencia de zona basada en DNS, para permitir que esclavos externos obtengan datos de la zona de un maestro. Cada vez que Ansible actualiza una zona en los maestros, le informará a NSD que notifique a los esclavos.

Ten en cuenta que en esta configuración, es tu responsabilidad configurar adecuadamente a los esclavos (aceptar notificaciones de todos los maestros y obtener datos de zona de uno o más maestros).

Solo esclavo

En esta configuración, los servidores NSD se configuran simplemente como esclavos para la zona. En este caso, no se copian datos de zona a los servidores, ya que los datos se obtendrán de un maestro externo utilizando mecanismos normales de transferencia de zona DNS.

Ten en cuenta que en esta configuración, es tu responsabilidad configurar adecuadamente al maestro (notificar a los esclavos y permitir transferencias de zona desde los esclavos).

Requisitos

Este rol ha sido probado en Debian (wheezy, jessie, stretch, buster, bullseye). Podría funcionar en otros sistemas con algunas adaptaciones, ¡bienvenidos los parches!

Este rol no configura nsd-control porque esto ya se realiza automáticamente por el paquete de Debian. Otros sistemas podrían necesitar configurarlo mediante Ansible en su lugar.

Variables del rol

Esto documenta todas las variables del rol que puedes establecer en tus libros de jugadas. Consulta el final de este README para un ejemplo completo.

Configuración del servidor

nsd_server_config [dict]

Diccionario de pares clave-valor que se agregarán a la sección de configuración server: de NSD. Un valor puede ser una cadena o una lista. En este último caso, el valor se expandirá en varias entradas de configuración.

Puedes añadir cualquier opción de configuración que desees en este diccionario, pero asegúrate de que sea una opción entendida por NSD. Como red de seguridad, el rol pide a NSD que verifique la configuración generada antes de continuar, pero esto no se realizará al ejecutar ansible-playbook --check.

nsd_local_server_config [dict]

Misma sintaxis y semántica que nsd_server_config. Esta segunda variable se proporciona para facilitar la adición de configuración específica a una única máquina. Normalmente, definirías nsd_server_config en group_vars o en un libro de jugadas, mientras que nsd_local_server_config se definiría en host_vars.

Claves TSIG

nsd_tsig_keys [list of dict]

Lista opcional de claves TSIG. Cada clave TSIG debe ser un diccionario con los siguientes atributos:

  • tsig_keyname: nombre de esta clave TSIG. Ten en cuenta que en una configuración DNS maestro/esclavo, el nombre de la clave TSIG debe ser el mismo en el maestro y en los esclavos. Este nombre también se usa para referirse a las claves TSIG desde las variables de rol nsd_primary_zones y nsd_secondary_zones. Obligatorio.
  • tsig_secret: valor codificado en base64 de la clave. Obligatorio.
  • tsig_algorithm: algoritmo utilizado por la clave, por ejemplo hmac-md5. Obligatorio.

Zonas primarias

nsd_primary_zones [list of dict]

Lista de zonas que serán servidas como maestro. Cada zona debe ser un diccionario con los siguientes atributos:

  • zone_name: nombre de la zona, por ejemplo example.com o 8.b.d.0.1.0.0.2.ip6.arpa.. Obligatorio.
  • zone_filename: nombre del archivo que contiene los datos de la zona (se buscará en files/nsd/). Obligatorio.
  • slaves: lista de esclavos DNS, el formato se describe a continuación. Opcional.

El formato para una entrada de esclavo es el siguiente:

  • ip: dirección IPv4 o IPv6 del esclavo DNS. Se utilizará para enviar mensajes "notify" y para permitir transferencias de zona desde esta IP. Obligatorio.
  • tsig_key: nombre de la clave TSIG a utilizar al comunicarse con este esclavo. El nombre debe coincidir con el campo tsig_keyname de una clave TSIG previamente definida, ver arriba. Opcional.

Zonas secundarias

nsd_secondary_zones [list of dict]

Lista de zonas que serán servidas como esclavo. Cada zona debe ser un diccionario con los siguientes atributos:

  • zone_name: nombre de la zona, por ejemplo example.com o 8.b.d.0.1.0.0.2.ip6.arpa.. Obligatorio.
  • masters: lista de maestros DNS, el formato se describe a continuación. Opcional pero una zona esclava es bastante inútil sin un maestro.

El formato para una entrada de maestro es el siguiente:

  • ip: dirección IPv4 o IPv6 del maestro DNS. Se utilizará para solicitar transferencias de zona y para permitir mensajes de notificación. Obligatorio.
  • tsig_key: nombre de la clave TSIG a utilizar al comunicarse con este maestro. El nombre debe coincidir con el campo tsig_keyname de una clave TSIG previamente definida, ver arriba. Opcional.

Variables de configuración avanzadas

Estas variables no deberían necesitar ser cambiadas en la mayoría de los casos. Las variables se presentan aquí con su valor predeterminado.

nsd_local_zones_dir: files/nsd/

Directorio local en el que buscar archivos de zona (las entradas zone_filename son relativas a este directorio).

nsd_version: 4

La versión de NSD. Se usa para omitir tareas o controladores que no tienen sentido dependiendo de la versión.

nsd_service_name: "nsd"

El nombre del servicio de inicio, utilizado para reiniciar NSD.

nsd_pkg_name: "nsd"

Nombre del paquete a instalar.

nsd_control_program: "/usr/sbin/nsd-control"

Programa utilizado para controlar NSD, para recargar, reconstruir, notificar...

nsd_config_dir: "/etc/nsd"

Directorio donde se almacenará la configuración de NSD.

nsd_zones_config_file: "/etc/nsd/zones.conf"

Nombre del archivo de configuración que contendrá la configuración de zonas (luego se incluirá desde el archivo principal de configuración de NSD).

nsd_primary_zones_dir: "/etc/nsd/primary"

Directorio donde se copiarán los archivos de zona por este rol.

nsd_secondary_zones_dir: "/etc/nsd/secondary"

Directorio donde se colocarán los archivos de zonas esclavas por NSD después de la transferencia de zona.

Ejemplo de libro de jugadas

Este es un ejemplo completo de libro de jugadas con varias claves TSIG y varias zonas DNS: la primera zona es una zona primaria sin esclavos, la segunda zona tiene dos esclavos, y la tercera zona es una zona secundaria con dos maestros.

- hosts: dnsservers
  roles:
    - nsd
  vars:
    nsd_server_config:
      verbosity: 2
      ip4-only: 'yes'
    nsd_tsig_keys:
    # Dos claves TSIG, usadas en la definición de zona abajo
      - tsig_keyname: "tsig-key.example.org"
        tsig_secret: "3znH//y866vzpOZdahYYUlWeiY4iidiJGFRX6CI6OkUBggRNYFpZAMvlYbtnUosiBVPsgghA6zT0TzOEX0vetQ=="
        tsig_algorithm: hmac-md5
      - tsig_keyname: "key-eu.org"
        tsig_secret: "t6ELXqsSLYl57iO2rxj+X9+DNpOV3exTBFWu9wS/3jI="
        tsig_algorithm: hmac-sha256
    nsd_primary_zones:
    # Zona maestra sin esclavo
      - zone_name: "example.com."
        zone_filename: "example.com.zone"
    # Zona maestra con dos esclavos, uno de doble pila con una clave TSIG y uno de pila simple sin clave
      - zone_name: "example.org."
        zone_filename: "example.org.zone"
        slaves:
          - ip: 2001:db8:42:1337::1
            tsig_key: "tsig-key.example.org"
          - ip: 198.51.100.12
            tsig_key: "tsig-key.example.org"
          - ip: 203.0.113.8
    nsd_secondary_zones:
    # Zona esclava con dos maestros, el primero sin clave, el segundo con una clave
      - zone_name: "example.eu.org"
        masters:
          - ip: 192.0.2.42
          - ip: 2001:db8:1234:5678::9
            tsig_key: "key-eu.org"

También en host_vars/ns1.yml:

nsd_local_server_config:
  ip-address: ['2001:db8:ffff::42', '203.0.113.199']

Los datos de zona para las dos zonas primarias deben almacenarse en nsd_local_zones_dir (que por defecto es files/nsd/ en la raíz de tu directorio de ansible):

# ls files/nsd/
example.org.zone   example.com.zone
# head -3 files/nsd/example.org.zone
$ORIGIN example.org
$TTL 3h
@  IN  SOA  ns1 root.example.org. (2017090101 1d 2h 4w 1h)

Puedes usar plantillas Jinja en tus archivos de zonas para generar registros dinámicos.

Ejemplo de configuración avanzada

Si necesitas personalización más avanzada, puedes usar las variables avanzadas. Por ejemplo, para soportar NSD3 en Debian wheezy, la configuración apropiada era:

nsd_version: 3
nsd_service_name: "nsd3"
nsd_pkg_name: "nsd3"
nsd_control_program: "/usr/sbin/nsdc"
nsd_config_dir: "/etc/nsd3"
nsd_zones_config_file: "/etc/nsd3/zones.conf"
nsd_primary_zones_dir: "/etc/nsd3/primary"
nsd_secondary_zones_dir: "/etc/nsd3/secondary"

Esto podría colocarse en un archivo group_vars/wheezy.yml o equivalente.

Limitaciones

Para una zona dada, todas las máquinas que utilizan este rol deben ser o todas maestras o todas esclavas.

Esto simplifica enormemente la configuración, y generalmente no hay necesidad de tener maestros y esclavas para la misma zona manejadas por Ansible, ya que Ansible puede simplemente enviar los datos de la zona a todos los servidores (así que, todos pueden ser maestros).

Podrías sortear esta limitación llamando a este rol múltiples veces con diferentes máquinas y diferentes configuraciones.

Hay casos en los que tener múltiples maestros cuyas zonas son enviadas por Ansible probablemente no sería deseable:

  • registros DNS dinámicos (que NSD no soporta de todos modos)
  • DNSSEC (no tengo experiencia con DNSSEC, contribuciones son bienvenidas)

Licencia

MIT

Acerca del proyecto

Configure NSD and DNS zones on Debian

Instalar
ansible-galaxy install zorun.nsd
Licencia
mit
Descargas
2.9k
Propietario