Cómo implementar y administrar su DNS usando DNSControl en Debian 10

El autor seleccionó la Electronic Frontier Foundation Inc para recibir una donación como parte del programa Write for DOnations.

Introducción

DNSControl es una herramienta de infraestructura como código que le permite implementar y administrar sus zonas de DNS usando principios de desarrollo de software estándar, el control de versiones, pruebas e implementaciones automatizadas. DNSControl es una creación de Stack Exchange y se escribió en Go.

El uso de DNSControl elimina muchas de las dificultades de la administración manual de DNS, ya que los archivos de zona se almacenan en un formato programable. Esto le permite implementar zonas en varios proveedores de DNS de manera simultánea, identificar errores de sintaxis y aplicar su configuración de DNS de manera automática, lo que reduce el riesgo que representan los errores humanos. Otro uso frecuente de DNSControl tiene que ver con la migración rápida de su DNS a un proveedor diferente; por ejemplo, en caso de un ataque DDoS o una interrupción del sistema.

A través de este tutorial, instalará y configurará DNSControl, creará una configuración de DNS básica y comenzará a implementar registros de DNS en un proveedor activo. Como parte de este tutorial, usaremos DigitalOcean como proveedor DNS de ejemplo. Si desea usar un proveedor diferente, la configuración es muy similar. Al finalizar, podrá administrar y probar su configuración de DNS en un entorno seguro y sin conexión, y luego implementarla de manera automática en la producción.

Requisitos previos

Para completar esta guía, necesitará lo siguiente:

  • Un servidor de Debian 10 preparado conforme a la configuración inicial para servidores con Debian 10, incluidos un usuario sudo no root y un firewall habilitado para bloquear los puertos no esenciales. your-server-ipv4-address hace referencia a la dirección IP del servidor en donde aloja su sitio web o dominio. your-server-ipv6-address hace referencia a la dirección IPv6 del servidor en donde aloja su sitio web o dominio.
  • Un nombre de dominio registrado por completo con DNS alojado por un proveedor compatible. En este tutorial, se utilizará your_domain en todo momento y DigitalOcean será el proveedor de servicio.
  • Una clave de API de DigitalOcean (Token de acceso personal) con permisos de lectura y escritura. Para crear uno, consulte Cómo crear un Token de acceso personal.

Una vez que tenga todo esto listo, para comenzar inicie sesión en su servidor como usuario no root.

Paso 1: Instalar DNSControl

DNSControl está escrito en Go, por lo que comenzará este paso instalando Go en su servidor y configurando su GOPATH.

Go está disponible en los repositorios de software predeterminados de Debian, lo que permite la instalación con las herramientas convencionales de administración de paquetes.

También deberá instalar Git, ya que es necesario para que en Go se descargue e instale el software DNSControl desde su repositorio en GitHub.

Comience actualizando el índice de paquetes locales de modo que se refleje cualquier cambio anterior:

  • sudo apt update

Luego, instale los paquetes golang-go y git:

  • sudo apt install golang-go git

Una vez confirmada la instalación, apt descargará e instalará Go y Git, así como todas las dependencias necesarias de estos.

A continuación, configurará las variables de entorno de ruta necesarias para Go. Si desea obtener más información sobre esto, puede leer el siguiente tutorial de información sobre GOPATH. Comience editando el archivo ~/.profile:

  • nano ~/.profile

Añada las siguientes líneas al final de su archivo:

~/.profile

... export GOPATH="$HOME/go" export PATH="$PATH:$GOPATH/bin" 

Una vez que añada estas líneas al final del archivo, guárdelo y ciérrelo. Luego vuelva a cargar su perfil cerrando y volviendo a abrir la sesión, o bien volviendo a obtener el archivo:

  • source ~/.profile

Ahora que instaló y configuró Go, puede instalar DNSControl.

El comando go get se puede usar para obtener una copia del código, compilarlo automáticamente e instalarlo en su directorio de Go:

  • go get github.com/StackExchange/dnscontrol

