Back to blog
DNS & Network Protocols September 15, 2026

Authoritative Nameserver Resolution Failures: Glue Records and DNSSEC

SSumit Nath
Automate WhatsApp Alerts
Start Free ➔

When an end-user client or microservice queries a fully qualified domain name (FQDN), the recursive resolver embarks on an iterative journey down the hierarchical DNS tree. When that traversal halts abruptly at the boundary between parent and child zones, the failure is rarely subtle. To the application layer, the symptom is universally uninformative: a generic SERVFAIL (RCODE 2), an unexpected NXDOMAIN (RCODE 3), or an indefinite socket connection timeout.

Underneath those symptoms lie intricate protocol-level failure modes: missing or stale authoritative glue records causing circular dependency deadlocks, cryptographic validation breakdowns in the DNSSEC chain of trust, EDNS0 buffer truncation dropping TCP fallback on port 53, or anycast route poisoning.

This principal SRE guide deconstructs the authoritative DNS resolution failure model from first principles, isolating the mechanical boundaries between zone delegations, glue records, and DNSSEC cryptographic verification.


1. Authoritative DNS Resolution Failure Model

To debug authoritative resolution outages systematically, you must isolate the distinct responsibilities across the resolution chain:

+-------------------------------------------------------------------------+
|                           Application Runtime                           |
|             (e.g., cURL, Node.js fetch(), Go net.Resolver)              |
+------------------------------------+------------------------------------+
                                     | getaddrinfo() / POSIX stub query
                                     v
+-------------------------------------------------------------------------+
|                  Local Stub Resolver (systemd-resolved)                 |
+------------------------------------+------------------------------------+
                                     | Recursive Query (RD=1)
                                     v
+-------------------------------------------------------------------------+
|             Recursive Resolver (Unbound, BIND9, 8.8.8.8)                |
+---------+--------------------------+--------------------------+---------+
          |                          |                          |
          | 1. Query root (".")      | 2. Query TLD (".com")    | 3. Query Child NS
          v                          v                          v
+-------------------+      +-------------------+      +-------------------+
|    Root Server    |      |   TLD Nameserver  |      | Authoritative NS  |
|  (a.root-servers) |      | (a.gtld-servers)  |      | (ns1.example.com) |
+-------------------+      +-------------------+      +-------------------+

Resolution Tiers and Responsibilities

  1. Stub Resolver: The local library (libc getaddrinfo, systemd-resolved) residing on the client host. It does not perform iterative walking; it sets the Recursion Desired flag (RD=1) and offloads the iterative query to an upstream recursive caching resolver.
  2. Recursive Resolver: Performs iterative traversal (RD=0) starting at the root hints (.), descending to the Top-Level Domain (TLD) authoritative servers (e.g., .com, .io), and finally requesting the target resource record from the child zone's authoritative nameservers.
  3. Root & TLD Servers (Parent Zones): Authoritative for root and TLD namespaces. They do not hold records for api.example.com; they return referrals consisting of NS records and parent glue records in the Authority and Additional sections.
  4. Authoritative Nameserver (Child Zone): The authoritative origin holding the zone file for example.com, returning answers with the Authoritative Answer flag set (AA=1).

Failure Taxa and Operational Symptoms

Layer / Failure PointPrimary Protocol ManifestationApplication Layer Symptom
Parent Delegation MissingRoot/TLD returns NXDOMAIN or empty referralCould not resolve host
Missing / Stale GlueRecursive resolver cannot locate IP of in-bailiwick NSSERVFAIL or 5–15s query timeout
Authoritative NS UnreachableUDP query timeouts across all listed NS IPsi/o timeout, SERVFAIL
Firewall Blocking TCP/53Truncated responses (TC=1) fail during TCP fallbackIntermittent packet drops on large DNSSEC responses
DNSSEC Chain BrokenCryptographic validation fails; validating resolver yields SERVFAILEAI_FAIL / SERVFAIL (Non-validating resolvers succeed)
Zone MisconfigurationAuthoritative daemon responds with REFUSED or stale SOAConnection refused / stale endpoint routing

2. DNS Delegation and the Authoritative Resolution Chain

Delegation is the operational mechanism by which a parent zone assigns administrative and authoritative control of a sub-namespace to independent nameservers.

When example.com is registered under .com, the .com TLD registry publishes delegation records in the parent zone:

; In the .com TLD Zone File
example.com.        172800  IN  NS  ns1.example.net.
example.com.        172800  IN  NS  ns2.example.net.

Referral Mechanics: Authority vs. Additional Sections

When a recursive resolver queries a TLD server for api.example.com, the TLD server does not have the A record. It returns a Referral Response:

  • Header: AA=0 (Not Authoritative), RCODE=0 (NOERROR), ANCOUNT=0 (Answer count zero).
  • Authority Section (NSCOUNT > 0): Contains the delegated NS records pointing to the child zone nameservers.
  • Additional Section (ARCOUNT > 0): Contains address records (A / AAAA) known as glue records if the nameservers reside inside the zone being delegated.
                               Iterative Referral Walk
                               
   Client Query: "api.example.com A"
   
   [Recursive Resolver] ──( Query: api.example.com )──> [ Root Server "." ]
                        <──( Referral: NS a.gtld-servers.net + Glue )──
                        
   [Recursive Resolver] ──( Query: api.example.com )──> [ TLD Server ".com" ]
                        <──( Referral: NS ns1.example.net )────────────
                        
   [Recursive Resolver] ──( Resolve: ns1.example.net A )──> [ Net Authoritative ]
                        <──( Answer: ns1.example.net = 198.51.100.53 )──
                        
   [Recursive Resolver] ──( Query: api.example.com )──> [ 198.51.100.53 ]
                        <──( Answer: api.example.com = 203.0.113.10, AA=1 )──

If the delegated nameserver hostname itself requires resolution within the very zone being delegated, this referral mechanism hits a cyclic paradox unless glue records exist.


3. Glue Records: The Circular Dependency Problem

Consider a domain example.com whose authoritative nameservers are named ns1.example.com and ns2.example.com.

                           The Circular Dependency Loop
                           
                             Parent Zone (.com)
                                     │
                 "To resolve example.com, ask ns1.example.com"
                                     │
                                     ▼
                            Child (example.com)
                                     │
               "To ask ns1.example.com, resolve ns1.example.com"
                                     │
                                     ▼
                                  [ ??? ]  <── Deadlock: Cannot reach 
                                                        child to resolve 
                                                        its own address!

