Gestión de DNS con DNSControl
Aprende a gestionar tus zonas y registros DNS como código usando DNSControl con el proveedor de DNScale. Define toda tu configuración DNS en JavaScript.
DNSControl te permite gestionar DNS con un archivo de configuración basado en JavaScript. Defines tus zonas y registros en dnsconfig.js, previsualizas cambios con dnscontrol preview y los aplicas con dnscontrol push. El proveedor de DNScale se integra directamente con la API de DNScale, dándote control completo sobre tu infraestructura DNS como código.
Requisitos previos
Antes de comenzar, asegúrate de tener:
- DNSControl instalado (versión 4.0 o posterior) - Instalar DNSControl
- Una cuenta de DNScale con una clave API - Obtener tu clave API
- Familiaridad básica con la sintaxis de JavaScript
Configuración
DNSControl usa un archivo creds.json para las credenciales del proveedor. Crea este archivo en el directorio de tu proyecto:
{
"dnscale": {
"TYPE": "DNSCALE",
"api_key": "your-api-key-here"
}
}El proveedor se conecta a https://api.dnscale.eu/v1 por defecto. Para usar un endpoint de API personalizado, agrega api_url:
{
"dnscale": {
"TYPE": "DNSCALE",
"api_key": "your-api-key-here",
"api_url": "https://custom-api.example.com/v1"
}
}Mantén creds.json fuera del control de versiones. Agrégalo a tu .gitignore:
echo "creds.json" >> .gitignoreCreando tu primera zona
Crea un archivo dnsconfig.js con una definición de zona básica:
var REG_NONE = NewRegistrar("none");
var DSP_DNSCALE = NewDnsProvider("dnscale");
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
A("@", "192.0.2.1"),
A("www", "192.0.2.1")
);Esta configuración:
- Declara el proveedor DNScale usando las credenciales de
creds.json - Crea una zona para
example.com - Agrega dos registros A: uno en el apex (
@) y otro parawww
Cuando ejecutas dnscontrol push, DNScale crea automáticamente la zona si aún no existe.
Gestión de registros DNS
Registros A
Apuntar nombres de host a direcciones IPv4:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
A("@", "192.0.2.1"),
A("www", "192.0.2.1"),
A("api", "192.0.2.10", TTL(300))
);Registros AAAA
Agregar soporte IPv6:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
AAAA("@", "2001:db8::1"),
AAAA("www", "2001:db8::1")
);Registros CNAME
Crear alias para subdominios:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
CNAME("blog", "example.github.io."),
CNAME("docs", "readthedocs.io.")
);Registros ALIAS
Usar ALIAS para comportamiento similar a CNAME a nivel de apex:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
ALIAS("@", "loadbalancer.example.net.")
);Registros MX
Configurar la entrega de correo:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
MX("@", 10, "mail.example.com."),
MX("@", 20, "mail2.example.com.")
);Registros TXT
Agregar registros SPF, DKIM o de verificación:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
TXT("@", "v=spf1 include:_spf.google.com ~all"),
TXT("@", "google-site-verification=abc123"),
TXT("_dmarc", "v=DMARC1; p=reject; rua=mailto:dmarc@example.com")
);Registros CAA
Controlar qué autoridades certificadoras pueden emitir certificados para tu dominio:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
CAA("@", "issue", "letsencrypt.org"),
CAA("@", "issuewild", "letsencrypt.org"),
CAA("@", "iodef", "mailto:security@example.com")
);Registros SRV
Definir ubicaciones de servicios:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
SRV("_sip._tcp", 10, 60, 5060, "sip.example.com.")
);Registros PTR
Crear entradas de DNS inverso:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
PTR("1", "server.example.com.")
);Registros SSHFP
Publicar huellas de claves de host SSH:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
SSHFP("@", 1, 1, "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3")
);Registros TLSA
Asociar certificados TLS con nombres de dominio:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
TLSA("_443._tcp", 3, 1, 1, "abc123def456...")
);Registros HTTPS y SVCB
Configurar vinculación de servicios para conexiones HTTPS modernas:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
HTTPS("@", 1, ".", "alpn=h2,h3"),
SVCB("_dns.resolver", 1, "dns.example.com.", "alpn=dot")
);Configuración avanzada
Múltiples dominios
Gestionar varios dominios en un solo archivo de configuración:
var REG_NONE = NewRegistrar("none");
var DSP_DNSCALE = NewDnsProvider("dnscale");
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
A("@", "192.0.2.1"),
A("www", "192.0.2.1"),
MX("@", 10, "mail.example.com.")
);
D("example.org", REG_NONE, DnsProvider(DSP_DNSCALE),
A("@", "192.0.2.2"),
CNAME("www", "example.org.")
);
D("example.net", REG_NONE, DnsProvider(DSP_DNSCALE),
A("@", "192.0.2.3"),
CNAME("www", "example.net.")
);Uso de variables
Dado que dnsconfig.js es JavaScript, puedes usar variables para reducir la repetición:
var REG_NONE = NewRegistrar("none");
var DSP_DNSCALE = NewDnsProvider("dnscale");
var WEBSERVER_IP = "192.0.2.1";
var MAIL_SERVERS = [
MX("@", 10, "mx1.mailprovider.com."),
MX("@", 20, "mx2.mailprovider.com.")
];
var SPF = TXT("@", "v=spf1 include:_spf.mailprovider.com ~all");
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
A("@", WEBSERVER_IP),
A("www", WEBSERVER_IP),
MAIL_SERVERS,
SPF
);
D("example.org", REG_NONE, DnsProvider(DSP_DNSCALE),
A("@", WEBSERVER_IP),
A("www", WEBSERVER_IP),
MAIL_SERVERS,
SPF
);Macros con funciones
Crea patrones de registros reutilizables usando funciones de JavaScript:
function WEBSITE(ip) {
return [
A("@", ip),
A("www", ip),
AAAA("@", "2001:db8::1"),
AAAA("www", "2001:db8::1")
];
}
function GOOGLE_WORKSPACE() {
return [
MX("@", 1, "aspmx.l.google.com."),
MX("@", 5, "alt1.aspmx.l.google.com."),
MX("@", 5, "alt2.aspmx.l.google.com."),
TXT("@", "v=spf1 include:_spf.google.com ~all")
];
}
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
WEBSITE("192.0.2.1"),
GOOGLE_WORKSPACE()
);Flujo de trabajo de previsualización y aplicación
DNSControl usa un flujo de trabajo en dos pasos: primero previsualizas tus cambios, luego los aplicas.
Previsualizar cambios
dnscontrol previewEsto se conecta a la API de DNScale, compara tu dnsconfig.js con los registros actuales en producción y muestra qué cambiaría:
******************** Domain: example.com
1 correction (dnscale)
#1: CREATE A www.example.com 192.0.2.1 ttl=3600Aplicar cambios
Una vez que estés satisfecho con la previsualización, aplica los cambios:
dnscontrol push******************** Domain: example.com
1 correction (dnscale)
#1: CREATE A www.example.com 192.0.2.1 ttl=3600
Done. 1 correction.Mejores prácticas
Versiona tu configuración
Mantén dnsconfig.js en Git para rastrear cada cambio DNS:
git init
echo "creds.json" >> .gitignore
git add dnsconfig.js .gitignore
git commit -m "Initial DNS configuration"Siempre previsualiza antes de aplicar
Ejecuta dnscontrol preview antes de cada dnscontrol push. Esto detecta errores antes de que afecten el DNS en producción.
Usa CI/CD para despliegues automatizados
Agrega DNSControl a tu pipeline de CI/CD. Ejecuta preview en pull requests y push al fusionar en main:
# .github/workflows/dns.yml
name: DNS
on:
pull_request:
paths: ["dnsconfig.js"]
push:
branches: [main]
paths: ["dnsconfig.js"]
jobs:
dns:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install DNSControl
run: |
curl -sL https://github.com/StackExchange/dnscontrol/releases/latest/download/dnscontrol-Linux -o dnscontrol
chmod +x dnscontrol
- name: Preview
if: github.event_name == 'pull_request'
run: ./dnscontrol preview
env:
DNSCALE_API_KEY: ${{ secrets.DNSCALE_API_KEY }}
- name: Push
if: github.ref == 'refs/heads/main'
run: ./dnscontrol push
env:
DNSCALE_API_KEY: ${{ secrets.DNSCALE_API_KEY }}Mantén las credenciales seguras
Nunca hagas commit de creds.json. Usa variables de entorno o un gestor de secretos en CI/CD.
Ejemplo completo
Aquí tienes un dnsconfig.js completo para un sitio web típico con correo:
var REG_NONE = NewRegistrar("none");
var DSP_DNSCALE = NewDnsProvider("dnscale");
var SERVER_IP = "203.0.113.50";
D("mywebsite.com", REG_NONE, DnsProvider(DSP_DNSCALE),
// Sitio web
A("@", SERVER_IP),
AAAA("@", "2001:db8::50"),
CNAME("www", "mywebsite.com."),
// Subdominio API
A("api", "203.0.113.51", TTL(300)),
// Correo (Google Workspace)
MX("@", 1, "aspmx.l.google.com."),
MX("@", 5, "alt1.aspmx.l.google.com."),
MX("@", 5, "alt2.aspmx.l.google.com."),
MX("@", 10, "alt3.aspmx.l.google.com."),
MX("@", 10, "alt4.aspmx.l.google.com."),
// Seguridad de correo
TXT("@", "v=spf1 include:_spf.google.com ~all"),
TXT("_dmarc", "v=DMARC1; p=reject; rua=mailto:dmarc@mywebsite.com"),
// Autorización de autoridad certificadora
CAA("@", "issue", "letsencrypt.org"),
CAA("@", "issuewild", "letsencrypt.org"),
// Vinculación de servicio HTTPS
HTTPS("@", 1, ".", "alpn=h2,h3")
);Próximos pasos
- Lee la documentación de DNSControl para la referencia completa de configuración
- Aprende sobre los Tipos de registros DNS soportados por DNScale
- Comprende las Zonas DNS y cómo funcionan
- Explora los Métodos de importación de zonas para migrar DNS existente
- Configura la Seguridad de correo con SPF, DKIM y DMARC
Conclusión
DNSControl lleva el DNS como código a tu flujo de trabajo con una configuración JavaScript directa. Combinado con el proveedor de DNScale, obtienes cambios DNS versionados, flujos de trabajo seguros de previsualización antes de aplicar, y la capacidad de gestionar múltiples dominios desde un solo archivo. Ya sea que gestiones un dominio o cientos, DNSControl proporciona las herramientas para hacerlo de manera confiable y a escala.
dnscontrol push tu DNS hoy.