DNS beheren met DNSControl
Leer hoe je je DNS-zones en -records als code beheert met DNSControl en de DNScale-provider. Definieer je volledige DNS-configuratie in JavaScript.
DNSControl laat je DNS beheren met een JavaScript-gebaseerd configuratiebestand. Je definieert je zones en records in dnsconfig.js, bekijkt wijzigingen vooraf met dnscontrol preview en past ze toe met dnscontrol push. De DNScale-provider integreert rechtstreeks met de DNScale API, waardoor je volledige controle hebt over je DNS-infrastructuur als code.
Vereisten
Voordat je begint, zorg dat je het volgende hebt:
- DNSControl geinstalleerd (versie 4.0 of hoger) - DNSControl installeren
- Een DNScale-account met een API-sleutel - Haal je API-sleutel op
- Basiskennis van JavaScript-syntax
Configuratie
DNSControl gebruikt een creds.json-bestand voor providerreferenties. Maak dit bestand aan in je projectmap:
{
"dnscale": {
"TYPE": "DNSCALE",
"api_key": "your-api-key-here"
}
}De provider maakt standaard verbinding met https://api.dnscale.eu/v1. Om een aangepast API-endpoint te gebruiken, voeg api_url toe:
{
"dnscale": {
"TYPE": "DNSCALE",
"api_key": "your-api-key-here",
"api_url": "https://custom-api.example.com/v1"
}
}Houd creds.json buiten versiebeheer. Voeg het toe aan je .gitignore:
echo "creds.json" >> .gitignoreJe eerste zone aanmaken
Maak een dnsconfig.js-bestand met een basale zonedefinitie:
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")
);Deze configuratie:
- Declareert de DNScale-provider met referenties uit
creds.json - Maakt een zone aan voor
example.com - Voegt twee A-records toe: een op het apex (
@) en een voorwww
Wanneer je dnscontrol push uitvoert, maakt DNScale de zone automatisch aan als deze nog niet bestaat.
DNS-records beheren
A-records
Wijs hostnamen naar IPv4-adressen:
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))
);AAAA-records
Voeg IPv6-ondersteuning toe:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
AAAA("@", "2001:db8::1"),
AAAA("www", "2001:db8::1")
);CNAME-records
Maak aliassen voor subdomeinen:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
CNAME("blog", "example.github.io."),
CNAME("docs", "readthedocs.io.")
);ALIAS-records
Gebruik ALIAS voor CNAME-achtig gedrag op apex-niveau:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
ALIAS("@", "loadbalancer.example.net.")
);MX-records
Configureer e-mailbezorging:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
MX("@", 10, "mail.example.com."),
MX("@", 20, "mail2.example.com.")
);TXT-records
Voeg SPF-, DKIM- of verificatierecords toe:
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")
);CAA-records
Bepaal welke certificaatautoriteiten certificaten mogen uitgeven voor je domein:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
CAA("@", "issue", "letsencrypt.org"),
CAA("@", "issuewild", "letsencrypt.org"),
CAA("@", "iodef", "mailto:security@example.com")
);SRV-records
Definieer servicelocaties:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
SRV("_sip._tcp", 10, 60, 5060, "sip.example.com.")
);PTR-records
Maak reverse DNS-entries aan:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
PTR("1", "server.example.com.")
);SSHFP-records
Publiceer SSH-hostsleutelfingerprints:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
SSHFP("@", 1, 1, "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3")
);TLSA-records
Koppel TLS-certificaten aan domeinnamen:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
TLSA("_443._tcp", 3, 1, 1, "abc123def456...")
);HTTPS- en SVCB-records
Configureer service binding voor moderne HTTPS-verbindingen:
D("example.com", REG_NONE, DnsProvider(DSP_DNSCALE),
HTTPS("@", 1, ".", "alpn=h2,h3"),
SVCB("_dns.resolver", 1, "dns.example.com.", "alpn=dot")
);Geavanceerde configuratie
Meerdere domeinen
Beheer meerdere domeinen in één configuratiebestand:
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.")
);Variabelen gebruiken
Aangezien dnsconfig.js JavaScript is, kun je variabelen gebruiken om herhaling te verminderen:
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
);Macro's met functies
Maak herbruikbare recordpatronen met JavaScript-functies:
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()
);Preview- en push-workflow
DNSControl gebruikt een tweestaps-workflow: bekijk eerst je wijzigingen, pas ze daarna toe.
Wijzigingen bekijken
dnscontrol previewDit maakt verbinding met de DNScale API, vergelijkt je dnsconfig.js met de huidige live records en toont wat er zou veranderen:
******************** Domain: example.com
1 correction (dnscale)
#1: CREATE A www.example.com 192.0.2.1 ttl=3600Wijzigingen toepassen
Als je tevreden bent met de preview, pas de wijzigingen toe:
dnscontrol push******************** Domain: example.com
1 correction (dnscale)
#1: CREATE A www.example.com 192.0.2.1 ttl=3600
Done. 1 correction.Best practices
Versiebeheer voor je configuratie
Bewaar dnsconfig.js in Git om elke DNS-wijziging bij te houden:
git init
echo "creds.json" >> .gitignore
git add dnsconfig.js .gitignore
git commit -m "Initial DNS configuration"Altijd preview voor push
Voer dnscontrol preview uit voor elke dnscontrol push. Dit vangt fouten op voordat ze live DNS beinvloeden.
Gebruik CI/CD voor geautomatiseerde deployments
Voeg DNSControl toe aan je CI/CD-pipeline. Voer preview uit bij pull requests en push bij merge naar 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 }}Houd referenties veilig
Commit nooit creds.json. Gebruik omgevingsvariabelen of een secrets manager in CI/CD.
Volledig voorbeeld
Hier is een compleet dnsconfig.js voor een typische website met e-mail:
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),
// Website
A("@", SERVER_IP),
AAAA("@", "2001:db8::50"),
CNAME("www", "mywebsite.com."),
// API-subdomein
A("api", "203.0.113.51", TTL(300)),
// E-mail (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."),
// E-mailbeveiliging
TXT("@", "v=spf1 include:_spf.google.com ~all"),
TXT("_dmarc", "v=DMARC1; p=reject; rua=mailto:dmarc@mywebsite.com"),
// Certificaatautoriteit-autorisatie
CAA("@", "issue", "letsencrypt.org"),
CAA("@", "issuewild", "letsencrypt.org"),
// HTTPS service binding
HTTPS("@", 1, ".", "alpn=h2,h3")
);Volgende stappen
- Lees de DNSControl-documentatie voor de volledige configuratiereferentie
- Leer over DNS-recordtypen die door DNScale worden ondersteund
- Begrijp DNS-zones en hoe ze werken
- Ontdek Zone-importmethoden om bestaande DNS te migreren
- Stel E-mailbeveiliging met SPF, DKIM en DMARC in
Conclusie
DNSControl brengt DNS-as-code naar je workflow met een eenvoudige JavaScript-configuratie. Gecombineerd met de DNScale-provider krijg je versiebeheerde DNS-wijzigingen, veilige preview-voor-push-workflows en de mogelijkheid om meerdere domeinen vanuit één bestand te beheren. Of je nu één domein of honderden beheert, DNSControl biedt de tools om het betrouwbaar en op schaal te doen.
dnscontrol push je DNS vandaag nog.