IPv6 与 DNS:AAAA 记录与双栈解析
一个网站要支持 IPv6,DNS 是第一道门,也是最容易被忽略的一道门。这篇讲清 AAAA 记录、双栈客户端的选择逻辑,以及实际会踩的坑。
一、AAAA 记录:IPv6 的地址记录
| 记录类型 | 存什么 | 长度 |
|---|---|---|
A |
一个 IPv4 地址 | 32 位 |
AAAA |
一个 IPv6 地址 | 128 位("4A" 就是这么来的) |
AAAA 由 RFC 3596 定义,类型码 28。一个域名可以同时有 A 和 AAAA,这就是"双栈域名":
$ dig A example.com +short
192.0.2.10
$ dig AAAA example.com +short
2001:db8::10
二、关键结论:没有 AAAA,就没有 IPv6 流量
这句话值得单独强调。客户端的解析流程是:
域名解析
├─ 有 AAAA ? → 尝试 IPv6 连接
└─ 只有 A ? → 只能走 IPv4
即使你的服务器、机房、防火墙都已经支持 IPv6,只要 DNS 里没有 AAAA 记录,就没有任何访客能用 IPv6 访问到你。反过来,如果你的域名有 AAAA,但服务器其实没监听 IPv6,客户端会尝试连接然后失败——这比没有 AAAA 更糟糕。
一条实用检查:域名上"开了 IPv6"和"确实能用 IPv6 访问"是两件事。前者看 AAAA,后者要真的发一次 IPv6 请求。本站首页的网站检测就是为后者准备的。
三、客户端如何在 A / AAAA 之间选择
当域名同时有 A 和 AAAA,客户端不会简单地"永远优先 v6",而是遵循 Happy Eyeballs(RFC 6555,现行版本 RFC 8305):
- 先发起 IPv6 连接;
- 若在约 250ms 内未建立,同时发起 IPv4 连接;
- 谁先成功用谁。
这个机制解决了一个现实问题:有些环境下 IPv6 路由"看起来有、实际不通",纯串行尝试会让用户等上几十秒。Happy Eyeballs 把最坏情况的等待压到几百毫秒。
但它不是万能药:如果 IPv6 路径能建立 TCP 连接却传输极慢(比如 MTU 异常),Happy Eyeballs 帮不上忙,用户会感知为"这个网站有的机器能开、有的开不了"。
四、反向解析:ip6.arpa
IPv4 的反向解析是 in-addr.arpa(倒写字节),IPv6 用 ip6.arpa(RFC 3596),规则是按 4 位(nibble)倒序:
地址:2001:db8::1
↓ 展开为 32 个十六进制字符
20010db8000000000000000000000001
↓ 每个字符作为一个标签,倒序排列
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2
↓ 追加后缀
….ip6.arpa
然后由持有该网段的机构在此空间下发布 PTR 记录。注意 IPv6 的反向解析域非常长,实际很少由人工维护,通常由 IPAM 系统自动生成。
为什么它是"倒序"的? 因为 DNS 的委派是按从左到右、由细到粗进行的,倒序后 ip6.arpa 下的树形结构与地址空间的分层结构完全对应:上级机构委派前缀,下级机构自行管理其下的反向解析。
五、公共 DNS 的 IPv6 地址
要在"纯 IPv6 环境"里做域名解析,解析器本身必须有 IPv6 地址。常用公共 DNS 的 IPv6 地址:
| 服务 | IPv4 | IPv6 |
|---|---|---|
| 阿里 AliDNS | 223.5.5.5 |
2400:3200::1、2400:3200:baba::1 |
| 腾讯 DNSPod | 119.29.29.29 |
2402:4e00:: |
| Google Public DNS | 8.8.8.8 |
2001:4860:4860::8888、…::8844 |
| Cloudflare | 1.1.1.1 |
2606:4700:4700::1111、…::1001 |
| Quad9 | 9.9.9.9 |
2620:fe::fe、2620:fe::9 |
选择时建议优先用本地出口延迟低、且自身有 IPv6 地址的解析服务。本站的「公共 DNS 推荐」页面收录了各服务的双栈地址与特性对比。
六、六个常见坑
- 只有 A 记录。 域名层面就没开 IPv6,后面全白做。
- 有 AAAA 但服务端没监听 IPv6。 客户端会先试 v6 再回落 v4,用户感知为"首次打开变慢",监控里表现为 v6 连接失败率 100%。
- 只加了 AAAA,忘了防火墙。 云安全组/主机防火墙只放行了 v4,AAAA 发布后不可达。
- 回源链路还是 IPv4。 CDN 开了 IPv6 接入,但回源没有 v6,这没有问题——如果 CDN 支持回源 v4;但部分场景下会因回源策略失配而报错。
- 多 AAAA 中有坏地址。 DNS 轮询时会把请求也分到不可用节点,表现为"间歇性失败"。发布前务必逐个验证。
- 限流策略按单个 IPv6 地址计数。 一个
/64前缀下就有 2⁶⁴ 个地址,攻击者可以轻易绕过按地址计数的限流。正确的做法是按/64归并计数——这也是本站后台登录限流采用的策略。
七、动手检查清单
# 1. 域名是否有 AAAA
dig AAAA 你的域名 +short
# 2. AAAA 是否与预期一致
dig AAAA 你的域名 @2400:3200::1 +short
# 3. 是否能用 IPv6 真的连通(需要本机有 IPv6)
curl -6 -I https://你的域名
# 4. 反向解析是否配置
dig -x 2001:db8::10 +short
# 5. 从纯 IPv6 视角做一次外部验证
# 可用本站「网站 IPv6 检测」页提交域名
第 3 条命令是本篇的重点:只有 curl -6 成功,才叫"这个域名真的支持 IPv6"。
小结
- AAAA 记录是 IPv6 访问的开关,没有它就没有 v6 流量。
- 有 AAAA 而服务端不通,比没有 AAAA 更差。
- 客户端靠 Happy Eyeballs 在 A/AAAA 之间竞速选择,不要依赖"v6 天然优先"。
- 反向解析在
ip6.arpa下按 nibble 倒序,一般交给 IPAM 自动维护。 - 频率限制按
/64归并,不要按单个地址计数。
下一篇:《邻居发现协议 NDP:IPv6 世界的"ARP"》。