Una vez completado esto, puede verificar la versión instalada para asegurar que todo funcione:

  • dnscontrol version

El resultado debe tener un aspecto similar al siguiente:

Outputdnscontrol 2.9-dev 

Si ve un error dnscontrol: command not found, verifique bien la configuración de su ruta de Go.

Ahora que instaló DNSControl, puede crear un directorio de configuración y conectar DNSControl a su proveedor DNS para permitir que haga cambios en sus registros de DNS.

Paso 2: Configurar DNSControl

En este paso, creará los directorios de configuración necesarios para DNSControl y lo conectará a su proveedor DNS para que pueda comenzar a realizar cambios en tiempo real en sus registros de DNS.

Primero, cree un directorio nuevo en el que pueda almacenar su configuración de DNSControl y luego posiciónese en este:

  • mkdir ~/dnscontrol
  • cd ~/dnscontrol

Nota: En este tutorial, nos enfocaremos en la configuración inicial de DNSControl. Sin embargo, para el uso en producción se le recomienda almacenar su configuración de DNSControl en un sistema de control de versiones (VCS) como Git. Entre las ventajas de esto se incluyen un control de versiones completo, la integración con CI/CD para pruebas y las implementaciones de versiones anteriores sin problemas.

Si planea usar DNSControl para escribir archivos de zona BIND, también deberá crear el directorio zones:

  • mkdir ~/dnscontrol/zones

Los archivos de zona BIND son una alternativa básica estándar para almacenar zonas y registros de DNS en formato de texto simple. Originalmente se utilizaron para el software del servidor DNS BIND, pero ahora se han adoptado ampliamente como el método estándar para almacenar zonas de DNS. Los archivos de zona BIND producidos por DNSControl son útiles si quiere importarlos a un servidor DNS personalizado o con alojamiento propio, o bien para fines de auditoría.

Sin embargo, si solo quiere usar DNSControl para aplicar cambios de DNS a un proveedor administrado, no se necesitará el directorio zones.

A continuación, deberá configurar el archivo creds.json, lo cual permitirá la autenticación de DNSControl en su proveedor DNS y la aplicación de cambios. El formato de creds.json varia ligeramente dependiendo del proveedor DNS que utilice. Consulte la lista de proveedores de servicio en la documentación oficial de DNSControl para hallar la configuración de su propio proveedor.

Cree el archivo creds.json en el directorio ~/dnscontrol:

  • cd ~/dnscontrol
  • nano creds.json

Añada la configuración de muestra creds.json para su proveedor DNS al archivo. Si utiliza DigitalOcean como su proveedor DNS, puede recurrir a lo siguiente:

~/dnscontrol/creds.json

{ "digitalocean": {   "token": "your-digitalocean-oauth-token" } } 

En este archivo se indican a DNSControl los proveedores de DNS con los que desea establecer conexión.

Deberá proporcionar alguna forma de autenticación para proveedor DNS. Normalmente, se utiliza una clave de API o un token de OAuth, pero algunos proveedores requieren información adicional, como se detalla en la lista de proveedores de servicio de la documentación oficial de DNSControl.

Advertencia: Este token brindará acceso a la cuenta de su proveedor DNS, por lo que debe protegerlo como si se tratara de una contraseña. También compruebe que, si utiliza un sistema de control de versiones, el archivo que contenga el token esté excluido (por ejemplo, con .gitignore), o cifrado de forma segura de alguna manera.

Si utiliza DigitalOcean como su proveedor DNS, puede usar el token de OAuth requerido en la configuración de su cuenta de DigitalOcean que generó como parte de los requisitos previos.

Si tiene varios proveedores de DNS diferentes, por ejemplo, para diferentes nombres de dominio o zonas de DNS delegadas, puede definir todos estos en el mismo archivo creds.json.

Con esto, estableció los directorios de configuración inicial de DNSControl y configuró creds.json para permitir que DNSControl se autentique en su proveedor DNS y realice cambios. A continuación, creará la configuración para sus zonas de DNS.