To resolve example.com, the recursive resolver must contact ns1.example.com. But to contact ns1.example.com, the resolver must resolve ns1.example.com, which is inside example.com.

The Solution: Parent-Zone Glue Records

A glue record is an A or AAAA address record for an in-bailiwick nameserver published directly in the parent zone alongside the delegation NS records:

; Parent Zone (.com) Delegation + Glue Records
example.com.            172800  IN  NS      ns1.example.com.
example.com.            172800  IN  NS      ns2.example.com.

; GLUE RECORDS (Provided in the Additional Section of Referral)
ns1.example.com.        172800  IN  A       192.0.2.10
ns1.example.com.        172800  IN  AAAA    2001:db8:53::10
ns2.example.com.        172800  IN  A       192.0.2.20
ns2.example.com.        172800  IN  AAAA    2001:db8:53::20

When the recursive resolver receives the referral from .com, it extracts the nameserver IP addresses from the Additional section, breaking the cycle without making an auxiliary lookup.

Stale Glue and Registry Synchronization Asymmetry

Glue records are managed at the Domain Registrar / Registry, whereas zone files are managed on the Authoritative Nameservers. This architectural boundary creates operational drift:

  1. An engineer updates the A record for ns1.example.com inside the authoritative zone file to 198.51.100.10.
  2. The engineer forgets to update the "Child Nameserver / Glue" registration in the domain registrar portal.
  3. The parent .com TLD continues serving stale glue pointing to 192.0.2.10.
  4. As recursive resolver caches expire, traffic routes to a dead or reallocated IP address, resulting in silent global downtime.

4. In-Bailiwick vs. Out-of-Bailiwick Nameservers

A nameserver is said to be in-bailiwick if its hostname falls under the exact domain namespace being delegated. Otherwise, it is out-of-bailiwick.

In-Bailiwick:     Zone = "pingzo.com"      NS = "ns1.pingzo.com"       (Glue Mandatory)
Out-of-Bailiwick: Zone = "pingzo.com"      NS = "ns1.cloudflare.com"   (Glue Forbidden/Ignored)

Architectural Comparison

PropertyIn-Bailiwick NameserverOut-of-Bailiwick Nameserver
Examplens1.example.com for example.comns1.p04.nsone.net for example.com
Parent Glue RequirementMandatory. Without glue, zone cannot resolve.None. Resolver performs standard recursive lookup on external NS.
Circular Dependency RiskHigh. Any glue drift halts resolution.Zero. External NS handles its own resolution.
IP Change CoordinationRequires synchronized update at Registrar AND Child Zone.Managed entirely by DNS provider. Zone admin changes nothing.
Resolver Bailiwick FilteringResolver accepts parent glue for in-domain NS only.Resolver drops out-of-bailiwick glue in Additional section to prevent cache poisoning.
Failure ModesStale glue, missing IPv6 glue, registrar sync lag.External provider outage, external TLD delegation breakdown.

Bailiwick Security Rules (RFC 2181 / RFC 7871)

Modern recursive resolvers (Unbound, BIND9, PowerDNS-Recursor) enforce strict bailiwick boundaries. If a rogue TLD or malicious server provides glue in the Additional section for an out-of-bailiwick name (e.g., .com attempting to provide an A record for google.com or ns1.external-bank.com), the recursive resolver silently discards that record. The resolver will always spawn a separate, authenticated resolution query for out-of-bailiwick nameservers to eliminate Kaminsky-style DNS cache poisoning vulnerabilities.


5. How a Recursive Resolver Processes a Referral

Let us trace the exact binary packet semantics when a validating resolver parses a referral.

+-------------------------------------------------------------------------+
|                        DNS Message Header (12 Bytes)                    |
|  ID: 0x4A12 | QR: 1 (Response) | Opcode: 0 | AA: 0 (Referral) | TC: 0   |
|  RD: 1      | RA: 0            | Z: 0      | AD: 0            | CD: 0   |
|  RCODE: 0 (NOERROR)            | QDCOUNT: 1 | ANCOUNT: 0                |
|  NSCOUNT: 2                    | ARCOUNT: 2                             |
+-------------------------------------------------------------------------+
| Question:  api.example.com.          IN  A                              |
+-------------------------------------------------------------------------+
| Authority: example.com.              172800  IN  NS  ns1.example.com.   |
|            example.com.              172800  IN  NS  ns2.example.com.   |
+-------------------------------------------------------------------------+
| Additional: ns1.example.com.         172800  IN  A   192.0.2.10         |
|             ns2.example.com.         172800  IN  A   192.0.2.20         |
+-------------------------------------------------------------------------+

Protocol Header Flags

  • QR (Query/Response): 1 indicates a response.
  • AA (Authoritative Answer): 0 on referrals (the TLD is delegating, not answering authoritatively for api.example.com).
  • TC (Truncation): 1 indicates UDP payload exceeded buffer size, instructing client to retry over TCP.
  • RD (Recursion Desired): Set by stub resolver (1), cleared by recursive resolver during iterative queries (0).
  • RA (Recursion Available): Set by recursive resolvers if recursion service is enabled.
  • AD (Authentic Data): Set by validating resolver if DNSSEC signatures verified successfully.
  • CD (Checking Disabled): Set by client to request unvalidated raw DNSSEC data.

Dissecting dig +trace Protocol Flow

Running dig +trace api.example.com provides a real-time trace of this iterative referral engine:

$ dig +trace +nodnssec api.example.com
.                       518400  IN      NS      a.root-servers.net.
...
;; Received 525 bytes from 127.0.0.53#53(127.0.0.53) in 1 ms

com.                    172800  IN      NS      a.gtld-servers.net.
...
;; Received 1173 bytes from 198.41.0.4#53(a.root-servers.net) in 14 ms

example.com.            172800  IN      NS      ns1.example.com.
example.com.            172800  IN      NS      ns2.example.com.
;; Received 650 bytes from 192.5.6.30#53(a.gtld-servers.net) in 22 ms

api.example.com.        300     IN      A       203.0.113.10
;; Received 64 bytes from 192.0.2.10#53(ns1.example.com) in 18 ms

Notice how Step 3 returns NS records pointing to ns1.example.com. The resolver utilizes the Additional section glue from a.gtld-servers.net to query 192.0.2.10 directly in Step 4.


6. UDP, TCP, EDNS0, and DNS Transport Failures

