🏛️ How to check an authoritative server
Asks one authoritative server for the zone SOA, without recursion.
dig -4 @coleman.ns.cloudflare.com isitdns.net SOA +norecurseGO aa on the flags line and one SOA
NO GO no aa, which means that server is not authoritative for this zone
Step 1: find out who the authorities are#
NS records list the nameservers for a zone. Ask a public resolver, not your own, so the answer does not depend on a resolver that could itself be the thing that's broken:
dig @1.1.1.1 isitdns.net NS +shortReal output:
coleman.ns.cloudflare.com.
hera.ns.cloudflare.com.Reading it: two authoritative nameservers, in no particular order. Either answers correctly. Two or more is required practice (RFC 2182 section 5 requires at least two servers per zone), so one going down does not take the zone offline.
The trailing dot means the name is complete, ending at the root. See NS records for the full story.
Step 2: ask one of them directly#
Ask that server yourself, with recursion off so you're testing only what it personally knows (dig-flags covers every flag):
dig -4 @coleman.ns.cloudflare.com isitdns.net SOA +norecurseThat's the query shown at the top of this page. See SOA records for what each field in the answer means; the third field is the serial, the one the next two steps care about.
Step 3: read the answer#
The flags line is what matters.
| What you see | What it means |
|---|---|
qr | this is a response, not a question |
aa | authoritative answer. This server owns the zone and this is its own data (RFC 1035 §4.1.1). This is the flag you came for |
ra | recursion available. A resolver says this; an authoritative-only server does not (RFC 1035 §4.1.1) |
If aa is there, you succeeded. The server answered from its own zone data. No cache is involved.
If aa is missing, one of three things happened:
- You asked a server that does not own this zone. Check the name you used in step 1.
- Your network intercepted the query and a resolver answered instead. See the interception check on the troubleshooting index. The giveaway is
rabeing set. - The server owns a different zone than the one you asked about.
Step 4: check every authority agrees#
The most common real-world failure: one nameserver quietly missing the latest update, so a name works for some users and not others. Ask every authority for the serial and print them side by side:
for ns in $(dig +short NS isitdns.net); do
echo "$ns -> $(dig -4 @"$ns" +short isitdns.net SOA | awk '{print $3}')"
doneReal output:
hera.ns.cloudflare.com. -> 2410489729
coleman.ns.cloudflare.com. -> 2410489729Reading it: both servers report the same serial (RFC 1034 §4.3.5). This is what matching serials look like.
If the numbers differ, the server with the older serial (RFC 1982 §3.2) has not received the latest update. Its copy is stale, and any user who happens to ask that server gets old answers. That is a zone transfer problem: see zone transfers.
Quick reference#
The header line of any dig output ends with status:, and that word is the diagnosis.
| Status | Means | Usual cause |
|---|---|---|
NOERROR with an answer | it worked | nothing to do |
NOERROR with ANSWER: 0 | no record of that type (RFC 9824 §6) | you asked for AAAA on a name that only has A, for example |
NXDOMAIN | the name does not exist at all | typo, or the record was deleted |
REFUSED | "I am not answering that" | you asked a server about a zone it does not host |
SERVFAIL | something broke while answering | zone not loaded or expired (RFC 1034 §4.3.5); an EDE: line on the response names it outright (extended-dns-errors) |
timed out | nothing came back | server down, firewall blocking port 53, or wrong IP |
See also#
- check-a-delegation: whether the parent agrees these are the right nameservers
- check-a-forwarder: the other direction, when you are sending queries somewhere
- Nameserver consistency: the SOA serial at every server of a zone, the other records at a sample