Presentamos PostScale -- API de correo para envíos transaccionales, recepción y direcciones enmascaradas. PostScale

    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:

    1. DNSControl instalado (versión 4.0 o posterior) - Instalar DNSControl
    2. Una cuenta de DNScale con una clave API - Obtener tu clave API
    3. 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" >> .gitignore

    Creando 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 para www

    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 preview

    Esto 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=3600

    Aplicar 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

    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.