Standard DNS queries operate over UDP port 53 with an original RFC 1035 packet limit of 512 bytes.

EDNS0 Buffer Sizing (RFC 6891)

To accommodate larger responses without immediately falling back to TCP, Extension Mechanisms for DNS (EDNS0) introduces the pseudo-RR OPT, allowing resolvers to advertise a larger UDP buffer size (typically 1232 bytes, adhering to the DNS Flag Day 2020 recommendation to prevent IP fragmentation).

                     EDNS0 / TCP Fallback Decision Tree
                     
                         DNS Query (UDP / Port 53)
                                    │
                                    ▼
                     Response Size > EDNS Buffer?
                                   / \
                            YES   /   \   NO
                                 /     \
                                ▼       ▼
                     Return TC=1 Flag  Send UDP Payload (Success)
                                │
                                ▼
                     Client initiates TCP/53
                      (SYN -> SYN-ACK -> ACK)
                                │
                                ▼
                     Query over TCP Stream
                                │
                                ▼
                     Success / Complete Answer

Path MTU and Truncation (TC=1) Dropouts

When DNSSEC is enabled, cryptographic keys (DNSKEY) and signatures (RRSIG) expand response sizes significantly (often 1500–3000 bytes).

If:

  1. The response exceeds 1232 bytes, the nameserver truncates the response and sets the TC=1 bit.
  2. The client or recursive resolver initiates a TCP handshake on port 53.
  3. An upstream firewall or security group blocks TCP/53 (mistakenly assuming DNS is UDP-only).
  4. The TCP handshake hangs, resulting in immediate application timeouts or SERVFAIL.

Diagnostic Commands for Transport Verification

# 1. Test standard UDP query with EDNS buffer 1232
dig @ns1.example.com example.com DNSKEY +dnssec +bufsize=1232

# 2. Force TCP transport to verify firewall state on port 53
dig +tcp @ns1.example.com example.com DNSKEY +dnssec

# 3. Simulate small MTU truncation response
dig @ns1.example.com example.com DNSKEY +bufsize=512 +ignore

7. DNSSEC Validation Failures

DNSSEC provides cryptographic authentication and data integrity to the DNS hierarchy. It does not provide encryption or privacy; it ensures that DNS responses cannot be forged or altered in flight.

The Cryptographic Chain of Trust

   Root Zone (".")
   [ Root KSK / ZSK ]  ── Signs ──> [ .com DS Record ]
                                             │
                                     Trust Delegated
                                             │
                                             ▼
   TLD Zone (".com")
   [ .com KSK / ZSK ]   ── Signs ──> [ example.com DS Record ]
                                             │
                                     Trust Delegated
                                             │
                                             ▼
   Child Zone ("example.com")
   [ DS (Key Tag 2371) ] ── Hashes ──> [ KSK (DNSKEY) ]
                                             │
                                           Signs
                                             │
                                             ▼
                                       [ ZSK (DNSKEY) ]
                                             │
                                           Signs
                                             │
                                             ▼
                                    [ RRSIG of A Record ]
                                             │
                                           Signs
                                             │
                                             ▼
                                    [ api.example.com A ]

Key Record Types Explained

  • DNSKEY: Holds the public signing keys. Typically split into:
    • Key Signing Key (KSK): Signs the DNSKEY RRset (establishes parent-child link).
    • Zone Signing Key (ZSK): Signs all other operational RRsets (A, AAAA, MX, TXT).
  • DS (Delegation Signer): Published in the parent zone (.com). It contains a cryptographic digest (SHA-256) of the child zone's KSK.
  • RRSIG (Resource Record Signature): Digital signature covering a specific RRset, containing Inception and Expiration UNIX timestamps.
  • NSEC / NSEC3: Authenticated denial of existence records proving that a name or record type does not exist without allowing zone-walking.

Why DNSSEC Failures Manifest as Generic SERVFAIL

When a recursive resolver (like Google 8.8.8.8, Cloudflare 1.1.1.1, or enterprise resolvers with dnssec-validation auto;) processes a query:

  1. It retrieves the child zone's DS record from the parent.
  2. It fetches the DNSKEY from the child and computes its digest. If the digest fails to match the parent DS, validation fails.
  3. It fetches the RRSIG for the target A record and verifies the cryptographic signature. If the signature is expired (now > Expiration) or invalid, validation fails.
  4. When validation fails, the resolver must not return the unverified data. It returns RCODE=2 (SERVFAIL) with no answers.

To verify whether a failure is DNSSEC-specific, bypass validation with the Checking Disabled (+cd) flag:

# Validating resolver returns SERVFAIL:
$ dig @8.8.8.8 api.example.com A
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31245

# Query again with Checking Disabled (+cd):
$ dig @8.8.8.8 api.example.com A +cd
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45129
;; ANSWER SECTION:
api.example.com.    300 IN  A   203.0.113.10

Root Cause Diagnostic: If dig fails with SERVFAIL but succeeds with +cd, the authoritative infrastructure is healthy, but the DNSSEC chain of trust is broken.


8. Glue Records vs. DNSSEC: Separate Failure Domains

A critical source of engineering confusion during major outages is conflating glue records with DNSSEC records. They inhabit completely separate failure domains:

+------------------------------------+------------------------------------+
|         Glue Record Domain         |        DNSSEC Trust Domain         |
+------------------------------------+------------------------------------+
| * Layer: Infrastructure Routing    | * Layer: Cryptographic Integrity   |
| * Data: A / AAAA address of NS     | * Data: DS hashes, DNSKEY, RRSIG   |
| * Placement: Parent TLD Additional | * Placement: Parent TLD (DS) and   |
| * Signed: NOT signed by DNSSEC     |   Child Zone (DNSKEY, RRSIG)       |
| * Failure: Connection Timeout      | * Signed: Cryptographically signed |
|   or unreachable nameserver        | * Failure: Immediate SERVFAIL      |
+------------------------------------+------------------------------------+

Independent Failure Combinations

Scenario A: Broken Glue + Valid DNSSEC
┌───────────────────────────┐
│ Parent NS: ns1.example.com│ ──> Glue IP is wrong/dead (192.0.2.10 unreachable)
│ Parent DS: Valid hash     │ ──> Resolver cannot reach nameserver to fetch keys
└───────────────────────────┘
Result: TIMEOUT / SERVFAIL (Transport Deadlock)

