DNS Health Check
Domain validation for DNS: the registry's delegation, every nameserver asked directly, SOA, DNSSEC and mail records. 40 checks, each with its fix.
Walks from a root server to the .nl registry, then asks each nameserver of sidn.nl directly · 40 checks · about 3 s.nl registry → every nameserver · 40 checks
sidn.nl passes every check that ran, DNSSEC included
registered at SIDN·2.9 s
A+: nothing above info. Every nameserver answered with authority and agreed with the others, the timers sit inside Zonemaster's range, and Google Public DNS validates the DNSSEC chain from the root.
Asked over TCP from our server at Cloudflare's edge: the root, the .nl registry and every nameserver directly; Google Public DNS and Cloudflare for mail records and validation. We keep no log of what you check.
What does a DNS health check test?
A DNS health check follows a domain the way a resolver finds it and tests every step: the registry's delegation, each nameserver asked directly, whether those servers agree, the SOA record, DNSSEC and the mail records. This one runs 40 checks in seven groups and grades each at the level its authority sets.
Most checkers ask a resolver and grade what comes back. That hides the servers behind it: a resolver answers from whichever nameserver works, so a broken one stays invisible until the others fail too. Here every nameserver is asked over TCP with recursion off, the registry's copy of the NS records is compared with the zone's own, and the DNSSEC chain is verified from the DS at the registry to the signatures in the zone.
Use it as a DNS audit or a domain health check after any change: it goes further than a tool that lets you check DNS records one at a time: it tests the records a domain depends on, not only whether its website loads (for that, the Website Down Checker looks at the site itself). Copy report turns the result into a plain-text DNS report you can paste into a ticket.

