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

El autor seleccionó a 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 DNS utilizando principios de desarrollo de software estándar, incluidos control de versiones, pruebas e implementación automatizada. DNSControl fue creado por Stack Exchange y está escrito en Go.
El uso de DNSControl elimina muchos de los problemas 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 simultáneamente, identificar errores de sintaxis y enviar su configuración de DNS automáticamente, lo que reduce el riesgo de error humano. Otro uso común de DNSControl es migrar rápidamente su DNS a un proveedor diferente; por ejemplo, en caso de un ataque DDoS o una interrupción del sistema.
En este tutorial, instalará y configurará DNSControl, creará una configuración básica de DNS y comenzará a implementar registros DNS en un proveedor activo. Como parte de este tutorial, utilizaremos DigitalOcean como proveedor de DNS de ejemplo. Si desea utilizar un proveedor diferente, la configuración es muy similar. Cuando haya terminado, podrá administrar y probar su configuración de DNS en un entorno seguro y sin conexión, 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 inicial del servidor con Debian 10, incluido 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 aloja su sitio web o dominio.your-server-ipv6-address
se refiere a la dirección IPv6 del servidor donde aloja su sitio web o dominio. - Un nombre de dominio completamente registrado con DNS alojado por un proveedor compatible. En este tutorial, se utilizará
your_domain
a DigitalOcean como proveedor de servicios. - Una clave API de DigitalOcean (Personal Access Token) con permisos de lectura y escritura. Para crear una, visita Cómo crear un token de acceso personal.
Una vez que tenga esto listo, inicie sesión en su servidor como usuario no root para comenzar.
Paso 1: Instalación de DNSControl
DNSControl está escrito en Go, por lo que comenzará este paso instalando Go en su servidor y configurando su GOPATH
.
Go está disponible dentro de los repositorios de software predeterminados de Debian, lo que hace posible su instalación utilizando herramientas de gestión de paquetes convencionales.
También necesitarás instalar Git, ya que esto es necesario para permitir que Go descargue e instale el software DNSControl desde su repositorio en GitHub.
Comience actualizando el índice de paquetes locales para reflejar cualquier cambio nuevo en sentido ascendente:
- sudo apt update
Luego, instala los paquetes golang-go
y git
:
- sudo apt install golang-go git
Después de confirmar la instalación, apt
se descargará e instalará Go y Git, así como todas sus dependencias necesarias.
A continuación, configurará las variables de entorno de ruta necesarias para Go. Si desea obtener más información sobre esto, puede leer este tutorial sobre cómo entender GOPATH. Comience editando el ~/.profile
archivo:
- nano ~/.profile
Añade las siguientes líneas al final de tu archivo:
~/.perfil
...export GOPATH="$HOME/go"export PATH="$PATH:$GOPATH/bin"
Una vez que hayas agregado estas líneas al final del archivo, guárdalo y ciérralo. Luego, vuelve a cargar tu perfil cerrando la sesión y volviendo a iniciarla, o bien obteniendo el archivo nuevamente:
- source ~/.profile
Ahora que ha instalado y configurado Go, puede instalar DNSControl.
El go get
comando se puede utilizar para obtener una copia del código, compilarlo automáticamente e instalarlo en su directorio Go:
- go get github.com/StackExchange/dnscontrol
Una vez completado esto, puedes verificar la versión instalada para asegurarte de que todo funciona:
- dnscontrol version
El resultado será similar al siguiente:
Outputdnscontrol 2.9-dev
Si ve un dnscontrol: command not found
error, vuelva a verificar la configuración de su ruta Go.
Ahora que ha instalado DNSControl, puede crear un directorio de configuración y conectar DNSControl a su proveedor de DNS para permitirle realizar cambios en sus registros DNS.
Paso 2: Configuración de DNSControl
En este paso, creará los directorios de configuración necesarios para DNSControl y lo conectará a su proveedor de DNS para que pueda comenzar a realizar cambios en vivo en sus registros DNS.
En primer lugar, crea un nuevo directorio en el que puedas almacenar tu configuración de DNSControl y luego dirígete a él:
- mkdir ~/dnscontrol
- cd ~/dnscontrol
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 control de versiones completo, integración con CI/CD para pruebas, reversión sin inconvenientes de implementaciones, etc.
Si planea utilizar DNSControl para escribir archivos de zona BIND, también debe crear el zones
directorio:
- mkdir ~/dnscontrol/zones
Los archivos de zona BIND son un método estandarizado y sin formato para almacenar zonas/registros DNS en formato de texto sin formato. Originalmente se utilizaban para el software de servidor DNS BIND, pero ahora se han adoptado ampliamente como el método estándar para almacenar zonas DNS. Los archivos de zona BIND producidos por DNSControl son útiles si desea importarlos a un servidor DNS personalizado o alojado por usted mismo, o para fines de auditoría.
Sin embargo, si solo desea utilizar DNSControl para enviar cambios de DNS a un proveedor administrado, el zones
directorio no será necesario.
A continuación, debe configurar el creds.json
archivo, que es lo que permitirá a DNSControl autenticarse con su proveedor de DNS y realizar cambios. El formato creds.json
varía ligeramente según el proveedor de DNS que esté utilizando. Consulte la lista de proveedores de servicios en la documentación oficial de DNSControl para encontrar la configuración de su propio proveedor.
Crea el archivo creds.json
en el ~/dnscontrol
directorio:
- cd ~/dnscontrol
- nano creds.json
Agregue la creds.json
configuración de muestra para su proveedor de DNS al archivo. Si utiliza DigitalOcean como proveedor de DNS, puede utilizar lo siguiente:
~/dnscontrol/creds.json
{"digitalocean": { "token": "your-digitalocean-oauth-token"}}
Este archivo le dice a DNSControl a qué proveedores de DNS desea que se conecte.
Deberá proporcionar algún tipo de autenticación para su proveedor de DNS. Por lo general, se trata de una clave API o un token OAuth, pero algunos proveedores requieren información adicional, como se documenta en la lista de proveedores de servicios en la documentación oficial de DNSControl.
Advertencia: este token otorgará acceso a su cuenta de proveedor de DNS, por lo que debe protegerlo como lo haría con una contraseña. Además, asegúrese de que, si está utilizando un sistema de control de versiones, el archivo que contiene el token esté excluido (por ejemplo, utilizando .gitignore
) o esté cifrado de forma segura de alguna manera.
Si utiliza DigitalOcean como su proveedor de DNS, puede usar el token 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 múltiples nombres de dominio o zonas DNS delegadas), puede definirlos todos en el mismo creds.json
archivo.
Ha configurado los directorios de configuración inicial de DNSControl y lo ha configurado creds.json
para permitir que DNSControl se autentique con su proveedor de DNS y realice cambios. A continuación, creará la configuración para sus zonas DNS.
Paso 3: Creación de un archivo de configuración de DNS
En este paso, creará un archivo de configuración de DNS inicial, que contendrá los registros DNS para su nombre de dominio o zona DNS delegada.
dnsconfig.js
es el archivo de configuración DNS principal para DNSControl. En este archivo, se definen las zonas DNS y sus registros correspondientes mediante sintaxis JavaScript. Esto se conoce como DSL o lenguaje específico de dominio. La página DSL de JavaScript en la documentación oficial de DNSControl proporciona más detalles.
Para comenzar, cree el archivo de configuración DNS en el ~/dnscontrol
directorio:
- cd ~/dnscontrol
- nano dnsconfig.js
Luego, agregue la siguiente configuración de muestra 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'));
Este archivo de ejemplo define un nombre de dominio o una zona DNS en un proveedor en particular, que en este caso está your_domain
alojado por DigitalOcean. A
También se define un registro de ejemplo para la raíz de la zona ( @
), que apunta a la dirección IPv4 del servidor en el que está alojando su dominio o sitio web.
Hay tres funciones principales que componen un archivo de configuración DNSControl básico:
-
NewRegistrar(name, type, metadata)
: define el registrador de dominio para su nombre de dominio. DNSControl puede utilizar esto para realizar los cambios necesarios, como modificar los servidores de nombres autorizados. Si solo desea utilizar DNSControl para administrar sus zonas DNS, generalmente puede dejarlo comoNONE
. -
NewDnsProvider(name, type, metadata)
: define un proveedor de servicios DNS para su nombre de dominio o zona delegada. Aquí es donde DNSControl enviará los cambios de DNS que realice. -
D(name, registrar, modifiers)
: define un nombre de dominio o una zona DNS delegada para que DNSControl los administre, así como los registros DNS presentes en la zona.
Debe configurar NewRegistrar()
, NewDnsProvider()
, y D()
según corresponda utilizando la lista de proveedores de servicios en la documentación oficial de DNSControl.
Si está utilizando DigitalOcean como su proveedor de DNS y solo necesita poder realizar cambios de DNS (en lugar de también servidores de nombres autorizados), el ejemplo en el bloque de código anterior ya es correcto.
Una vez completado, guarde y cierre el archivo.
En este paso, se configura un archivo de configuración de DNS para DNSControl, con los proveedores relevantes definidos. A continuación, se completa el archivo con algunos registros DNS útiles.
Paso 4: Cómo completar el archivo de configuración de DNS
A continuación, puede completar el archivo de configuración de DNS con registros DNS útiles para su sitio web o servicio, utilizando la sintaxis DNSControl.
A diferencia de los archivos de zona BIND tradicionales, donde los registros DNS se escriben en un formato sin procesar, línea por línea, los registros DNS dentro de DNSControl se definen como un parámetro de función (modificador de dominio) para la D()
función, como se muestra brevemente en el Paso 3.
Existe un modificador de dominio para cada uno de los tipos de registros DNS estándar, incluidos A
, AAAA
, MX
, TXT
, NS
, CAA
, etc. Hay una lista completa de los tipos de registros disponibles en la sección Modificadores de dominio de la documentación de DNSControl.
También hay modificadores para registros individuales (modificadores de registros). Actualmente, se utilizan principalmente para establecer el TTL (tiempo de vida) de registros individuales. En la sección Modificadores de registros de la documentación de DNSControl se encuentra disponible una lista completa de los modificadores de registros disponibles. Los modificadores de registros son opcionales y, en la mayoría de los casos de uso básicos, se pueden omitir.
La sintaxis para configurar registros DNS varía ligeramente para cada tipo de registro. A continuación, se muestran algunos ejemplos de los tipos de registros más comunes:
-
A
archivos:- Propósito: señalar una dirección IPv4.
- Sintaxis:
A('name', 'address', optional record modifiers)
- Ejemplo:
A('@', 'your-server-ipv4-address', TTL(30))
-
AAAA
archivos:- Propósito: Señalar una dirección IPv6.
- Sintaxis:
AAAA('name', 'address', optional record modifiers)
- Ejemplo: (se omitió el modificador de registro, por lo que se utilizará el TTL predeterminado)
AAAA('@', 'your-server-ipv6-address')
-
CNAME
archivos:- Propósito: Hacer que su dominio/subdominio sea un alias de otro.
- Sintaxis:
CNAME('name', 'target', optional record modifiers)
- Ejemplo: (tenga en cuenta que se debe incluir un punto final si hay puntos en el valor)
CNAME('subdomain1', 'example.org.')
.
-
MX
archivos:- Propósito: Dirigir el correo electrónico a servidores/direcciones específicos.
- Sintaxis:
MX('name', 'priority', 'target', optional record modifiers)
- Ejemplo: (tenga en cuenta que se debe incluir un punto final si hay puntos en el valor)
MX('@', 10, 'mail.example.net')
.
-
TXT
archivos:- Propósito: agregar texto simple 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.')
-
CAA
archivos:- Propósito: Restringir e informar sobre las autoridades de certificación (CA) que pueden emitir certificados TLS para su dominio/subdominios.
- Sintaxis:
CAA('name', 'tag', 'value', optional record modifiers)
- Ejemplo:
CAA('@', 'issue', 'letsencrypt.org')
Para comenzar a agregar registros DNS para su dominio o zona DNS delegada, edite su archivo de configuración DNS:
- nano dnsconfig.js
A continuación, puede comenzar a completar los parámetros de la D()
función existente utilizando 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.
Como referencia, el bloque de código aquí contiene una configuración de muestra completa para una configuración de DNS inicial básica:
~/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:abuse@your_domain; aspf=s; adkim=s;'));
Una vez que haya completado su configuración de DNS inicial, guarde y cierre el archivo.
En este paso, se configura el archivo de configuración DNS inicial, que contiene los registros DNS. A continuación, se prueba la configuración y se implementa.
Paso 5: Prueba e implementación de la 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/proveedor de DNS en vivo.
En primer lugar, vaya a su dnscontrol
directorio:
- cd ~/dnscontrol
A continuación, utilice la preview
función DNSControl para comprobar la sintaxis de su archivo y mostrar qué cambios realizará (sin realizarlos realmente):
- dnscontrol preview
Si la sintaxis de su archivo de configuración de DNS es correcta, DNSControl mostrará una descripción general de los cambios que realizará. Debería verse 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:abuse@your_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 correctionsDone. 8 corrections.
Si ve una advertencia de error en su salida, DNSControl le proporcionará detalles sobre qué es el error y dónde se encuentra dentro de su archivo.
Advertencia: El siguiente comando realizará cambios en vivo en sus registros DNS y posiblemente en otras configuraciones. Asegúrese de estar preparado para esto, lo que incluye realizar una copia de seguridad de su configuración DNS existente y asegurarse de tener los medios para revertirla si es necesario.
Finalmente, puedes enviar los cambios a tu proveedor de DNS en vivo:
- 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:abuse@your_domain; aspf=s; adkim=s;" ttl=300SUCCESS!#2: CREATE A your_domain your-server-ipv4-address ttl=300SUCCESS!#3: CREATE AAAA your_domain your-server-ipv6-address ttl=300SUCCESS!#4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300SUCCESS!#5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300SUCCESS!#6: CREATE A www.your_domain your-server-ipv4-address ttl=300SUCCESS!#7: CREATE A mail.your_domain your-server-ipv4-address ttl=300SUCCESS!#8: CREATE MX your_domain 10 mail.your_domain. ttl=300SUCCESS!----- Registrar: none...0 correctionsDone. 8 corrections.
Ahora, si verifica la configuración de DNS de su dominio en el panel de control de DigitalOcean, verá los cambios.
También puede comprobar la creación del registro ejecutando una consulta DNS para su dominio/zona delegada utilizando dig
.
Si no lo tienes dig
instalado, necesitarás instalar el dnsutils
paquete:
- sudo apt install dnsutils
Una vez que lo hayas instalado dig
, podrás usarlo para realizar una búsqueda de DNS para tu dominio. Verás que los registros se han actualizado como corresponde:
- dig +short your_domain
Verá un resultado que muestra la dirección IP y el registro DNS correspondiente de su zona que se implementó mediante DNSControl. Los registros DNS pueden tardar un tiempo en propagarse, por lo que es posible que deba esperar y ejecutar este comando nuevamente.
En este paso final, ejecutó una verificación de sintaxis local del archivo de configuración de DNS, luego lo implementó en su proveedor de DNS en vivo y probó que los cambios se realizaron correctamente.
Conclusión
En este artículo, configuró DNSControl e implementó una configuración de DNS en un proveedor activo. Ahora puede administrar y probar los cambios de configuración de DNS en un entorno seguro y sin conexión antes de implementarlos en producción.
Si desea explorar este tema más a fondo, DNSControl está diseñado para integrarse en su flujo de trabajo de CI/CD, lo que le permite ejecutar pruebas en profundidad y tener más control sobre su implementación en producción. También puede considerar la posibilidad de integrar DNSControl en sus procesos de creación/implementación de infraestructura, lo que le permitirá implementar servidores y agregarlos a DNS de forma completamente automática.
Si desea avanzar más con DNSControl, los siguientes artículos de DigitalOcean ofrecen algunos pasos interesantes para ayudarle a integrar DNSControl en sus flujos de trabajo de gestió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 CI, Buildbot, Drone y Concourse
- Introducción a la gestión de la configuración
Deja una respuesta