Scenario B: Perfect Glue + Broken DNSSEC
┌───────────────────────────┐
│ Parent NS: ns1.example.com│ ──> Glue IP reachable (198.51.100.10 responds AA=1)
│ Parent DS: Stale Key Tag  │ ──> Child rotated KSK without updating Registrar DS
└───────────────────────────┘
Result: Immediate SERVFAIL on all validating resolvers (8.8.8.8, 1.1.1.1)

Scenario C: Broken Glue + Broken DNSSEC
┌───────────────────────────┐
│ Drift at Registrar        │ ──> Old nameserver IPs + Old DS record
└───────────────────────────┘
Result: Multi-signal disaster; non-validating resolvers timeout; validating fail instantly.

9. Failure Taxonomy and Expected Resolver Behavior

The following matrix maps root cause failures to precise protocol indicators:

Root Cause FailureResolver RCODEHeader FlagsPrimary Protocol SignalRemediation Action
Missing In-Bailiwick GlueSERVFAIL / TimeoutAA=0TLD returns NS without A/AAAA in Additional sectionAdd glue records via Domain Registrar portal
Stale Glue IPConnection TimeoutNoneQueries route to inactive / unrouted hostUpdate nameserver IP at Registrar to match child A
Out-of-Bailiwick NS DeadSERVFAILAA=0External nameserver resolution failsFix DNS hosting provider infrastructure
TCP/53 Blocked by FirewallSERVFAILTC=1Truncated UDP received, subsequent TCP SYN droppedOpen TCP/53 inbound on edge security groups
DS Key-Tag MismatchSERVFAILAD=0Child DNSKEY hash does not match Parent DSSync DS record at Registrar with current KSK
Expired RRSIGSERVFAILAD=0RRSIG expiration timestamp < Current UTCRe-sign zone with authoritative DNS signer
Authoritative Daemon DownSERVFAIL / TimeoutNoneECONNREFUSED or zero response on UDP/53Restart named / bind9 / nsd service
Lame DelegationSERVFAIL / REFUSEDAA=0Nameserver responds with REFUSED or non-authConfigure child zone on target nameserver

10. SRE Diagnostic Workflow: The 14-Step Runbook

When an authoritative resolution incident occurs, execute this structured runbook:

                                SRE Diagnostic Flowchart
                                
                             [ Inbound Alert / Incident ]
                                           │
                                           ▼
                             [ Step 1: Multi-Resolver Test ]
                                  (8.8.8.8 vs 1.1.1.1)
                                           │
                                           ├──────────────────────────┐
                                           ▼                          ▼
                                   Response: TIMEOUT          Response: SERVFAIL
                                           │                          │
                                           ▼                          ▼
                            [ Step 3: dig +trace check ]    [ Step 9: Test with +cd ]
                                           │                          │
                                           ├──────────────┐           ├──────────────┐
                                           ▼              ▼           ▼              ▼
                                     Stale Glue?    TCP Block?   +cd Works?     +cd Fails?
                                     (Inspect Addl) (Test +tcp)  (DNSSEC Broken) (Lame Del)
  1. Reproduce Across Resolvers: Query public validating resolvers (Google 8.8.8.8, Cloudflare 1.1.1.1, Quad9 9.9.9.9) and non-validating local resolvers.
  2. Classify the Protocol RCODE: Identify if the response is SERVFAIL, REFUSED, NXDOMAIN, or a network timeout.
  3. Trace Delegation: Execute dig +trace +all <domain> to capture the referral tree from root to leaf.
  4. Inspect Parent Delegation & Glue: Query TLD servers directly for the domain's NS and DS records.
  5. Compare Parent Glue vs. Authoritative Records: Verify that parent glue A/AAAA matches the child zone's authoritative A/AAAA for each nameserver.
  6. Query Every Authoritative Nameserver Independently: Query every listed NS directly with +norecurse to identify split-brain or lame nodes.
  7. Test UDP/53 and TCP/53 Transport: Verify that both transport protocols accept queries and return valid answers on port 53.
  8. Verify EDNS0 Buffer Handling: Query with +bufsize=1232 and verify that packets are not silently dropped by intermediate stateful firewalls.
  9. Validate DNSSEC Cryptographic Chain: Validate the DS -> DNSKEY -> RRSIG hash matches and signatures are within their valid UTC windows.
  10. Isolate with Checking Disabled (+cd): Confirm whether bypassing DNSSEC validation yields a functional NOERROR response.
  11. Examine SOA Serial Convergence: Query the SOA record across all authoritative IPs to verify replication synchronization.
  12. Perform Wire-Level Packet Inspection: Use tcpdump on the nameserver to observe incoming queries, truncation flags, and TCP resets.
  13. Correlate with Change History: Check registrar portals, DNS provider APIs, CI/CD deployment pipelines, and BGP anycast route updates.
  14. Confirm Multi-Regional Cache Purge: Verify resolution across multiple autonomous systems (ASNs) before resolving the incident.

11. Production DNS Diagnostic Toolkit

Save this production-grade triage script as /usr/local/bin/dns-triage to automate diagnostic extraction during incidents:

#!/usr/bin/env bash
# ==============================================================================
# SRE Production DNS & DNSSEC Triage Engine
# Usage: ./dns-triage example.com
# ==============================================================================
set -euo pipefail

DOMAIN="${1:-}"
if [[ -z "$DOMAIN" ]]; then
    echo "Usage: $0 <domain.com>"
    exit 1
fi

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

echo -e "${BLUE}=================================================================${NC}"
echo -e "${BLUE} STARTING DNS & AUTHORITATIVE TRIAGE FOR: ${DOMAIN}${NC}"
echo -e "${BLUE}=================================================================${NC}"

# 1. Check Public Resolvers
echo -e "\n${YELLOW}[1] Querying Public Resolvers (Google, Cloudflare, Quad9)...${NC}"
for resolver in "8.8.8.8" "1.1.1.1" "9.9.9.9"; do
    ans=$(dig +short +time=2 +tries=1 "@${resolver}" "${DOMAIN}" A 2>/dev/null || echo "TIMEOUT")
    rcode=$(dig +noall +comments +time=2 +tries=1 "@${resolver}" "${DOMAIN}" A | grep "status:" | awk '{print $6}' | tr -d ',')
    echo -e " Resolver ${resolver}: RCODE=${rcode:-UNKNOWN} | Answer=${ans:-NONE}"
done

