בס״ד

DNS Propagation Checker

DNS propagation is cache expiry. Authoritative nameservers update the moment you save a record, and every recursive resolver keeps serving the old answer until the TTL it cached runs out, so a 300-second TTL clears in five minutes and an 86,400-second TTL can take a full day. Our propagation checker queries the same name against several public resolvers at once and shows which ones still hold the stale answer.

Record type
$ curl https://api.dnsx.dev/dns/propagation/example.com # A records, same result as JSON
$ curl "https://api.dnsx.dev/dns/propagation/example.com?type=MX"

What does the DNS propagation checker actually query?

Our checker sends the same question to nine public resolver addresses in parallel: Google Public DNS (8.8.8.8 and 8.8.4.4), Cloudflare (1.1.1.1 and 1.0.0.1), Quad9 (9.9.9.9) and OpenDNS (208.67.222.222 and 208.67.220.220), with 8.8.8.8 and 9.9.9.9 asked twice. It then compares the answers and reports which resolvers agree with the majority.

All of those queries leave one DNSX server in Europe. Each resolver address is anycast, announced from dozens of data centres, and the query lands at whichever is closest to our server. So the results show what the Google, Cloudflare, Quad9 and OpenDNS caches near Europe currently hold. They are not measurements from different countries, and a resolver node in Singapore can hold a different cached copy. For most changes this is still the useful view, because these four networks answer a large share of all DNS queries, and once they have picked up a change it is effectively live.

The tool checks A records by default and can query AAAA, MX, TXT, CNAME and NS records instead. Each row shows the answer and the response time.

Why does TTL decide how long DNS propagation takes?

Every DNS record carries a time to live, in seconds. When a recursive resolver fetches a record from the authoritative server, it stores the record with that TTL and answers from its cache until the TTL counts down to zero. Only then does it ask the authoritative server again. Nothing is pushed out to resolvers when a record changes, so the old value lives on in every cache that holds it for as long as the TTL that was in force when it was fetched.

This is why the TTL to lower is the one on the old record, and why it has to be lowered in advance. If a record has an 86,400-second TTL and you change its value and its TTL at the same time, resolvers that fetched it an hour ago will hold the old value for another 23 hours, because the TTL they hold is the old one. Lower the TTL to 300 seconds, wait at least 24 hours so every cached copy with the old TTL has expired, make the change, confirm it with our checker, then raise the TTL back to something sensible so resolvers are not fetching it every five minutes forever.

What is negative caching and why does a new record take time to appear?

Resolvers also cache the fact that a name does not exist. RFC 2308 defines negative caching: when the authoritative server answers NXDOMAIN or returns no records of the requested type, the resolver remembers that for a period taken from the minimum field of the zone's SOA record (or the SOA TTL, whichever is lower). If you look up a name before you create it, the resolver you used may keep answering that it does not exist for that long after you add it.

The negative TTL is set by the zone as a whole, not per record, and many providers use 3,600 seconds or more. Create the record before testing it, and if you have already tested, use a resolver that has not seen the name yet or wait out the SOA minimum.

How do I check DNS propagation on Windows?

Open Command Prompt or PowerShell. nslookup takes a resolver address as its last argument, so you can ask a public resolver and an authoritative nameserver in turn and compare the two answers. The PowerShell cmdlet Resolve-DnsName does the same with -Server and prints the TTL column, which nslookup only shows with -debug.

nslookup -type=NS example.com
nslookup example.com a.iana-servers.net
nslookup example.com 8.8.8.8
Resolve-DnsName example.com -Type A -Server 1.1.1.1

How do I check DNS propagation on macOS?

macOS ships dig, so no install is needed. The authoritative nameservers hold the zone itself and never cache, so their answer is the one every resolver will eventually pick up. Find them with an NS query and then ask one of them directly with the @ syntax. On an authoritative answer the TTL after the name is the full configured value.

$ dig NS example.com +short
a.iana-servers.net.
b.iana-servers.net.

$ dig @a.iana-servers.net example.com A +noall +answer
example.com.    3600    IN    A    93.184.215.14

How do I check DNS propagation on Linux?

dig comes from the dnsutils package on Debian and Ubuntu and from bind-utils on Fedora and RHEL. Ask a public resolver with the @ syntax and compare its answer with the authoritative one. On a cached answer the TTL is the time left, so it tells you how long the resolver will keep serving the old record.

$ dig @8.8.8.8 example.com A +noall +answer
example.com.    2417    IN    A    93.184.215.14   # 2417 seconds left in Google's cache

