Cómo implementar y administrar tu DNS utilizando DNSControl en Debian

Introducción

DNSControl es una herramienta de infraestructura como código que te permite implementar y administrar tus zonas DNS utilizando principios de desarrollo de software estándar. Entre estas se incluyen control de versiones, pruebas e implementación automatizada. DNSControl fue creado por Stack Exchange y está escrito en Go.

El uso de DNSControl elimina muchas de las trampas de la administración manual de DNS, ya que los archivos de zona se almacenan en un formato programable. Esto te permite implementar zonas en múltiples proveedores de DNS simultáneamente, identificar errores de sintaxis e impulsar tu configuración de DNS automáticamente, reduciendo el riesgo de error humano. Otro uso común de DNSControl es migrar rápidamente tu DNS a un proveedor diferente. Por ejemplo, en caso de un ataque DDoS o una interrupción del sistema.

En este tutorial, instalarás y configurarás DNSControl, crearás una configuración DNS básica y comenzarás a implementar registros DNS en un proveedor en vivo.

Como parte de este tutorial, utilizaremos Binaria como el proveedor de DNS de ejemplo. Si deseas utilizar un proveedor diferente, la configuración es muy similar.

Cuando hayas terminado, podrás administrar y probar tu configuración de DNS en un entorno seguro y offline, y luego implementarla automáticamente en producción.

Prerrequisitos

Antes de comenzar esta guía, necesitarás lo siguiente:

  • Un servidor Debian 10 configurado siguiendo la configuración básica del servidor con Debian 10. Esta incluye un usuario sudo no root y un firewall habilitado para bloquear puertos no esenciales. your-server-ipv4-address se refiere a la dirección IP del servidor donde alojas tu sitio web o dominio. your-server-ipv6-address se refiere a la dirección IPv6 del servidor donde alojas tu sitio web o dominio.
  • Un nombre de dominio completamente registrado con DNS alojado por un proveedor compatible. Este tutorial utilizará your_domain a través de Binaria como proveedor de servicios.
  • Una clave API (token de acceso personal) con permisos de lectura y escritura.

Una vez que tengas estos listos, debes iniciar sesión en tu servidor como tu usuario no root para comenzar.

Paso 1 – Instalación de DNSControl

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

Go está disponible dentro de los repositorios de software predeterminados de Debian, lo que hace posible la instalación utilizando herramientas de administración de paquetes convencionales.

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

Debes comenzar actualizando el índice del paquete local para reflejar los nuevos cambios ascendentes:

Luego, instala los paquetes golang-gogit:

Después de confirmar la instalación, apt descargará e instalará Go y Git, así como todas sus dependencias requeridas.

A continuación, configurarás las variables de entorno de ruta requeridas para Go. Debes comenzar editando el archivo ~/.profile:

Agrega las siguientes líneas al final de tu archivo:

Una vez que hayas agregado estas líneas al final del archivo, guárdalo y ciérralo. Luego, vuelve a cargar el archivo, ya sea cerrando la sesión y volviendo a iniciarla, o buscando nuevamente el archivo:

Ahora que has instalado y configurado Go, puedes instalar DNSControl.

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

Una vez que esto se haya completado, puedes verificar la versión instalada para asegurarte de que todo funcione:

Tu salida será similar a la siguiente:

Si ves un error dnscontrol: command not found, debes verificar la configuración de tu ruta de Go.

Ahora que has instalado DNSControl, puedes crear un directorio de configuración y conectar DNSControl a tu proveedor de DNS para realizar cambios en tus registros DNS.

Paso 2: configuración de DNSControl

En este paso, crearás los directorios de configuración necesarios para DNSControl y lo conectarás a tu proveedor de DNS para que puedas comenzar a realizar cambios en vivo en tus registros DNS.

En primer lugar, debes crear un nuevo directorio en el que puedas almacenar tu configuración de DNSControl y luego muévete a él:

Nota: Este tutorial se centrará en la configuración inicial de DNSControl. Sin embargo, para uso en producción, se recomienda almacenar la configuración de DNSControl en un sistema de control de versiones (VCS) como Git. Las ventajas de esto incluyen el control completo de la versión, la integración con CI/CD para las pruebas, las implementaciones revertidas sin inconvenientes, etc.

Si planeas usar DNSControl para escribir archivos de zona BIND, también debes crear el directorio zones:

Los archivos de zona BIND son un método en vivo y estandarizado para almacenar zonas/registros DNS en formato de texto sin formato. Originalmente se utilizaron para el software del servidor BIND DNS, pero ahora se adoptan ampliamente como el método estándar para almacenar zonas DNS. Los archivos de zona BIND producidos por DNSControl son útiles si deseas importarlos a un servidor DNS personalizado o autohospedado, o para fines de auditoría.