Paso 3: Crear un archivo de configuración de DNS

Durante este paso, creará un archivo de configuración de DNS inicial, que contendrá los registros de DNS para su nombre de dominio o zona de DNS delegada.

dnsconfig.js es el archivo de configuración de DNS principal para DNSControl. En este archivo, las zonas de DNS y sus registros correspondientes se definen usando sintaxis de JavaScript. Esto se conoce como DS o lenguaje específico de dominio. En la página de DSL en JavaScript de la documentación oficial de DNSControl hay más información disponible.

Para comenzar, cree el archivo de configuración de DNS en el directorio ~/dnscontrol:

  • cd ~/dnscontrol
  • nano dnsconfig.js

Luego, añada la siguiente configuración de ejemplo al archivo:

~/dnscontrol/dnsconfig.js

// Providers:  var REG_NONE = NewRegistrar('none', 'NONE'); var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');  // Domains:  D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),   A('@', 'your-server-ipv4-address') ); 

Mediante este archivo de ejemplo se define un nombre de dominio o una zona de DNS en un proveedor determinado, que en este caso es your_domain alojado en DigitalOcean. También se define un ejemplo de registro A para la zona root (@) con orientación hacia la dirección IPv4 del servidor en el que aloja su dominio y sitio web.

Existen tres funciones principales que conforman un archivo básico de configuración de DNSControl

  • NewRegistrar(name, type, metadata): define el registrador de dominio para su nombre de dominio. DNSControl puede utilizar esto para realizar los cambios necesarios, como la modificación de los servidores de nombres autoritativos. Si solo quiere usar DNSControl para administrar sus zonas de DNS, generalmente puede dejar el valor NONE.

  • NewDnsProvider(name, type, metadata): define un proveedor de servicio de DNS para su nombre de dominio o zona delegada. Aquí es donde DNSControl aplicará los cambios de DNS que realice.

  • D(name, registrar, modifiers): define un nombre de dominio o una zona de DNS delegada para DNSControl se encargue de la administración, como también los registros de DNS presentes en la zona.

Deberá configurar NewRegistrar(), NewDnsProvider() y D() respectivamente usando la lista de proveedores de servicio de la documentación oficial de DNSControl.

Si utiliza DigitalOcean como su proveedor DNS y solo necesita poder realizar cambios en el DNS (en lugar de servidores de nombres autoritativos también), el ejemplo del bloque de código anterior ya es válido.

Una vez que termine, guarde y cierre el archivo.

En este paso, creó un archivo de configuración de DNS para DNSControl, con los proveedores correspondientes definidos. A continuación, completará el archivo con algunos registros de DNS útiles.

Paso 4: Completar su archivo de configuración de DNS

A continuación, podrá completar el archivo de configuración de DNS con registros de DNS útiles para su sitio web o servicio, con la sintaxis de DNSControl.

A diferencia de los archivos de zona BIND tradicionales, en los cuales los registros DNS están escritos en un formato básico, línea por línea, los registros DNS dentro de DNSControl se definen como un parámetro de función (modificador de dominio) en la función D(), como se muestra en forma resumida en el paso 3.

Existe un modificador de dominio para cada uno de los tipos de registro de DNS estándares, entre los que se incluyen A, AAAA, MX, TXT, NS y CAA. Se encuentra disponible una lista completa de los tipos de registro en la sección Modificadores de dominios de la documentación de DNSControl.

También se encuentran disponibles los modificadores para los registros individuales (modificadores de registros). Actualmente, se utilizan principalmente para configurar el TTL (período de vida) de registros individuales. Se encuentra disponible una lista completa de los modificadores de registros en la sección Modificadores de registros de la documentación de DNSControl. Los modificadores de registros son opcionales y en la mayoría de los casos de uso básicos pueden quedar excluidos.