$ dig @a.iana-servers.net example.com A +noall +answer
example.com.    3600    IN    A    93.184.215.14

If the authoritative answer is wrong, the change was never made or was made in the wrong zone, and no amount of waiting will fix it. If the authoritative answer is right and a resolver differs, the resolver is caching and the remaining TTL tells you how long. Our DNS lookup can query the authoritative nameservers for you with the Authoritative resolver option.

Why do some resolvers lag behind or answer differently?

  • Large caches. Google and Cloudflare run many independent cache nodes per location. Two queries to 8.8.8.8 a second apart can hit two nodes with different expiry times, which is why our checker asks 8.8.8.8 twice and both rows can differ.
  • Filtering. Quad9 blocks names on its threat feeds and answers NXDOMAIN for them. OpenDNS does the same for categories its users have chosen. An empty answer from one of these while the others agree is filtering, not propagation.
  • GeoDNS. CDN-hosted domains answer with the address closest to the resolver that asked. Different resolvers legitimately get different A records, and none of them is stale. MX, TXT and NS records rarely vary this way, so checking one of those is a cleaner propagation test for such domains.
  • ISP resolvers that ignore TTL. Some ISP resolvers enforce a minimum cache time of hours regardless of the record's TTL. Our checker does not query ISP resolvers, so a change that looks complete here can still be stale for customers of such an ISP until their floor expires.
  • Serve-stale. RFC 8767 lets a resolver keep answering with an expired record while it is unable to reach the authoritative server. If your nameservers were unreachable during the change, resolvers may hold the old answer longer than the TTL.

How do I flush the DNS cache on my own machine?

Your computer, your browser and your router keep caches too. Flushing them only affects what you see, but it helps when the public resolvers already agree and your browser still opens the old site.

# Windows (Command Prompt or PowerShell)
ipconfig /flushdns

# macOS
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

# Linux with systemd-resolved (Ubuntu, Fedora, Debian 12 and later)
sudo resolvectl flush-caches

# Linux with nscd
sudo systemctl restart nscd

# Chrome and Edge, in the address bar
chrome://net-internals/#dns  then "Clear host cache"

Frequently Asked Questions

What is DNS propagation?
DNS propagation is the period after a DNS change during which some recursive resolvers still return the old record from their cache. Authoritative nameservers serve the new record immediately. Each resolver keeps the old one until the TTL it cached expires, so propagation time equals the old TTL, plus a little for the resolver to fetch again. The DNSX DNS propagation checker shows which public resolvers have picked up the change and which are still serving the cached answer.
How long does DNS propagation take?
As long as the TTL that was on the old record. A 300-second TTL clears in five minutes, a 3,600-second TTL in an hour and an 86,400-second TTL in a day. The often-quoted 24 to 48 hours is the worst case for a record that had a one-day TTL, plus resolvers that ignore TTLs. Lowering the TTL a day before a change makes the change itself propagate in minutes.
Does the DNS propagation checker test from different countries?
No. The DNSX DNS propagation checker sends every query from one server in Europe to the anycast addresses of Google Public DNS, Cloudflare, Quad9 and OpenDNS. Each of those is a global network with many caches, and the query reaches whichever node is nearest to the DNSX server. The results show what each resolver network is caching, which is what matters for most users, but they are not measurements from different geographic locations.
Why do some resolvers show a different answer from the others?
Usually because that resolver fetched the record before the change and its cached copy has not expired yet. Two other explanations are worth ruling out: GeoDNS, where the authoritative server deliberately answers differently depending on where the query came from, which is common for CDN-hosted sites, and filtering, where Quad9 or OpenDNS withholds an answer for a domain they classify as malicious. Querying the authoritative nameservers directly with dig shows the intended answer.
How do I speed up DNS propagation?
You cannot make a resolver discard a record before its TTL expires. What you can do is lower the TTL on the record at least one full old TTL before the change, so that by the time you change the value every resolver holds a copy that expires quickly. After the change, raise the TTL again. Google Public DNS and Cloudflare both offer a public cache flush page for individual names, which clears their caches but nobody else's.
How do I flush my local DNS cache?
On Windows run ipconfig /flushdns in a command prompt. On macOS run sudo dscacheutil -flushcache followed by sudo killall -HUP mDNSResponder. On Linux with systemd-resolved run sudo resolvectl flush-caches. This clears only the cache on your own machine. Your router and your ISP resolver keep their own caches, so a DNSX propagation check against public resolvers is a better guide to what the rest of the world sees.

Related tools