The gradeFrom levels only: no critical, no error, two warnings make an A. The ring shows the score, 90 of 100.40 checks, one cell eachGrouped as the page lists them. Amber and blue cells are the warnings and notices; hatched cells couldn't run.Problems firstGroups with something to fix open at the top, each row with its authority and the fix.The pathA root server, the .com registry run by Verisign, then every nameserver asked directly: its answer, serial and EDNS.Chain of trustThe DNSSEC rail beside the path: green where it holds, dashed where it stops, red where it breaks.How is the grade worked out?
The letter comes only from the levels of what failed, never from a points table: any critical problem is an F, two or more errors a D, one error or five or more warnings a C, three or four warnings a B, one or two warnings (or only notices) an A, and nothing above info an A+.
The levels are the cited authority's own: Zonemaster's default profile where it defines the test, the RFC's MUST or SHOULD where it doesn't. The number out of 100 only ranks domains inside a letter (100 − 30 per critical, 12 per error, 4 per warning, 1 per notice). Checks our server can't run are never held against a domain; when a quarter or more can't run, the grade says partial.
- A+100nothing above infoINFO “definitely does not indicate a problem”sidn.nl100
- A90–991–2 warnings, or notices onlyNOTICE “should be known by the zone's administrator but that need not necessarily be a problem at all”github.com90example.com95bücher.de90
- B75–893–4 warningsWARNING “will under some circumstances be a problem, but that is unlikely to be noticed by a casual user”cloudflare.com87google.com83
- C60–741 error, or 5 or more warningsERROR “very likely (or possibly certain) to negatively affect the function of the zone”none in the sample
- D45–592 or more errorsdnssec-failed.org55
- F0–44any critical problemCRITICAL “can reasonably be said not to exist”a .com domain44
score = 100 − 30 × critical − 12 × error − 4 × warning − 1 × notice, kept inside the letter's band
partiala quarter or more of the checks couldn't run from our server, so the grade says so
Do the parent and child NS records match?
They should: the registry (the parent) and the zone (the child) each publish an NS set, and RFC 1912 §2.8 says to keep them the same. When the registry points at a server that doesn't answer for the zone, that's a lame delegation: the server answers REFUSED, or answers without the authoritative (AA) flag.
Resolvers move on to the next server, so one lame server costs time; when every listed server is lame, the domain stops resolving. Zonemaster rates names only the registry lists as an error (EXTRA_NAME_PARENT), names only the zone lists as a notice, and no working server at all as critical.
github.commatch
- ns-520.awsdns-01.net
- ns-421.awsdns-52.com
- ns-1707.awsdns-21.co.uk
- ns-1283.awsdns-32.org
- dns1–4.p08.nsone.net
- the same 8
8 of 8 answer with AA
a .net domainmismatch
- ns1.domaindirect.com
- ns2.domaindirect.comREFUSED
- ns3.domaindirect.com
- ns1.hover.com
- ns2.hover.com
no name in common · ns2.domaindirect.com REFUSED · 2 errors
a .com domainlame delegation
- ns63.domaincontrol.comREFUSED
- ns64.domaincontrol.comREFUSED
- nobody answersSERVFAIL
every server REFUSED · resolvers answer SERVFAIL · CRITICAL
How many nameservers does a domain need?
At least two, and three is the recommendation. RFC 1034 §4.1 requires every zone to be available on at least two servers, and RFC 2182 §5 recommends three for most organisation-level zones. One nameserver is an error in Zonemaster; two pass with an info note.
Where they are matters more than how many, so the nameserver check looks at their networks too. Servers in one network fail together: Zonemaster warns when every address sits in one autonomous system (IPV4_ONE_ASN), even for anycast hosts like Google, Cloudflare or Akamai, whose addresses each answer from many sites. Anycast spreads the load; it's still one operator.
- google.com4 NS · 1 networkone network
- github.com8 NS · 2 networksspread
- sidn.nl3 NS · 2 networksspread
- cloudflare.com5 NS · 1 networkone network
- nasa.gov6 NS · 1 networkone network
- example.com2 NS · 1 networkone network
AS1921 ipcomAS13335 CloudflareAS15169 GoogleAS16509 AmazonAS21342 AkamaiAS48283 SIDNAS62597 NS1
“It is recommended that three servers be provided for most organisation level zones, with at least one which must be well removed from the others.” RFC 2182 §5
Are your SOA record values right?
If a large DNS host set them, they're almost certainly fine, even when a checker flags them. Refresh, retry and expire only steer secondary servers that copy the zone by zone transfer. Minimum is the negative-caching TTL (RFC 2308): how long resolvers remember that a name doesn't exist.
RIPE-203 (1999) recommends refresh 86400, retry 7200, expire 3600000 and minimum 172800, the last from before RFC 2308. Zonemaster sets lower floors: refresh 14400 and retry 3600 (notices), expire 604800 (the only warning), minimum between 300 and 86400 (a notice). Cloudflare's, Route 53's and Azure's defaults sit under the refresh and retry floors; Google Cloud DNS's 3-day expire is the one warning among the big hosts.
| refreshZonemaster ≥ 4 hr · ◆ 1 day | retryZonemaster ≥ 1 hr · ◆ 2 hr | expireZonemaster ≥ 7 days · ◆ 41.7 days | minimumZonemaster 5 min – 1 day · ◆ 2 days | ||
|---|---|---|---|---|---|
| Cloudflare | 2.8 hr | 40 min | 7 days | 30 min | 2 notices |
| Amazon Route 53 | 2 hr | 15 min | 14 days | 1 day | 2 notices |
| Google Cloud DNS | 6 hr | 1 hr | 3 days | 5 min | 1 warning |
| Azure DNS | 1 hr | 5 min | 28 days | 5 min | 2 notices |
| GoDaddy | 8 hr | 2 hr | 7 days | 1 hr | pass |
| Namecheap BasicDNS | 12 hr | 1 hr | 7 days | 1 hr | pass |
| google.com (its own) | 15 min | 15 min | 30 min | 1 min | 1 warning · 3 notices |
under Zonemaster's floorpassnoticewarningRIPE-203 (1999)
DNSSEC check: DS, DNSKEY and signatures
A DNSSEC check walks the chain of trust: the DS record at the registry must be the digest of a key (DNSKEY) in the zone, that key must sign the zone's key set, and every signature (RRSIG) must verify and be inside its validity window. This check computes the digest and verifies each signature itself, then asks Google Public DNS whether it validates.
Break any link and validating resolvers answer SERVFAIL: the domain disappears for everyone behind them. dnssec-failed.org, a test zone kept broken on purpose, shows two breaks at once. Algorithms are judged by IANA's registry (RFC 9904): 8, 13 and 15 are recommended, while 5 and 7, which sign with SHA-1, must no longer be used (RFC 9905) and Zonemaster rates them an error.
cloudflare.comsecure
- DS 2371 at .comalgorithm 13 · SHA-256 · 329968…26F2B9
- the digest matches key 2371
- DNSKEY 2371 · KSKflags 257 · ECDSA P-256 (13)
- signs the key set · 50.8 days left of 61 days
- DNSKEY 34505 · ZSKflags 256 · ECDSA P-256 (13)
- signs the records · SOA: 1 day left of 2 days
- Google Public DNSAD flag set: secure
dnssec-failed.orgbogus
- DS 42069 at .orgalgorithm 13 · SHA-256
- no key 42069 in the zone
- DNSKEY 50719 · KSKthe zone's real key-signing key
- its signature on the key set expired 112 days ago
- DNSKEY 32784 · ZSKsigns the SOA: valid, 5.7 days left of 7 days
- nothing trusted reaches it
- Google Public DNSSERVFAIL; answers once CD is set: bogus
Signing algorithms (IANA registry, RFC 9904)
- RECOMMENDED8 RSASHA256 · 13 ECDSAP256SHA256 · 15 ED25519use these
- MAY14 ECDSAP384SHA384 · 16 ED448allowed
- NOT RECOMMENDED10 RSASHA512Zonemaster WARNING
- MUST NOT5 RSASHA1 · 7 RSASHA1-NSEC3-SHA1 · 1 · 3 · 6 · 12RFC 9905 · Zonemaster ERROR
both chains above sign with 13
Mail DNS: MX, SPF and DMARC
The mail checks read what receiving servers read: the MX records (or a null MX that says the domain takes no mail, RFC 7505), one SPF record within RFC 7208's limit of 10 DNS lookups, and a DMARC policy (RFC 9989, which replaced RFC 7489 in May 2026).
SPF is evaluated, not just found: every include is followed and counted. github.com's record needs exactly 10 lookups plus one void lookup: valid, with no room left. A domain that never sends mail should say so: example.com publishes the parked set, a null MX, v=spf1 -all and p=reject. For the details, the SPF checker and DMARC checker go further.
github.comsends and receives
example.comparked set
Check DNS health from the command line (dig)
Four steps with dig and delv repeat the core of this check: follow the delegation from the root, ask one nameserver directly with recursion off, compare the DS at the registry with the zone's keys, and let a validating resolver judge the chain.
Add +tcp to see what our server sees; leave it off to test UDP, which a web tool on Cloudflare's network can't. In the reply's header, aa marks an authoritative answer; REFUSED, or no aa flag from a server the registry lists, is a lame delegation.
Terminal · dig 9.20
$ dig +trace +tcp github.com NS ;; (shortened) com. 172800 IN NS a.gtld-servers.net. ;; from h.root-servers.net 1 github.com. 172800 IN NS ns-520.awsdns-01.net. ;; from h.gtld-servers.net: 8 NS 2 $ dig @ns-421.awsdns-52.com github.com SOA +norec +tcp ;; flags: qr aa; QUERY: 1, ANSWER: 1 3 github.com. 900 IN SOA ns-1707.awsdns-21.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 4 $ dig @a.gtld-servers.net github.com DS +norec ;; status: NOERROR, ANSWER: 0 ;; no DS: unsigned 5 $ delv @8.8.8.8 cloudflare.com SOA ; fully validated 6 cloudflare.com. 300 IN SOA ns3.cloudflare.com. dns.cloudflare.com. 2417999975 10000 2400 604800 300
- The root refers .com to its 13 servers
- The registry's NS set for github.com, kept 2 days
- aa: an authoritative answer, not a cache
- SOA: serial 1, then refresh, retry, expire, minimum
- No DS at .com: nothing for DNSSEC to verify
- delv validated the chain from the root
Why do DNS checkers disagree?
Because they grade against different numbers. Classic checkers flag providers' defaults: intoDNS calls google.com's expire of 1800 seconds “NOT OK” and errors on github.com's two serials, which are normal for two DNS hosts. Zonemaster rates the serials a warning and recognises a null MX; our own first version got neither right.
And they see the network from different places. Zonemaster (AFNIC and the Swedish Internet Foundation) asks over UDP and TCP, on IPv4 and IPv6. This check runs on Cloudflare's edge: it asks over TCP only, doesn't dial IPv6, and can't connect to Cloudflare's own addresses, so those servers are read through 1.1.1.1 and their checks are marked not tested, never failed. As an intoDNS alternative, it shows the authority behind every level instead of a bare OK or NOT OK.
| Case | intoDNS | Zonemaster | DNS Robot v1 | This check |
|---|---|---|---|---|
| github.comtwo SOA serials (two DNS hosts) | error“Looks like your nameservers do not agree on the SOA serial.” | warningMULTIPLE_ | fail“Serial mismatch detected: 1656468023 vs 1.” | warningexplained: one serial per DNS host |
| google.comSOA expire 1,800 s | not ok“Your SOA EXPIRE number is: 1800. That is NOT OK” | warningEXPIRE_ | fail“too low (min recommended: 14 days)” | warningwith what expire affects |
| example.comnull MX (0 .) | error“0 No A Record (no glue either)” | infoZ09_ | pass“Found 1 MX record(s)” | passnull MX recognised |
| cloudflare.comSOA retry 2,400 s | —not quoted | noticeRETRY_ | fail“too high (max recommended: 15min)” | noticeCloudflare's default |
| cloudflare.comsigned with DNSSEC | not checkedno DNSSEC test | passDNSSEC02 · 05 · 08: chain verified | warn“DNSSEC does not appear to be enabled for this domain.” | passDS → KSK → RRSIG verified, Google validates |
DNS health check: questions
What is a DNS health check?
Is domain validation the same as a DNS health check?
What is a lame delegation and how do I fix it?
My DNS host is anycast. Why the warning for one network?
My SOA timers are flagged. Do I need to change them?
Why are some checks marked “not tested”?
Why do my nameservers report different SOA serials?
Is this a DNSSEC checker, and does no DNSSEC lower the grade?
How often should I run a DNS health check?
Do you keep the domains I check?
Missing something?Suggest a feature or a new tool
Related tools
DNSSEC Checker
Test a domain's DNSSEC from the root key down: whether the chain of trust verifies, which resolvers refuse it, and the fix at its DNS host and registrar
CAA Record Checker
See which certificate authorities may issue for a domain, read the way a CA reads CAA, against the certificates in use; then generate a correct set
NS Lookup
Discover nameservers for any domain with provider detection
DNS Lookup
Every DNS record from the domain's own nameservers, beside Google's and Cloudflare's cache
MX Lookup
Find mail exchange records and mail server details
WHOIS Lookup
Look up domain registration, registrar, and owner details via RDAP
SPF Record Checker
Validate SPF records and check DNS lookup count per RFC 7208
DMARC Checker
Check any domain's DMARC policy the way receivers read it, with reports, SPF and DKIM