La sintaxis para configurar registros DNS varía ligeramente según cada tipo de registro. A continuación, se muestran algunos ejemplos para los tipos de registro más comunes:

  • Registros A:

    • Propósito: apuntar a una dirección IPv4.
    • Sintaxis: A('name', 'address', optional record modifiers).
    • Ejemplo: A('@', 'your-server-ipv4-address', TTL(30)).
  • Registros AAAA:

    • Propósito: apuntar a una dirección IPv6.
    • Sintaxis: AAAA('name', 'address', optional record modifiers).
    • Ejemplo: AAAA('@', 'your-server-ipv6-address') (se omitió el modificador de registros, por lo que se utilizará el TTL predeterminado).
  • Registros CNAME:

    • Propósito: convertir su dominio o subdominio en un alias de otro.
    • Sintaxis: CNAME('name', 'target', optional record modifiers).
    • Ejemplo: CNAME('subdomain1', 'example.org.') (tenga en cuenta que se debe incluir un . al final si hay algún punto en el valor).
  • Registros MX:

    • Propósito: dirigir el correo electrónico hacía direcciones o servidores específicos.
    • Sintaxis: MX('name', 'priority', 'target', optional record modifiers).
    • Ejemplo: MX('@', 10, 'mail.example.net') (tenga en cuenta que se debe incluir un . “al final si hay algún punto en el valor).
  • Registros de TXT:

    • Propósito: agregar texto simple arbitrario, a menudo utilizado para las configuraciones sin su propio tipo de registro dedicado.
    • Sintaxis: TXT('name', 'content', optional record modifiers).
    • Ejemplo: TXT('@', 'This is a TXT record.').
  • Registros CAA:

    • Propósito: restringir las entidades de certificación (CA) que pueden emitir certificados TLS para su dominio y subdominios, y presentar informes sobre ellas.
    • Sintaxis: CAA('name', 'tag', 'value', optional record modifiers).
    • Ejemplo: CAA('@', 'issue', 'letsencrypt.org').

Con el fin de comenzar a añadir registros de DNS para su dominio o zona de DNS delegada, edite su archivo de configuración DNS:

  • nano dnsconfig.js

A continuación, puede comenzar a completar los parámetros para la función D() existente usando la sintaxis descrita en la lista anterior, así como la sección Modificadores de dominio de la documentación oficial de DNSControl. Se debe utilizar una coma (,) entre cada registro.

A modo de referencia, el bloque de código aquí contiene una configuración de ejemplo completa para una configuración básica e inicial de un DNS:

~/dnscontrol/dnsconfig.js

...  D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),   A('@', 'your-server-ipv4-address'),   A('www', 'your-server-ipv4-address'),   A('mail', 'your-server-ipv4-address'),   AAAA('@', 'your-server-ipv6-address'),   AAAA('www', 'your-server-ipv6-address'),   AAAA('mail', 'your-server-ipv6-address'),   MX('@', 10, 'mail.your_domain.'),   TXT('@', 'v=spf1 -all'),   TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:[email protected]_domain; aspf=s; adkim=s;') ); 

Una vez que haya completado su configuración inicial de DNS, guarde y cierre el archivo.

Durante este paso, creó el archivo de configuración de DNS inicial que contiene sus registros de DNS. A continuación, probará la configuración y la implementará.

Paso 5: Probar e implementar su configuración de DNS

En este paso, ejecutará una verificación de sintaxis local en su configuración de DNS y luego implementará los cambios en el servidor y proveedor DNS activos.

Primero, posiciónese en el directorio dnscontrol:

  • cd ~/dnscontrol

Luego, utilice la función preview de DNSControl para verificar la sintaxis de su archivo y mostrar los cambios que se realizarán (sin efectuarlos realmente):

  • dnscontrol preview

Si la sintaxis de su archivo de configuración de DNS es correcta, en DNSControl se mostrará un resumen de los cambios que se realizarán. Esto debe tener un aspecto similar a lo siguiente:

Output******************** Domain: your_domain ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...8 corrections #1: CREATE A your_domain your-server-ipv4-address ttl=300 #2: CREATE A www.your_domain your-server-ipv4-address ttl=300 #3: CREATE A mail.your_domain your-server-ipv4-address ttl=300 #4: CREATE AAAA your_domain your-server-ipv6-address ttl=300 #5: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:[email protected]_domain; aspf=s; adkim=s;" ttl=300 #6: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300 #7: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300 #8: CREATE MX your_domain 10 mail.your_domain. ttl=300 ----- Registrar: none...0 corrections Done. 8 corrections. 

Si ve una advertencia de error en el resultado, DNSControl proporcionará detalles sobre el tipo de error y el punto en el que se encuentra dentro de su archivo.

Advertencia: A través del siguiente comando se harán cambios en tiempo real en sus registros DNS y posiblemente en otras configuraciones. Asegúrese de estar preparado para esto; incluya una copia de seguridad de su configuración de DNS existente y verifique que disponga de los medios necesarios para revertir los cambios si es necesario.

Por último, puede aplicar los cambios a su proveedor DNS activo:

  • dnscontrol push

Verá un resultado similar al siguiente:

Output******************** Domain: your_domain ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...8 corrections #1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:[email protected]_domain; aspf=s; adkim=s;" ttl=300 SUCCESS! #2: CREATE A your_domain your-server-ipv4-address ttl=300 SUCCESS! #3: CREATE AAAA your_domain your-server-ipv6-address ttl=300 SUCCESS! #4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300 SUCCESS! #5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300 SUCCESS! #6: CREATE A www.your_domain your-server-ipv4-address ttl=300 SUCCESS! #7: CREATE A mail.your_domain your-server-ipv4-address ttl=300 SUCCESS! #8: CREATE MX your_domain 10 mail.your_domain. ttl=300 SUCCESS! ----- Registrar: none...0 corrections Done. 8 corrections. 

Ahora, si revisa las configuraciones de DNS para su dominio en el panel de control de DigitalOcean, podrá visualizar los cambios.

Captura de pantalla del panel de control de DigitalOcean; se muestran algunos de los cambios de DNS realizados en DNSControl.

También puede verificar la creación de registros ejecutando una solicitud de DNS para su dominio o zona delegando usando dig.

Si no instaló dig, deberá instalar el paquete dnsutils:

  • sudo apt install dnsutils

Una vez que instale dig, podrá utilizarlo con el propósito de realizar una búsqueda de DNS para su dominio. Verá que los registros se actualizaron de forma correspondiente:

  • dig +short your_domain

Verá un resultado que muestra la dirección IP y los registros de DNS pertinentes de su zona implementada usando DNSControl. Los registros DNS pueden tardar tiempo en propagarse, por lo cual es posible que necesite esperar y ejecutar este comando de nuevo.

En este último paso, realizó una verificación de sintaxis local del archivo de configuración de DNS, luego lo implementó en su proveedor DNS activo y verificó mediante pruebas que los cambios se realizaran correctamente.

Conclusión

A lo largo de este artículo, configuró DNSControl e implementó una configuración de DNS en un proveedor activo. Ahora podrá administrar y probar sus cambios de configuración de DNS en un entorno seguro y sin conexión antes de implementarlos en la producción.

Si desea profundizar en este tema, DNSControl está diseñado para integrarse en su proceso de CI/CD, lo que le permite realizar pruebas exhaustivas y tener más control sobre su implementación en la producción. También podría considerar la integración de DNSControl en sus procesos de compilación e implementación de infraestructuras, lo que le permitirá implementar servidores y agregarlos al DNS de manera completamente automática.

Si desea dar un paso más con DNSControl, en los siguientes artículos de DigitalOcean se ofrecen algunos pasos interesantes que puede seguir para contribuir a la integración de DNSControl en sus flujos de trabajo de administración de cambios e implementación de infraestructura:

  • Introducción a la integración, entrega e implementación continuas
  • Comparación de herramientas de CI/CD: Jenkins, GitLab IC, Buildbot, Drone y Concourse
  • Primeros pasos para la administración de configuraciones