Découvrez PostScale -- API e-mail pour l'envoi transactionnel, la réception et les adresses masquées. PostScale

    Gerer le DNS avec DNSControl

    Apprenez a gerer vos zones et enregistrements DNS en tant que code avec DNSControl et le provider DNScale. Definissez toute votre configuration DNS en JavaScript.

    DNSControl vous permet de gerer le DNS avec un fichier de configuration base sur JavaScript. Vous definissez vos zones et enregistrements dans dnsconfig.js, previsualiser les changements avec dnscontrol preview et les appliquez avec dnscontrol push. Le provider DNScale s'integre directement avec l'API DNScale, vous donnant un controle total sur votre infrastructure DNS en tant que code.

    Prerequis

    Avant de commencer, assurez-vous de disposer de :

    1. DNSControl installe (version 4.0 ou ulterieure) - Installer DNSControl
    2. Un compte DNScale avec une cle API - Obtenir votre cle API
    3. Une familiarite de base avec la syntaxe JavaScript

    Configuration

    DNSControl utilise un fichier creds.json pour les identifiants des providers. Creez ce fichier dans le repertoire de votre projet :

    {
      "dnscale": {
        "TYPE": "DNSCALE",
        "api_key": "your-api-key-here"
      }
    }

    Le provider se connecte a https://api.dnscale.eu/v1 par defaut. Pour utiliser un endpoint API personnalise, ajoutez api_url :

    {
      "dnscale": {
        "TYPE": "DNSCALE",
        "api_key": "your-api-key-here",
        "api_url": "https://custom-api.example.com/v1"
      }
    }

    Gardez creds.json hors du controle de version. Ajoutez-le a votre .gitignore :

    echo "creds.json" >> .gitignore

    Creer votre premiere zone

    Creez un fichier dnsconfig.js avec une definition de zone basique :

    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")
    );

    Cette configuration :

    • Declare le provider DNScale en utilisant les identifiants de creds.json
    • Cree une zone pour example.com
    • Ajoute deux enregistrements A : un a l'apex (@) et un pour www

    Lorsque vous executez dnscontrol push, DNScale cree automatiquement la zone si elle n'existe pas encore.

    Gerer les enregistrements DNS

    Enregistrements A

    Pointer des noms d'hotes vers des adresses 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))
    );

    Enregistrements AAAA

    Ajouter le support IPv6 :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      AAAA("@", "2001:db8::1"),
      AAAA("www", "2001:db8::1")
    );

    Enregistrements CNAME

    Creer des alias pour les sous-domaines :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      CNAME("blog", "example.github.io."),
      CNAME("docs", "readthedocs.io.")
    );

    Enregistrements ALIAS

    Utiliser ALIAS pour un comportement de type CNAME au niveau apex :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      ALIAS("@", "loadbalancer.example.net.")
    );

    Enregistrements MX

    Configurer la distribution du courrier :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      MX("@", 10, "mail.example.com."),
      MX("@", 20, "mail2.example.com.")
    );

    Enregistrements TXT

    Ajouter des enregistrements SPF, DKIM ou de verification :

    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")
    );

    Enregistrements CAA

    Controler quelles autorites de certification peuvent emettre des certificats pour votre domaine :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      CAA("@", "issue", "letsencrypt.org"),
      CAA("@", "issuewild", "letsencrypt.org"),
      CAA("@", "iodef", "mailto:security@example.com")
    );

    Enregistrements SRV

    Definir les emplacements de services :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      SRV("_sip._tcp", 10, 60, 5060, "sip.example.com.")
    );

    Enregistrements PTR

    Creer des entrees DNS inverses :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      PTR("1", "server.example.com.")
    );

    Enregistrements SSHFP

    Publier les empreintes de cles d'hote SSH :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      SSHFP("@", 1, 1, "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3")
    );

    Enregistrements TLSA

    Associer des certificats TLS a des noms de domaine :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      TLSA("_443._tcp", 3, 1, 1, "abc123def456...")
    );

    Enregistrements HTTPS et SVCB

    Configurer la liaison de service pour les connexions HTTPS modernes :

    D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
      HTTPS("@", 1, ".", "alpn=h2,h3"),
      SVCB("_dns.resolver", 1, "dns.example.com.", "alpn=dot")
    );

    Configuration avancee

    Plusieurs domaines

    Gerer plusieurs domaines dans un seul fichier de configuration :

    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.")
    );

    Utiliser des variables

    Comme dnsconfig.js est du JavaScript, vous pouvez utiliser des variables pour reduire la repetition :

    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 avec fonctions

    Creer des modeles d'enregistrements reutilisables a l'aide de fonctions 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()
    );

    Workflow de previsualisation et d'application

    DNSControl utilise un workflow en deux etapes : previsualiser d'abord vos changements, puis les appliquer.

    Previsualiser les changements

    dnscontrol preview

    Cela se connecte a l'API DNScale, compare votre dnsconfig.js avec les enregistrements actuels en production et affiche ce qui changerait :

    ******************** Domain: example.com
    1 correction (dnscale)
    #1: CREATE A www.example.com 192.0.2.1 ttl=3600

    Appliquer les changements

    Une fois satisfait de la previsualisation, appliquez les changements :

    dnscontrol push
    ******************** Domain: example.com
    1 correction (dnscale)
    #1: CREATE A www.example.com 192.0.2.1 ttl=3600
    Done. 1 correction.

    Bonnes pratiques

    Versionnez votre configuration

    Gardez dnsconfig.js dans Git pour suivre chaque changement DNS :

    git init
    echo "creds.json" >> .gitignore
    git add dnsconfig.js .gitignore
    git commit -m "Initial DNS configuration"

    Toujours previsualiser avant d'appliquer

    Executez dnscontrol preview avant chaque dnscontrol push. Cela detecte les erreurs avant qu'elles n'affectent le DNS en production.

    Utilisez le CI/CD pour les deploiements automatises

    Ajoutez DNSControl a votre pipeline CI/CD. Executez preview sur les pull requests et push lors de la fusion dans 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 }}

    Securisez les identifiants

    Ne commitez jamais creds.json. Utilisez des variables d'environnement ou un gestionnaire de secrets en CI/CD.

    Exemple complet

    Voici un dnsconfig.js complet pour un site web typique avec messagerie :

    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),
     
      // Site web
      A("@", SERVER_IP),
      AAAA("@", "2001:db8::50"),
      CNAME("www", "mywebsite.com."),
     
      // Sous-domaine API
      A("api", "203.0.113.51", TTL(300)),
     
      // Messagerie (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."),
     
      // Securite e-mail
      TXT("@", "v=spf1 include:_spf.google.com ~all"),
      TXT("_dmarc", "v=DMARC1; p=reject; rua=mailto:dmarc@mywebsite.com"),
     
      // Autorisation d'autorite de certification
      CAA("@", "issue", "letsencrypt.org"),
      CAA("@", "issuewild", "letsencrypt.org"),
     
      // Liaison de service HTTPS
      HTTPS("@", 1, ".", "alpn=h2,h3")
    );

    Prochaines etapes

    Conclusion

    DNSControl apporte le DNS-as-code a votre workflow avec une configuration JavaScript simple. Combine au provider DNScale, vous obtenez des changements DNS versiones, des workflows securises de previsualisation avant application, et la capacite de gerer plusieurs domaines depuis un seul fichier. Que vous geriez un domaine ou des centaines, DNSControl fournit les outils pour le faire de maniere fiable et a grande echelle.

    dnscontrol push votre DNS des aujourd'hui.