Type something to search...
What are the most common DNS mistakes that take websites offline?

What are the most common DNS mistakes that take websites offline?

The most common DNS mistakes that take websites offline are letting the domain expire, changing nameservers without copying every record to the new provider, leaving an old DNSSEC DS record at the registrar after switching DNS hosts, making changes with a long TTL still in place, typing the wrong IP address or hostname, deleting records you didn't realise were in use, missing the trailing dot in zone files, and relying on a single DNS provider or a single nameserver. Almost all of them come down to small, rushed changes made without checking what the world will actually see afterwards.

DNS outages are frustrating because the site itself is usually fine. The server is running, the code hasn't changed, but nobody can find it. In this article you'll learn the mistakes that cause most DNS-related downtime, how to recognise each one quickly with dig, and the habits and checks that stop them happening in the first place.

Why DNS Mistakes Hurt So Much

DNS mistakes have two properties that make them worse than most configuration errors.

  • They're cached: A bad record is copied into resolvers all over the world and kept for its TTL. Fixing the record at your provider doesn't fix those caches instantly.
  • They affect everything: Your website, API, email, and third-party services all depend on the same zone. A single wrong change can take all of them down at once.

That combination means the best fix is prevention, and the second best is noticing quickly. Keep both in mind as you read through the list.

Mistake 1: Letting the Domain Expire

This is the most basic mistake and still one of the most common. When a domain expires, the registry eventually stops publishing its NS records, and the whole domain stops resolving. Depending on the registrar, you might also find your site replaced by a parking page.

Typical causes include an expired card on the registrar account, renewal reminders going to a former employee's mailbox, or auto-renew being switched off.

How to Check

Use RDAP, the modern replacement for WHOIS, to see the expiry date and status:

curl -s https://rdap.verisign.com/com/v1/domain/example.com |
  jq -r '.events[] | select(.eventAction == "expiration") | .eventDate'
2027-08-13T04:00:00Z

That endpoint covers .com. For other TLDs, IANA publishes a bootstrap file of RDAP servers, or you can use the whois command and look for the expiry date.

How to Avoid It

  1. Turn on auto-renew for every domain you care about.
  2. Renew important domains for several years at a time.
  3. Use a shared mailbox or distribution list as the registrar contact, not a personal address.
  4. Keep a valid payment method on file and check it when cards are replaced.

Mistake 2: Changing Nameservers Without Copying Every Record

When you move DNS hosting, for example to a CDN or a new DNS provider, you change the nameservers at the registrar. From that moment, the new provider's zone is the only one that matters. Any record that wasn't recreated there simply stops existing.

The classic version of this mistake is copying the website records but forgetting the MX records, so email stops arriving. Others include losing TXT records for SPF, DKIM or domain verification, or missing a subdomain used by an API or a mobile app.

How to Check

Before switching, compare the old and new zones by querying each provider's nameservers directly:

#!/usr/bin/env bash
# Compare records between the current and new nameservers.
old="ns1.oldprovider.example"
new="ns1.newprovider.example"
names="example.com www.example.com api.example.com mail.example.com"
types="A AAAA CNAME MX TXT CAA"

for name in $names; do
  for type in $types; do
    a=$(dig @"$old" "$name" "$type" +short | sort)
    b=$(dig @"$new" "$name" "$type" +short | sort)
    if [ "$a" != "$b" ]; then
      echo "DIFF $name $type"
      echo "  old: ${a:-<none>}"
      echo "  new: ${b:-<none>}"
    fi
  done
done
DIFF example.com MX
  old: 10 mx1.mailprovider.example.
  new: <none>

Any line starting with DIFF needs attention before you change the nameservers.

How to Avoid It

Export the full zone from the old provider rather than relying on what the dashboard shows on screen. Many providers support a BIND-format export, and most new providers can import one. Then run a comparison like the one above for every name you know about.

Mistake 3: Leaving a Stale DNSSEC DS Record

If your domain uses DNSSEC, the registrar holds a DS record that matches a key at your DNS provider. If you move to a new provider while the old DS record is still in place, validating resolvers will reject every answer from the new provider's servers. Users of those resolvers, which includes most major public resolvers, get SERVFAIL and can't reach the site at all.

How to Check

dig @1.1.1.1 example.com A
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31337

Now ask the same resolver to skip validation:

dig @1.1.1.1 example.com A +cd +short
192.0.2.10

If the normal query fails but the +cd (checking disabled) query works, the DNSSEC chain is broken. Compare the DS record at the parent with the DNSKEY records your current provider publishes:

dig example.com DS +short
dig example.com DNSKEY +short

How to Avoid It

When changing DNS providers, remove the DS record at the registrar first, wait at least the DS record's TTL (often a day or two for many TLDs), then switch providers. Re-enable DNSSEC with the new provider and add the new DS record once everything is working.