Sin embargo, si solo deseas utilizar DNSControl para enviar los cambios de DNS a un proveedor administrado, el directorio zones no será necesario.

A continuación, debes configurar el archivo creds.json, que es lo que permitirá que DNSControl se autentique en tu proveedor de DNS y realice cambios. El formato de creds.json difiere ligeramente según el proveedor de DNS que estés utilizando. Puedes consultar la lista de proveedores de servicios en la documentación oficial de DNSControl para encontrar la configuración de tu propio proveedor.

Crear archivo

Debes crear el archivo creds.json en el directorio ~/dnscontrol:

Agrega la configuración creds.json de muestra para tu proveedor de DNS al archivo. Si estás utilizando Binaria como tu proveedor de DNS, puedes usar lo siguiente:

Este archivo le dice a DNSControl a qué proveedores de DNS deseas que se conecte.

Deberás proporcionar alguna forma de autenticación para tu proveedor de DNS. Esta suele ser una clave API o un token OAuth, pero algunos proveedores requieren información adicional. Tal como se documenta en la lista de Proveedores de servicios en la documentación oficial de DNSControl.

Advertencia: Este token te otorgará acceso a tu cuenta de proveedor de DNS, por lo que debes protegerlo como lo harías con una contraseña. Además, asegúrate de que, si estás utilizando un sistema de control de versiones, el archivo que contiene el token debe estar excluido. Por ejemplo, el usando  .gitignore.  También puedes cifrarlo de forma segura de alguna manera.

Si estás utilizando Binaria como tu proveedor de DNS, puedes usar el token OAuth requerido en la configuración de tu cuenta que generaste como parte de los requisitos previos.

Si tienes varios proveedores de DNS diferentes. Por ejemplo, para varios nombres de dominio o zonas de DNS delegadas, puedes definirlos en el mismo archivo creds.json.

Haz configurado los directorios de configuración iniciales de DNSControl y configurado creds.json para permitir que DNSControl se autentique en tu proveedor de DNS y realice cambios. A continuación, crearás la configuración para tus zonas DNS.

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

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

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

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

Luego, debes agregar la siguiente configuración de muestra al archivo:

Este archivo de muestra define un nombre de dominio o zona DNS en un proveedor en particular, que en este caso es your_domain alojado por Binaria. También se define un registro A de ejemplo para la zona root (@), que apunta a la dirección IPv4 del servidor en el que alojas tu dominio/sitio web.

Hay tres funciones principales que componen un archivo de configuración básico de DNSControl:

  • NewRegistrar(name, type, metadata): define el registrador de dominio para tu nombre de dominio. DNSControl puede usar esto para realizar los cambios necesarios, como modificar los servidores de nombres autorizados. Si solo deseas utilizar DNSControl para administrar tus zonas DNS, generalmente puedes dejarlo como NONE.
  • NewDnsProvider(name, type, metadata): define un proveedor de servicios DNS para tu nombre de dominio o zona delegada. Aquí es donde DNSControl hará los cambios de DNS que realices.
  • D(name, registrar, modifiers): define un nombre de dominio o zona DNS delegada para que DNSControl administre, así como los registros DNS presentes en la zona.

Registros necesarios

Debes configurar NewRegistrar()NewDnsProvider() y  D(), según la lista de proveedores de servicios en la documentación oficial de DNSControl.

Si estás utilizando Binaria como tu proveedor de DNS, y solo necesitas poder realizar cambios de DNS (en lugar de servidores de nombres autorizados), la muestra en el bloque de código anterior ya es correcta.

Una vez completado, debes guardar y cerrar el archivo.

En este paso, configuraste un archivo de ajustes DNS para DNSControl, con los proveedores relevantes definidos. A continuación, completarás el archivo con algunos registros DNS útiles.

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

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

En los archivos de zona BIND tradicionales, los registros DNS se escriben en un formato sin procesar, línea por línea. Empero, los registros DNS dentro de DNSControl se definen como un parámetro de función (modificador de dominio) para la función D(). Esto se muestra brevemente en el Paso 3.

Existe un modificador de dominio para cada uno de los tipos de registros DNS estándar, incluyendo A, AAAA, MX, TXT, NS, CAA, y así sucesivamente. Una lista completa de los tipos de registros disponibles está disponible en la sección Modificadores de dominio de la documentación de DNSControl.

Los modificadores para registros individuales también están disponibles (modificadores de registro). Actualmente, estos se utilizan principalmente para establecer el TTL (tiempo de vida) de los registros individuales. Una lista completa de modificadores de registro disponibles la puede encontrar en la sección modificadores de registro de la documentación de DNSControl. Los modificadores de registro son opcionales, y en la mayoría de los casos de uso básico se pueden omitir.

