🔎 How to check a resolver
resolver: the server your machine asks first
Asks one resolver for a zone's SOA record.
dig @1.1.1.1 isitdns.net SOAGO NOERROR, one SOA, and ra on the flags line
NO GO SERVFAIL or a timeout, which means this resolver cannot answer for you
Step 1: find which resolver you use#
The setting you configured is not always the one in use.
| OS | Command |
|---|---|
| Linux (systemd) | resolvectl status | grep -A2 "Current DNS" |
| Linux (other, or a container) | cat /etc/resolv.conf |
| macOS | scutil --dns | grep nameserver | head -5 |
| Windows (PowerShell) | Get-DnsClientServerAddress -AddressFamily IPv4 |
Look for the nameserver line. That is who your machine asks. On modern Linux that is often 127.0.0.53, a local stub, not a real remote server; resolvectl status shows what it forwards to.
Browsers can run their own DoH (RFC 8484 section 1) and bypass this setting entirely. If a name works in the terminal but not the browser, or the other way around, that is why. See dot-doh.
Step 2: does it answer?#
Ask it something simple:
dig @1.1.1.1 isitdns.net A +shortSwap 1.1.1.1 for your own resolver's IP. Real output:
104.21.56.211
172.67.155.242Reading it: two IPv4 addresses, so the name resolves. Two is normal; many services publish several addresses so clients can try another if one fails.
If nothing comes back, work through the header line instead, which +short hides. Run it again without +short and read the status: word:
| Status | Means |
|---|---|
NOERROR with answers | working |
NOERROR, ANSWER: 0 | no record of that type (RFC 9824 §6) |
NXDOMAIN | the name does not exist |
SERVFAIL | the resolver tried and failed, often DNSSEC, see dnssec-troubleshooting. If the answer carries an EDE: line, it already names the cause (extended-dns-errors) |
REFUSED | the resolver will not serve you, usually an access list |
timed out | no reply from that address |
Step 3: is it telling you the truth?#
A resolver that answers is not necessarily a resolver that is honest. The test is to ask several and compare.
for r in 1.1.1.1 8.8.8.8 9.9.9.9; do
echo "$r -> $(dig -4 @"$r" +short isitdns.net A | tr '\n' ' ')"
doneWhat you want: the same set of addresses from each, allowing for order changes and for large services that legitimately vary by location.
A network between you and the resolver can intercept port 53 and answer in the resolver's name; preventing exactly that is a stated goal of DoH (RFC 8484 section 1). Confirm over an encrypted transport, which that network cannot forge:
dig @1.1.1.1 +https +dnssec isitdns.net AIf +https shows ad and the plain UDP query does not, something on the path answered for the resolver or rewrote its reply (RFC 2694). See dot-doh.
If one differs sharply, especially by returning a single address on a private range like 192.168.x.x or 10.x.x.x when the others return public addresses, that resolver is rewriting answers. That can be deliberate (split horizon, parental filtering, enterprise blocking) or hostile.
If all three agree with each other but disagree with what you get without @, the thing rewriting answers is between you and all of them. See the interception check on the troubleshooting index.
Step 4: confirm it is a resolver, not an authority#
A resolver does the lookup work for you: RFC 1034 §2.4 calls resolvers "programs that extract information from name servers in response to client requests". An authoritative server owns a zone and answers only for that zone.
dig @1.1.1.1 isitdns.net SOACheck the flags line:
rapresent: recursion available, this is a resolver and it will do work for youaapresent: authoritative, this server owns the zone the name is in. A server can set both; readrafor the recursion question andaafor the ownership one
An authoritative-only server does not recurse (RFC 1034 §4.3.2, step 1), so a machine pointed at one can look up names in that one zone and nothing else. Details in query-types.
Quick reference#
| Symptom | Where to look |
|---|---|
| nothing resolves at all | step 1, check whether you are pointed at the wrong server |
| one record is stale, others fine | compare directly against the authority: check-an-auth |
| answers differ between resolvers | step 3, something is rewriting |
| works in terminal, not in browser | browser has its own DNS, see dot-doh |
| only names in one zone resolve | step 4, that is an authoritative server |
SERVFAIL on one specific name | extended-dns-errors first, then dnssec-troubleshooting |
See also#
- check-a-forwarder: when your resolver hands queries onward
- nslookup-and-dig: tool comparison
- anatomy-of-a-query: the full journey of one lookup
- Resolver comparison: one name at four public resolvers, side by side