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 :
- DNSControl installe (version 4.0 ou ulterieure) - Installer DNSControl
- Un compte DNScale avec une cle API - Obtenir votre cle API
- 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" >> .gitignoreCreer 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 pourwww
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 previewCela 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=3600Appliquer 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
- Consultez la documentation DNSControl pour la reference complete de configuration
- Decouvrez les types d'enregistrements DNS pris en charge par DNScale
- Comprenez les zones DNS et leur fonctionnement
- Explorez les methodes d'import de zones pour migrer un DNS existant
- Configurez la securite e-mail avec SPF, DKIM et DMARC
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.