Mistake 4: Making Changes With a Long TTL

TTL (time to live) controls how long resolvers cache a record. If your A record has a TTL of 86400 seconds (24 hours) and you point it at a new server, some visitors will keep going to the old server for up to a day. If you then switch off the old server, those visitors see an outage.

The same applies in reverse. If you make a mistake with a long TTL, the bad answer stays cached for just as long.

How to Avoid It

Check the current TTL a few days before a planned change:

dig www.example.com A +noall +answer
www.example.com.        86400   IN      A       198.51.100.20

Then follow this order:

  1. Lower it to something like 300 seconds, and wait for at least the old TTL to pass.
  2. Make the change, verify it, and keep the old server running until the old TTL has expired since the change.
  3. Raise the TTL again once you're confident.

Mistake 5: Typos in IP Addresses and Hostnames

A single wrong digit in an IP address points your site at someone else's server, or at nothing. A misspelt CNAME target sends lookups to a name that doesn't exist. These are easy to make when copying values by hand from documentation or a support ticket.

How to Check

Always verify a change against your authoritative nameserver and then test the actual service:

dig @ns1.example.net www.example.com A +norecurse +short
curl -sI --resolve www.example.com:443:192.0.2.10 https://www.example.com/ | head -n 1

The --resolve option tells curl to connect to a specific IP for that hostname, which lets you confirm the new server answers correctly for your domain, with a valid certificate, before or immediately after the DNS change.

How to Avoid It

Copy and paste values rather than typing them, and ask someone else to review changes to critical records. If you manage DNS as code, the review step happens naturally in a pull request.

Mistake 6: Missing the Trailing Dot in a Zone File

In BIND-style zone files, a name without a trailing dot is relative to the zone's origin. It's an easy mistake to make and produces names you didn't intend:

$ORIGIN example.com.
www     3600  IN  CNAME  example.cdn.example.net

Because the target lacks a final dot, the server appends the origin, so the CNAME actually points to example.cdn.example.net.example.com., which doesn't exist. The correct line is:

www     3600  IN  CNAME  example.cdn.example.net.

The same applies to MX and NS targets. You can spot this mistake quickly because the answer contains your own domain name twice:

dig www.example.com CNAME +short
example.cdn.example.net.example.com.

Run named-checkzone before reloading. It won't flag this as an error, because the result is technically valid, but its output with -D shows every name fully expanded, which makes the problem obvious:

named-checkzone -D example.com db.example.com | grep -i cname

Mistake 7: Forgetting to Increase the SOA Serial

If you run your own primary and secondary nameservers, secondaries only fetch an updated zone when the SOA serial increases. Edit the zone without changing the serial, and the primary serves the new data while the secondaries keep serving the old version. Visitors get different answers depending on which nameserver their resolver asks.

How to Check

Compare the serial on every nameserver:

for ns in $(dig example.com NS +short); do
  printf '%-22s' "$ns"
  dig @"$ns" example.com SOA +short | awk '{print $3}'
done
ns1.example.net.      2026101801
ns2.example.net.      2026101501

Mismatched serials mean the zones are out of sync. Most managed DNS providers handle serials for you, so this mainly affects self-hosted setups.

How to Avoid It

Use the YYYYMMDDnn convention and increase the serial with every change, or let your tooling manage it. BIND can do this automatically for dynamically updated zones, and most DNS-as-code tools handle it for you.

Mistake 8: Mismatched Nameservers at the Registrar

The nameservers listed at your registrar (the delegation in the parent zone) should match the NS records inside your zone, and every one of them should answer authoritatively for your domain. Common problems include:

  • A nameserver that was decommissioned but never removed from the registrar.
  • A typo in a nameserver hostname.
  • Nameservers from an old provider mixed with the new provider's.

When resolvers pick a broken nameserver, lookups slow down or fail. This is known as a lame delegation.

How to Check

dig example.com NS @a.gtld-servers.net +norecurse +noall +authority
dig example.com NS +short

The first command shows what the .com registry delegates to, and the second what your zone itself says. They should list the same servers. Then confirm each one answers with the aa (authoritative answer) flag:

dig @ns2.example.net example.com SOA +norecurse | grep flags
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

Mistake 9: Deleting Records You Didn't Recognise

During a tidy-up, it's tempting to delete records that look old or unexplained. Some of them are quietly important:

  • TXT records for SPF, DKIM, DMARC and domain verification. Removing a verification record can cause a service to unverify your domain.
  • CNAMEs for DKIM such as selector1._domainkey, which break email signing when deleted.
  • Records used by mobile apps or IoT devices, which may not appear in any web analytics.
  • CAA records, which control which certificate authorities can issue for your domain. Removing them is less dangerous, but changing them carelessly can block certificate renewal.

How to Avoid It