# 2. Extract Parent TLD Nameserver
echo -e "\n${YELLOW}[2] Extracting Parent TLD Delegation & Glue...${NC}"
TLD=$(echo "${DOMAIN}" | awk -F. '{print $NF}')
TLD_NS=$(dig +short NS "${TLD}." | head -n 1)

if [[ -n "$TLD_NS" ]]; then
    echo -e " Querying TLD Server: ${TLD_NS}"
    echo -e " ${BLUE}--- Authority Section (Parent NS) ---${NC}"
    dig "@${TLD_NS}" "${DOMAIN}" +noall +authority
    echo -e " ${BLUE}--- Additional Section (Parent Glue) ---${NC}"
    dig "@${TLD_NS}" "${DOMAIN}" +noall +additional
fi

# 3. Test Each Authoritative Nameserver Directly
echo -e "\n${YELLOW}[3] Direct Authoritative Nameserver Health & Transport Checks...${NC}"
NS_LIST=$(dig +short NS "${DOMAIN}" || true)

if [[ -z "$NS_LIST" ]]; then
    echo -e "${RED}[!] CRITICAL: No NS records returned for ${DOMAIN}${NC}"
else
    for ns in $NS_LIST; do
        echo -e "\n ---> Testing NS: ${ns}"
        
        # Resolve NS IPs
        ns_ipv4=$(dig +short "${ns}" A | head -n 1)
        ns_ipv6=$(dig +short "${ns}" AAAA | head -n 1)
        
        echo -e "      IPv4: ${ns_ipv4:-NONE} | IPv6: ${ns_ipv6:-NONE}"
        
        if [[ -n "$ns_ipv4" ]]; then
            # Direct UDP Query (+norecurse)
            udp_rcode=$(dig +noall +comments +norecurse +time=2 "@${ns_ipv4}" "${DOMAIN}" SOA | grep "status:" | awk '{print $6}' | tr -d ',')
            # Direct TCP Query
            tcp_rcode=$(dig +noall +comments +tcp +time=2 "@${ns_ipv4}" "${DOMAIN}" SOA | grep "status:" | awk '{print $6}' | tr -d ',')
            # SOA Serial
            serial=$(dig +short "@${ns_ipv4}" "${DOMAIN}" SOA | awk '{print $3}')
            
            echo -e "      UDP/53 Status: ${udp_rcode:-FAIL} | TCP/53 Status: ${tcp_rcode:-FAIL} | SOA Serial: ${serial:-NONE}"
        fi
    done
fi

# 4. DNSSEC Validation Verification
echo -e "\n${YELLOW}[4] DNSSEC Cryptographic Chain Check...${NC}"
DS_RECORD=$(dig +short DS "${DOMAIN}")
DNSKEY_RECORD=$(dig +short DNSKEY "${DOMAIN}")

if [[ -z "$DS_RECORD" ]]; then
    echo -e " ${BLUE}[i] Domain has NO DS record at parent (DNSSEC Insecure/Disabled).${NC}"
else
    echo -e " ${GREEN}[+] Parent DS Record Present:${NC} ${DS_RECORD}"
    if [[ -z "$DNSKEY_RECORD" ]]; then
        echo -e " ${RED}[!] CRITICAL ERROR: Parent has DS, but Child has NO DNSKEY records!${NC}"
    else
        echo -e " ${GREEN}[+] Child DNSKEY Records Present.${NC}"
        # Validate using delv if installed
        if command -v delv &>/dev/null; then
            echo -e " Running delv validation engine:"
            delv "@8.8.8.8" "${DOMAIN}" A || echo -e " ${RED}[!] delv validation failed.${NC}"
        fi
    fi
fi

echo -e "\n${BLUE}=================================================================${NC}"
echo -e "${BLUE} TRIAGE COMPLETE${NC}"
echo -e "${BLUE}=================================================================${NC}"

12. Direct Authoritative Server Testing

When troubleshooting authoritative resolution, querying caching recursive resolvers hides critical authoritative signals. Always query the authoritative nameservers directly using +norecurse.

# Query authoritative IP directly with recursion disabled
dig @198.51.100.10 api.example.com A +norecurse +comments

Analyzing the Response Flags

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58214
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 1
  • aa (Authoritative Answer): Confirms the nameserver generated this answer directly from its local authoritative zone file, not from cache.
  • If status: REFUSED: The server is running, but it has not loaded the zone file for example.com (Lame Delegation).
  • If status: SERVFAIL: The authoritative daemon failed to load its cryptographic keys or zone catalog.

Detecting Split-Brain & Serial Drift

In a redundant DNS architecture, all authoritative nameservers must serve the exact same zone serial:

for ns in $(dig +short NS example.com); do
    ip=$(dig +short "$ns" | head -n1)
    echo "Nameserver: $ns ($ip)"
    dig +short @"$ip" example.com SOA +norecurse
done
Nameserver: ns1.example.com (198.51.100.10)
ns1.example.com. hostmaster.example.com. 2026091501 7200 3600 1209600 300
Nameserver: ns2.example.com (198.51.100.20)
ns2.example.com. hostmaster.example.com. 2026091001 7200 3600 1209600 300  <-- STALE SERIAL!

Outage Trigger: ns2.example.com has fallen behind on replication (Serial 2026091001 vs 2026091501), causing 50% of client traffic to receive obsolete records.


13. Glue Drift and Nameserver Migration Failures

Migrating authoritative DNS from one IP block to another while using in-bailiwick nameservers is one of the highest-risk operations in network engineering.

                               Safe Nameserver IP Migration State Machine
                               
  +---------------------------------------------------------------------------------------+
  | Phase 1: Dual-Homed Publishing                                                        |
  | * Authoritative zone file publishes BOTH Old and New A/AAAA records for ns1           |
  | * Both old (192.0.2.10) and new (198.51.100.10) servers run active DNS daemons       |
  +-------------------------------------------+-------------------------------------------+
                                              |
                                              v
  +---------------------------------------------------------------------------------------+
  | Phase 2: Update Parent Registrar Glue                                                 |
  | * Update Registrar Child Host records to point to New IP (198.51.100.10)               |
  | * Parent TLD publishes new glue in Additional sections                                |
  +-------------------------------------------+-------------------------------------------+
                                              |
                                              v
  +---------------------------------------------------------------------------------------+
  | Phase 3: Wait for Parent TLD TTL Expiration (48 Hours)                                |
  | * Recursive resolvers globally purge cached parent glue                               |
  | * Traffic gradually shifts 100% to 198.51.100.10                                      |
  +-------------------------------------------+-------------------------------------------+
                                              |
                                              v
  +---------------------------------------------------------------------------------------+
  | Phase 4: Decommission Legacy Nameserver                                               |
  | * Remove Old A record from child zone file                                            |
  | * Shut down daemon on 192.0.2.10                                                      |
  +---------------------------------------------------------------------------------------+