La sintaxis para configurar registros DNS varía ligeramente para cada tipo de registro. Los siguientes son algunos ejemplos de los tipos de registros 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 omite el modificador de registro, por lo que se usará TTL predeterminado)
  • Registros CNAME:

    • Propósito: Hacer que tu dominio/subdominio sea un alias de otro.
    • Sintaxis: CNAME(‘name’, ‘target’, optional record modifiers)
    • Ejemplo: CNAME(‘subdomain1’, ‘example.org.’) (ten en cuenta que  debe incluirse un . final si hay puntos en el valor)
  • Registros MX:
    • Propósito: dirigir el correo electrónico a servidores/direcciones específicos.
    • Sintaxis: MX(‘name’, ‘priority’, ‘target’, optional record modifiers)
    • Ejemplo: MX (‘@’, 10, ‘mail.example.net’). (ten en cuenta que debe incluirse un . final si hay puntos en el valor)
  • Registros TXT:
    • Propósito: Agregar texto plano arbitrario, a menudo utilizado para 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 e informar sobre las autoridades de certificación (CA) que pueden emitir certificados TLS para tu dominio/subdominios.
    • Sintaxis: CAA(‘name’, ‘tag’, ‘value’, optional record modifiers)
    • Ejemplo: CAA(‘@’, ‘issue’, ‘letsencrypt.org’)

Para comenzar a agregar registros DNS para tu dominio o zona DNS delegada, debes editar tu archivo de configuración DNS:

 

Luego, puedes comenzar a completar los parámetros para la función D() existente utilizando la sintaxis descrita en la lista anterior. Asimismo, la sección Modificadores de dominio de la documentación oficial de DNSControl. Se debe usar una coma (,) entre cada registro.

Como referencia, el bloque de código aquí contiene una configuración de muestra completa para una configuración inicial de DNS básica:

Una vez que haya completado tu configuración basica de DNS, debes guardar y cerrar el archivo.

En este paso, configuraste el archivo de configuración DNS inicial, que contiene tus registros DNS. A continuación, probarás la configuración y la implementarás.

Paso 5: prueba e implementación de la configuración de DNS

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

En primer lugar, muévete a tu directorio dnscontrol:

A continuación, utiliza la función preview de DNSControl para verificar la sintaxis de tu archivo y generar los cambios que harás (sin realmente hacerlos):

Si la sintaxis de tu archivo de configuración de DNS es correcta, DNSControl generará una descripción general de los cambios que realizará. Esto debería ser similar al siguiente:

Si ves una advertencia de error en tu salida, DNSControl proporcionará detalles sobre qué y dónde se encuentra el error dentro de tu archivo.

Advertencia: 

El siguiente comando hará cambios en vivo a tus registros DNS y posiblemente a otras configuraciones. Asegúrate de estar preparado para esto, incluida la realización de una copia de seguridad de su configuración de DNS existente. Asimismo, de que tienes los medios para revertir si es necesario.

Finalmente, puedes eliminar los cambios en tu proveedor de DNS en vivo:

Verás una salida similar a la siguiente:

Ahora, si verificas la configuración de DNS para tu dominio en el panel de control, verás los cambios.

También puedes verificar la creación de registros ejecutando una consulta DNS para tu dominio/zona delegada usando dig.

Si no tienes instalado dig, deberás instalar el paquete dnsutils:

Una vez que hayas instalado dig, puedes usarlo para realizar una búsqueda de DNS para tu dominio. Verás que los registros se han actualizado en consecuencia:

Verás la salida que muestra la dirección IP y el registro DNS relevante de tu zona que se implementó usando DNSControl. Los registros DNS pueden tardar un tiempo en propagarse, por lo que es posible que debas esperar y ejecutar este comando nuevamente.

En este paso final, ejecutaste una verificación de sintaxis local del archivo de configuración de DNS. Finalmente lo implementaste en tu proveedor de DNS en vivo y probaste que los cambios se realizaron con éxito.

Conclusión

En este artículo, configuraste DNSControl e implementaste una configuración de DNS en un proveedor en vivo. Ahora puedes administrar y probar tus cambios de configuración de DNS en un entorno seguro y sin conexión antes de implementarlos en producción.

Si deseas explorar más este tema, DNSControl está diseñado para integrarse en tu canalización CI/CD. Esto te permite ejecutar pruebas en profundidad y tener más control sobre su implementación en producción.

También puedes considerar la integración de DNSControl en los procesos de construcción/implementación de tu infraestructura. Lo anterior te permite implementar servidores y agregarlos a DNS de forma completamente automática.