Before deleting a record, search your code, configuration and documentation for the name. Lower its TTL, then remove it and keep the value so you can restore it quickly. Better still, add a comment field or a record inventory that explains what each record is for.

Mistake 10: A Single Point of Failure

All your nameservers can be perfectly configured and still go offline together if they belong to a single provider that has an outage, or if they're all in one network. Large DNS provider outages have taken thousands of websites offline at once.

Options to reduce the risk include:

  • Choose a provider with an anycast network and a strong reliability record.
  • Use a secondary DNS provider that receives a copy of your zone by zone transfer or via an API sync, and list both providers' nameservers at the registrar.
  • If you self-host, put your nameservers in different networks and locations, not on the same server or subnet.

You can check how diverse your nameservers are:

for ns in $(dig example.com NS +short); do
  printf '%-22s %s\n' "$ns" "$(dig "$ns" A +short | head -n 1)"
done

If every nameserver resolves to addresses in the same small range, a single network problem can take them all down.

Mistake 11: Losing Access to the Registrar or DNS Account

If an attacker gets into your registrar or DNS provider account, they can change nameservers or records and take your site offline or redirect it. Equally, if the only person with the password leaves the company, a simple fix can turn into a long account recovery process.

How to Avoid It

  1. Enable two-factor authentication on registrar and DNS accounts.
  2. Turn on the registrar lock to prevent unauthorised transfers. For high-value domains, ask about a registry lock.
  3. Use a shared organisational account owner and give individuals their own logins with appropriate permissions.
  4. Keep recovery details current.

Habits That Prevent Most DNS Outages

Most of the mistakes above share the same causes: rushing, not checking, and not knowing what records exist. A few habits address all of them:

  1. Keep an up-to-date export of every zone, ideally in version control.
  2. Lower TTLs before planned changes, and raise them afterwards.
  3. Verify every change against the authoritative nameservers and then a public resolver.
  4. Review critical changes with a second person or through DNS as code.
  5. Monitor DNS from outside your network, so you hear about a broken record before customers do.

A simple external check you can run from cron is a good start:

#!/usr/bin/env bash
# Alert if a critical record changes or stops resolving.
name="www.example.com"
expected="192.0.2.10"
actual=$(dig @1.1.1.1 "$name" A +short | tail -n 1)

if [ "$actual" != "$expected" ]; then
  echo "DNS check failed for $name: expected $expected, got ${actual:-nothing}" |
    mail -s "DNS alert: $name" ops@example.com
fi

The tail -n 1 keeps only the final address, which matters if the name is a CNAME, because dig +short prints the alias target first.


FAQ: Common DNS Mistakes

Changes made without verification are the most common cause, especially nameserver changes that leave records behind and record edits with typos. Expired domains and stale DNSSEC records after a provider move are close behind.

You can correct the record immediately, but resolvers that cached the bad answer will keep it until its TTL expires. That's why low TTLs during planned changes make mistakes much cheaper to recover from.

Usually because the MX records, and often the SPF and DKIM records, weren't recreated at the new DNS provider. Once the nameservers change, only the new provider's zone is used, so missing records simply disappear.

Query a validating resolver such as 1.1.1.1 with dig. If the normal query returns SERVFAIL but the same query with +cd returns an answer, the DNSSEC chain is broken, often because of an outdated DS record at the registrar.

For business-critical domains, a secondary DNS provider removes a single point of failure. It adds some complexity, because both providers must serve identical zones, so use zone transfers or an automation tool to keep them in sync.

A trailing dot marks a name as fully qualified. Without it, the server appends the zone's origin, so a CNAME target such as host.example.net becomes host.example.net.example.com, which doesn't exist.


Conclusion

The DNS mistakes that take websites offline are rarely exotic. Expired domains, forgotten records during a provider move, stale DS records, long TTLs, typos and missing trailing dots account for most outages. Each one is easy to make under time pressure, and each one is easy to spot with a few dig commands if you look before and after every change.

Treat DNS changes with the same care as code deployments. Keep exports of your zones, lower TTLs before planned work, verify against authoritative servers, protect your registrar account, and monitor your most important records from outside your network. Those habits turn most DNS mistakes from outages into quick, harmless corrections.

Tags :
Share :

Related Posts

What is the difference between an A record and a CNAME record?

What is the difference between an A record and a CNAME record?

The difference between an A record and a CNAME record is what they point to. An A record points a hostname directly at an IPv4 address, such

Dive Deeper
What are the best DNS providers for websites?

What are the best DNS providers for websites?

The best DNS providers for most websites are Cloudflare for a fast, free, easy starting point, Amazon Route 53 if you already run on AWS, **G

Dive Deeper
What are the best public DNS resolvers?

What are the best public DNS resolvers?

The best public DNS resolvers for most people are Cloudflare (1.1.1.1) for speed and privacy, Google Public DNS (8.8.8.8) for reliability and

Dive Deeper