Common Migration Failure Scenarios

  1. Premature Decommissioning: Decommissioning the old IP (192.0.2.10) immediately after updating the registrar. Because TLD NS and glue records commonly have TTLs of 172800 seconds (48 hours), cached resolvers worldwide continue sending queries to the decommissioned IP for up to two full days.
  2. Asymmetric IPv6 Failure: Updating the A record glue to IPv4 while leaving a stale AAAA glue record pointing to an unreachable IPv6 address. Dual-stack resolvers attempting IPv6-first resolution experience 2–5 second connection delays per lookup before falling back to IPv4.

14. DNSSEC Key Rotation and Rollover Failure Modes

Key rollovers require synchronized coordination between the Zone Signing Key (ZSK), Key Signing Key (KSK), and parent Delegation Signer (DS) records.

+-------------------------------------------------------------------------+
|                  RFC 6781 KSK Rollover State Machine                    |
+-------------------------------------------------------------------------+
|  1. [Initial State]       Parent DS: Hash(KSK-1) | Child DNSKEY: KSK-1  |
|  2. [Publish New KSK]     Child publishes KSK-2 alongside KSK-1         |
|  3. [Wait TTL]            Wait for DNSKEY TTL to propagate globally     |
|  4. [Submit Parent DS]    Update Registrar: DS = Hash(KSK-2)            |
|  5. [Wait Parent TTL]     Wait for TLD DS TTL (typically 24–48 hours)   |
|  6. [Retire Old KSK]      Remove KSK-1 from Child DNSKEY RRset          |
+-------------------------------------------------------------------------+

Lethal Rollover Mistakes

  • Removing Old KSK Before Parent DS Updates: If KSK-1 is deleted from the zone while the parent .com TLD still publishes DS=Hash(KSK-1), every validating resolver on earth will immediately reject the entire zone with SERVFAIL.
  • Automated CDS/CDNSKEY Desynchronization (RFC 7344): When using automated parent updates via CDS (Child DS) records, ensure the authoritative software does not publish CDS 0 (delete signal) accidentally, which strips DNSSEC protection globally.

15. Resolver Cache and Negative Caching Effects (RFC 2308)

When an authoritative error occurs, fixing the server configuration does not restore service immediately due to negative caching.

Negative Caching Mathematics

According to RFC 2308, when an authoritative nameserver returns NXDOMAIN or an empty answer (NODATA), recursive resolvers cache this negative response based on the minimum of:

  1. The TTL of the matched SOA record.
  2. The MINIMUM field (last integer) of the authoritative SOA record.
; SOA Record Structure
example.com.  3600  IN  SOA  ns1.example.com. hostmaster.example.com. (
                             2026091501 ; Serial
                             7200       ; Refresh
                             3600       ; Retry
                             1209600    ; Expire
                             300        ; Negative Caching TTL (5 minutes)
                             )

If your SOA negative TTL is set to 86400 (24 hours), a transient typo in a record deployment will cause recursive resolvers to cache the NXDOMAIN negative answer for 24 hours, even if you correct the record within 10 seconds.

SRE Best Practice: Set the SOA negative caching minimum TTL to 300 seconds (5 minutes) on production zones to ensure rapid recovery from accidental record deletions.


16. Monitoring and SLO Design for Authoritative DNS

To maintain four-nines ($99.99%$) availability on authoritative nameservers, your observability pipeline must monitor synthetic resolution success from multiple geographically distributed vantage points.

Formal DNS Availability Metric

$$ \text{DNS Availability} = \left( \frac{\sum \text{Successful Resolution Probes}}{\sum \text{Total Resolution Probes}} \right) \times 100 $$

SRE SLO Threshold Matrix

Signal / IndicatorTarget SLO (Healthy)Warning ThresholdCritical Incident
Authoritative Direct Availability$\ge 99.99%$$< 99.95%$$< 99.90%$
Recursive Resolution Success$\ge 99.95%$$< 99.90%$$< 99.50%$
p95 Authoritative Latency$< 35\text{ ms}$$35 - 75\text{ ms}$$> 75\text{ ms}$
DNSSEC Cryptographic Failures$0$ errors$1$ isolated validation dropSustained $\ge 0.01%$
TCP/53 Handshake Success$100%$$< 99.90%$$< 99.00%$
SOA Serial Convergence Lag$0\text{ sec}$$> 300\text{ sec}$$> 1800\text{ sec}$

Prometheus Alerting Rules for DNS Infrastructure

