Why AAAA records matter more than the traffic numbers suggest
The record is named AAAA ("quad-A") because an IPv6 address is four times the size of an IPv4 address: 128 bits instead of 32. Functionally it is identical to an A record — a name, an address, a TTL — but the operational consequences of getting it wrong are asymmetric, and that asymmetry catches people out.
A missing AAAA record is harmless. Dual-stack clients simply use IPv4. A broken AAAA record is not harmless at all: clients on IPv6 networks prefer IPv6 by default, so they attempt the dead address first. Happy Eyeballs (RFC 8305) is supposed to race both families and fall back within a few hundred milliseconds, but the fallback is not universal — older clients, some mail servers, and plenty of command-line tools will just hang. The result is the worst kind of outage: fine for most of the world, completely broken for a specific set of networks.
dig +noall +answer google.com AAAA
google.com. 6 IN AAAA 2404:6800:4000:1015::71
google.com. 6 IN AAAA 2404:6800:4000:1015::66
google.com. 6 IN AAAA 2404:6800:4000:1015::8bReading IPv6 addresses without going cross-eyed
- Eight groups of four hex digits, separated by colons. Leading zeros in a group may be dropped:
2001:0db8:0000:0042is written2001:db8:0:42. ::replaces one run of all-zero groups and may appear once per address.2001:db8::1is2001:0db8:0000:0000:0000:0000:0000:0001.- Addresses beginning
2000::/3(anything starting 2 or 3) are global unicast — routable on the public internet. fe80::/10is link-local. Valid on a LAN, meaningless in a public DNS zone. Publishing one is always a mistake.fc00::/7(startingfcorfd) is unique local — the IPv6 equivalent of RFC 1918 private space. Also unroutable publicly.::ffff:192.0.2.1is an IPv4-mapped address. It belongs in socket APIs, not in a DNS zone.
Read the full explanation of aaaa record lookup results ↓Show less ↑
fe80:, fc, or fd, IPv6 users cannot reach that host at all. Remove the record or replace it with a global unicast address — leaving it in place is worse than having no AAAA record.How clients choose between A and AAAA
A dual-stack client resolves both record types and then applies RFC 6724 address selection, which prefers global IPv6 over IPv4 in almost every ordinary case. RFC 8305 (Happy Eyeballs v2) layers a race on top: the client starts the IPv6 connection first, waits a short resolution delay for the A record, and begins the IPv4 attempt roughly 250 ms later, taking whichever handshake completes first.
Two consequences follow that are worth planning around. First, once you publish a working AAAA record, the majority of IPv6-capable traffic moves to it immediately — so the IPv6 path must be as well provisioned, as well firewalled, and as well monitored as the IPv4 one, not a lightly tested afterthought. Second, your server logs will start recording IPv6 source addresses, which breaks any allowlist, rate limiter, geolocation lookup, or abuse script that assumes a dotted-quad. Check those before publishing, not after.
Happy Eyeballs also explains why a broken AAAA record produces such inconsistent bug reports. A modern browser hides the failure behind a sub-second delay, so users describe the site as "a bit slow"; a curl script, an SDK, or an older mail server has no such fallback and fails outright. Same record, same network, completely different symptom depending on the client.
Common failures and fixes
- "The site works for everyone except one office." Classic broken-AAAA symptom: that office has native IPv6 and everyone else does not. Test the address directly with
curl -6 -v https://example.comfrom an IPv6-capable host before blaming the network. - AAAA published, but the server is not listening on IPv6. DNS and the service are configured independently. Check your web server binds
[::]:443as well as0.0.0.0:443, and that the firewall has ip6tables/nftables rules mirroring the IPv4 ones — a frequent omission, since IPv4 rules do not apply to IPv6 traffic. - AAAA on the apex but not on www (or vice versa). They are separate names. Dual-stack one and not the other and you get half-broken behaviour that is maddening to reproduce.
- A CDN-proxied record shows an address you do not recognise. Expected. Proxied records publish the proxy's anycast addresses; your origin stays hidden.
- Mail server has AAAA but no IPv6 reverse DNS. Major providers, Google in particular, reject IPv6 mail from hosts without a matching PTR record. Verify with the reverse DNS lookup, and if you cannot get a valid IPv6 PTR, remove the AAAA from the mail hostname rather than losing delivery.
- Stale AAAA after a server move. IPv6 addresses are usually assigned per-subnet, so a move to a new rack or provider changes the whole prefix. Update A and AAAA together — updating only one is a very common half-migration.
Verifying from the command line
# The AAAA records themselves
dig +short google.com AAAA
# A and AAAA side by side
dig +noall +answer google.com A google.com AAAA
# Prove the address actually answers over IPv6
curl -6 -sS -o /dev/null -w '%{http_code}\n' https://google.com
ping6 -c 3 google.com
# Check whether your own network has working IPv6 at all
dig -6 +short @2606:4700:4700::1111 example.com AAAAThat last distinction matters when you are debugging. A dig from a machine without IPv6 connectivity still returns AAAA records correctly, because the *query* travels over IPv4 while the *answer* merely contains an IPv6 address. Being able to look up an AAAA record proves nothing about being able to reach it.