groups:
  - name: authoritative_dns_alerts
    rules:
      - alert: AuthoritativeNameserverDown
        expr: probe_success{job="dns_authoritative_probe"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Authoritative nameserver {{ $labels.instance }} unreachable"
          description: "Authoritative DNS probe over UDP/TCP port 53 failed for > 1 minute."

      - alert: DNSSECValidationFailureRate
        expr: rate(dns_resolver_dnssec_errors_total[5m]) > 0.001
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "High DNSSEC SERVFAIL rate detected"
          description: "Validating probes are encountering cryptographic verification failures on {{ $labels.domain }}."

      - alert: NameserverSOASerialMismatch
        expr: count by (domain) (count_values by (domain) ("serial", dns_soa_serial)) > 1
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "Zone SOA serial drift detected"
          description: "Authoritative nameservers for {{ $labels.domain }} are serving divergent SOA serials for > 10 minutes."

17. Packet Capture and Wire-Level Analysis

When DNS CLI tools yield conflicting results, inspect the raw wire protocol using tcpdump.

# Capture all DNS traffic on UDP and TCP port 53 with full packet payload
sudo tcpdump -nnvv -s0 -i any 'port 53' -w /tmp/dns_troubleshoot.pcap

Decoding Wire Behaviors in Real-Time

sudo tcpdump -n -i eth0 'port 53'
12:04:10.104218 IP 198.51.100.5.54123 > 192.0.2.10.53: 41205+ [1au] A? api.example.com. (54)
12:04:10.104612 IP 192.0.2.10.53 > 198.51.100.5.54123: 41205| 0/2/3 (612)

Tracing Truncation and TCP Fallback

Client (198.51.100.5)                   Nameserver (192.0.2.10)
      │                                            │
      │── UDP Query (DNSKEY example.com) ─────────>│
      │<─ UDP Response (TC=1, Truncated) ──────────│  (Packet exceeds EDNS size)
      │                                            │
      │── TCP SYN ────────────────────────────────>│  (Port 53)
      │<─ TCP SYN-ACK ─────────────────────────────│
      │── TCP ACK ────────────────────────────────>│
      │── TCP Query (DNSKEY example.com) ─────────>│
      │<─ TCP Response (Full 2400 Byte Payload) ───│

If tcpdump shows the incoming TCP SYN packet without a matching TCP SYN-ACK from the nameserver, an iptables / nftables or cloud security group rule is silently dropping TCP port 53.


18. Anycast and Network Path Failures

Enterprise authoritative DNS networks (such as Route 53, Cloudflare, NS1, and Akamai) utilize BGP Anycast, where the same IP address (e.g., 198.51.100.10) is announced from hundreds of PoPs globally.

                      BGP Anycast Routing Architecture
                      
                             [ 198.51.100.10 ]
                            (Anycast IP Address)
                                     │
           ┌─────────────────────────┼─────────────────────────┐
           ▼                         ▼                         ▼
   [ US-East PoP ]            [ EU-West PoP ]           [ AP-South PoP ]
    BGP AS 64496               BGP AS 64496              BGP AS 64496

Anycast Failure Modes

  1. TCP Connection Resets via BGP Flapping: UDP queries succeed because every packet can be routed independently to whichever PoP is nearest at that microsecond. However, during a multi-packet TCP fallback exchange, a BGP route flap can steer the TCP ACK or data packet to a different PoP, which has no state for the TCP socket, emitting a TCP RST.
  2. MTU Black Holes on Anycast Routes: If an anycast PoP has an MTU of 1420 bytes (e.g., inside an encapsulated tunnel) while the client uses MTU 1500, large UDP DNS responses will be dropped if Path MTU Discovery (PMTUD) ICMP Type 3 Code 4 packets are filtered.

19. Production Incident Case Studies

Incident A: Stale Glue After Provider Migration

  • Scenario: A SaaS enterprise migrated authoritative DNS from Route 53 to Cloudflare. The engineers updated nameserver records inside the Cloudflare dashboard and changed NS records at the registrar, but forgot to delete old custom child host glue records (ns1.saas-app.com).
  • Symptom: Resolvers in North America resolved successfully (using cached Cloudflare NS), while resolvers in Asia and Europe returned intermittent SERVFAIL.
  • Root Cause: Asian TLD mirrors still had cached in-bailiwick glue pointing to decommissioned AWS IPs.
  • Resolution: Deleted legacy child nameserver glue records via the domain registrar registry console; purged registrar TLD state.

Incident B: DS / DNSKEY Mismatch Outage

  • Scenario: A continuous delivery pipeline refreshed DNSSEC keys. The script published new DNSKEY records on the authoritative server and immediately submitted a new DS record to the registrar.
  • Symptom: Global traffic collapsed within 15 minutes. All Google (8.8.8.8) and Cloudflare (1.1.1.1) users received immediate SERVFAIL.
  • Root Cause: The old DNSKEY had a TTL of 86400s (24 hours). Resolvers with the old DNSKEY cached attempted to validate it against the newly published parent DS digest. The hash failed.
  • Resolution: Re-published the old DNSKEY alongside the new one, signed with both keys, and waited for TTL convergence before retiring the legacy key.

Incident C: Silent TCP/53 Firewall Drop

  • Scenario: Security team hardened edge firewalls, closing "unused" TCP ports and leaving only UDP 53 open.
  • Symptom: Standard A records resolved normally. However, whenever engineers added large TXT records (for SPF, DKIM, and verification tokens), clients failed intermittently.
  • Root Cause: Zone response exceeded 1232 bytes, triggering TC=1. The subsequent TCP retry was dropped by the firewall.
  • Resolution: Opened inbound TCP/53 across all security groups and load balancers.

Incident D: Orphaned IPv6 Glue

  • Scenario: An infrastructure team renumbered their data center IPv6 subnets.
  • Symptom: CI/CD runners on GitHub Actions (pure IPv6 capable) failed to resolve the internal domain, while IPv4 office laptops worked seamlessly.
  • Root Cause: Parent glue contained an obsolete AAAA record pointing to dead IPv6 space. Dual-stack recursive resolvers prioritized IPv6 and timed out.
  • Resolution: Updated registrar AAAA glue records to the new IPv6 prefix.

20. Automation and Continuous DNS Validation

Integrate automated DNS assertions into your CI/CD pipelines to prevent misconfigurations from reaching production:

#!/usr/bin/env python3
"""
Continuous DNS Validation Assertion Engine
Requires: dnspython (pip install dnspython)
"""
import sys
import dns.resolver
import dns.query
import dns.message
import dns.rdatatype

DOMAIN = sys.argv[1] if len(sys.argv) > 1 else "example.com"

def test_authoritative_consistency(domain):
    print(f"[*] Validating authoritative infrastructure for: {domain}")
    
    # 1. Resolve NS records
    answers = dns.resolver.resolve(domain, 'NS')
    ns_hosts = [r.target.to_text() for r in answers]
    
    serials = {}
    for ns in ns_hosts:
        # Get NS IP
        ns_ip = dns.resolver.resolve(ns, 'A')[0].to_text()
        
        # Build SOA query
        query = dns.message.make_query(domain, dns.rdatatype.SOA)
        query.flags &= ~dns.flags.RD # +norecurse
        
        # Query UDP
        try:
            response = dns.query.udp(query, ns_ip, timeout=2.0)
            soa_rr = [rr for rr in response.answer if rr.rdtype == dns.rdatatype.SOA]
            if soa_rr:
                serials[ns] = soa_rr[0][0].serial
        except Exception as e:
            print(f"[-] FAILED UDP to {ns} ({ns_ip}): {e}")
            sys.exit(1)
            
        # Query TCP
        try:
            tcp_response = dns.query.tcp(query, ns_ip, timeout=2.0)
            if not tcp_response:
                raise Exception("Empty TCP response")
        except Exception as e:
            print(f"[-] FAILED TCP/53 to {ns} ({ns_ip}): {e}")
            sys.exit(1)

    print(f"[+] SOA Serials across nodes: {serials}")
    if len(set(serials.values())) > 1:
        print("[-] ERROR: Serial mismatch detected across authoritative nameservers!")
        sys.exit(1)
        
    print("[+] All authoritative nodes consistent and reachable over UDP & TCP.")

if __name__ == "__main__":
    test_authoritative_consistency(DOMAIN)

21. DNS Change Management Runbook

Follow this strict change control sequence for all authoritative DNS modifications:

+-------------------------------------------------------------------------+
|                  DNS Change Control Verification Stages                 |
+-------------------------------------------------------------------------+
|  Stage 1: Pre-Change Audit                                              |
|  * Query current SOA serial across all nodes.                           |
|  * Validate current DNSSEC signature expiration windows.                |
|  * Reduce zone TTL to 300s 48 hours prior to high-risk migrations.      |
|                                                                         |
|  Stage 2: Execution & Synchronous Push                                  |
|  * Deploy zone changes to Primary nameserver.                           |
|  * Verify NOTIFY signals propagate to Secondary nameservers.            |
|  * Validate SOA serial convergence across all authoritative nodes.      |
|                                                                         |
|  Stage 3: Registrar & Delegation Verification                           |
|  * If updating glue: Update Registrar Child Host IPs.                  |
|  * If updating DNSSEC: Publish new DS only after DNSKEY has propagated. |
|                                                                         |
|  Stage 4: Post-Change Health Check                                      |
|  * Query authoritative servers directly via UDP & TCP (+norecurse).     |
|  * Validate DNSSEC resolution via validating public resolvers (8.8.8.8).|
|  * Restore standard zone TTLs once stability is verified.               |
+-------------------------------------------------------------------------+

22. Practical SRE Checklist

Before closing any DNS incident or deploying nameserver architecture changes, verify every checkbox:

  • Parent Delegation: Parent TLD NS records match intended nameservers exactly.
  • Glue A Records: In-bailiwick nameservers have valid, active IPv4 glue published at the registrar.
  • Glue AAAA Records: In-bailiwick nameservers have reachable IPv6 glue (or no AAAA glue if IPv6 is unsupported).
  • All Authoritative IPs Reachable: Every IP returned by parent glue answers UDP/53 queries.
  • Authoritative Bit Set: Direct queries return AA=1 and NOERROR status.
  • TCP/53 Functional: Direct queries over TCP/53 succeed with zero dropped packets.
  • EDNS0 Truncation Handled: Responses exceeding buffer size cleanly return TC=1 and succeed on TCP retry.
  • SOA Serial Convergence: All secondary and anycast nameserver nodes serve identical SOA serials.
  • DNSSEC DS Hash Matches: Parent DS digest matches the cryptographic hash of the active child KSK.
  • RRSIG Expiration Valid: Signature expiration timestamps are at least 7 days in the future.
  • Checking Disabled (+cd) Delta: Resolver SERVFAIL disappears when queried with +cd (isolating DNSSEC errors).
  • Negative Caching TTL Constrained: SOA minimum TTL is set to 300 seconds or lower.
  • Global Resolver Verification: Independent queries to Google (8.8.8.8), Cloudflare (1.1.1.1), and Quad9 (9.9.9.9) return consistent answers.

23. Interactive DNS Diagnostic & Delegation Tool

Validating complex authoritative delegation paths, glue synchronization, and multi-tier DNSSEC signature chains manually across dozens of nameservers can be time-consuming during an active outage.

You can inspect your authoritative nameservers, verify parent-to-child delegation records, test EDNS0 truncation handling, and audit DNSSEC cryptographic validity in real time using our free Pingzo DNS Lookup & Health Inspector Tool.

For continuous, 24/7 multi-region monitoring of your authoritative nameservers, latency anomalies, and automated DNSSEC expiration alerting before silent outages reach your end users, set up automated synthetic probes with Pingzoapp Global Monitoring.


24. Reference Appendix: Protocol Flags, RCODEs & Cheat Sheet

DNS Response Codes (RCODEs)

RCODENameRFC ReferenceDescriptionSRE Interpretation
0NOERRORRFC 1035No Error conditionQuery resolved successfully
1FORMERRRFC 1035Format ErrorServer unable to parse client query packet
2SERVFAILRFC 1035Server FailureDelegation loop, DNSSEC failure, or server crash
3NXDOMAINRFC 1035Non-Existent DomainAuthoritative proof that domain name does not exist
4NOTIMPRFC 1035Not ImplementedServer does not support requested Opcode
5REFUSEDRFC 1035Query RefusedServer refuses query due to policy or lame delegation
9NOTAUTHRFC 2136Not AuthoritativeServer is not authoritative for the target zone
16BADVERSRFC 6891Bad EDNS VersionEDNS0 version not recognized or supported

Diagnostic CLI Quick Reference Cheat Sheet

# 1. Full trace showing all referrals and glue
dig +trace +all example.com

# 2. Query specific authoritative IP with recursion disabled
dig @198.51.100.10 example.com A +norecurse

# 3. Test TCP port 53 fallback
dig +tcp @198.51.100.10 example.com DNSKEY

# 4. Query with DNSSEC checking disabled (Bypass validation)
dig @8.8.8.8 example.com A +cd

# 5. Fetch Parent DS record from TLD
dig @a.gtld-servers.net example.com DS

# 6. Fetch Child DNSKEY records with signatures
dig example.com DNSKEY +dnssec +multiline

# 7. Query SOA record directly to check serial
dig @198.51.100.10 example.com SOA +short

# 8. Check EDNS buffer size handling
dig @198.51.100.10 example.com A +bufsize=1232 +dnssec

# 9. Dump parent referral authority and additional sections
dig @a.gtld-servers.net example.com +noall +authority +additional

# 10. Validate with delv (DNSSEC dedicated debugger)
delv @8.8.8.8 example.com A
Zero-Code Uptime Alerts

Stop Finding Out About Outages from Angry Users

Get instant WhatsApp & Discord alerts the second your API, website, or server goes down. Setup in 30 seconds with 60-second checks.

WhatsApp & Discord 60-Second Checks Free Forever Plan
Try Pingzo Free

Know before your users do

Connect official WhatsApp notification channels, Discord webhooks, Telegram bots, and public status pages. Start in 30 seconds.

Create Free Monitor