IPv6 DNS:AAAA 记录、双栈解析和最佳实践
了解 DNS 如何与 IPv6 协同工作,包括 AAAA 记录、双栈解析顺序、DNS64 和常见配置错误。
DNS 是 IPv6 部署成败的关键。如果在 IPv6 连接正常工作之前发布 AAAA 记录,用户就会经历超时等待。跳过反向 DNS,邮件服务器会拒绝你的流量。配置错误的双栈解析会使网络变得更慢而不是更快。
本指南介绍 DNS 如何与 IPv6 协同工作、会出现哪些问题以及如何在问题出现之前修复它。
AAAA 记录:IPv6 的 A 记录等价物#
AAAA 记录(读作「quad-A」)将主机名映射到 IPv6 地址。它是 A 记录的 IPv6 等价物,但保存的是 128 位地址而不是 32 位。
格式和结构#
example.com. 3600 IN AAAA 2001:db8::1结构与 A 记录匹配:名称、TTL、类别、类型和地址。地址使用标准 IPv6 表示法,使用冒号和十六进制数字。
每个组中的前导零可以省略,连续的零组可以压缩为 ::。这两种形式都是有效且相同的:
example.com. IN AAAA 2001:0db8:0000:0000:0000:0000:0000:0001
example.com. IN AAAA 2001:db8::1使用压缩格式。它更容易阅读,输入时也不容易出错。
查询 AAAA 记录#
查询 AAAA 记录的方式与查询 A 记录相同,只需指定类型。
使用 dig:
dig AAAA example.com
dig AAAA @2001:4860:4860::8888 example.com使用 nslookup:
nslookup -type=AAAA example.com
nslookup -type=AAAA example.com 2001:4860:4860::8888使用 host:
host -t AAAA example.com你还可以使用我们的 DNS 查询工具同时查询 A 和 AAAA 记录并比较结果。
AAAA 与 A 记录的比较#
两者都服务于相同的目的——将名称转换为地址——但它们在关键方面有所不同:
| 功能 | A 记录 | AAAA 记录 |
|---|---|---|
| 地址长度 | 32 位 | 128 位 |
| 地址格式 | 点分十进制(192.0.2.1) | 冒号十六进制(2001:db8::1) |
| 记录类型 | 1 | 28 |
| 查询大小 | 较小 | 较大(影响 UDP 分片) |
| 缓存行为 | 独立 TTL | 独立 TTL |
A 和 AAAA 记录是完全独立的。它们可以有不同的 TTL,指向不同的服务器,或者在没有另一个的情况下单独存在。这种灵活性很有用,但也会产生配置错误的机会。
发布前先测试
只有在你的服务实际上可以通过 IPv6 访问时才发布 AAAA 记录。发布损坏的 AAAA 记录会导致连接延迟,因为客户端首先尝试 IPv6 并等待超时后才回退到 IPv4。
双栈 DNS 解析#
大多数网络运行双栈:IPv4 和 IPv6 同时工作。当客户端查找主机名时,它会同时收到 A 和 AAAA 记录。然后操作系统决定使用哪一个。
Happy Eyeballs(RFC 8305)#
现代操作系统实现了 Happy Eyeballs 算法,该算法尝试 IPv4 和 IPv6,但在 IPv6 工作时优先选择它。算法如下:
- 查询 DNS 获取 A 和 AAAA 记录
- 首先开始连接 IPv6 地址
- 等待 50-250 毫秒(取决于实现)
- 如果 IPv6 还没有连接,并行启动 IPv4 连接
- 使用首先完成的连接
这种方法在性能和可靠性之间取得平衡。IPv6 获得优先权,但损坏的 IPv6 不会长时间阻塞连接。
解析顺序#
客户端查询记录和尝试连接的顺序因操作系统和配置而异。
大多数 Unix/Linux 系统:
- 同时查询 A 和 AAAA 或先查询 AAAA
- 如果存在 IPv6 地址则优先使用
- 由
/etc/gai.conf(getaddrinfo 配置)控制
macOS:
- 并行查询两种记录类型
- 严格实现 Happy Eyeballs
- 可用时强烈偏好 IPv6
Windows:
- 查询两种记录类型
- 默认偏好 IPv6(可通过注册表配置)
- 从 Windows 8 开始实现 Happy Eyeballs
浏览器:
- Chrome 和 Firefox 实现自己的 Happy Eyeballs
- 不仅依赖操作系统行为
- 可能会积极缓存解析结果
IPv6 何时获胜(或失败)#
IPv6 通常在以下情况下赢得竞争:
- IPv6 连接是原生的(未通过隧道)
- IPv6 路由是直接的,没有额外跳数
- 目标通过 IPv6 连接良好
IPv6 在以下情况下失败:
- 通过隧道(6to4、Teredo)增加延迟
- 路由比 IPv4 路径更长
- 服务器的 IPv6 连接不佳
- 防火墙或中间盒问题导致连接变慢
Facebook 的 IPv6 性能
Facebook 发现,使用原生 IPv6 连接的用户体验到比 IPv4 快 10-15% 的页面加载速度。性能提升来自更少的网络跳数、没有运营商级 NAT 和更直接的路由。
测试双栈行为#
强制使用 IPv4 或 IPv6 来测试行为:
# 强制 IPv4
curl -4 https://example.com
# 强制 IPv6
curl -6 https://example.com
# 让操作系统选择
curl https://example.com比较响应时间。如果 IPv6 明显较慢,在广泛发布 AAAA 记录之前调查路由或连接问题。
DNS64 和 NAT64#
DNS64 从 A 记录合成 AAAA 记录,使仅支持 IPv6 的网络能够访问仅支持 IPv4 的服务。它与 NAT64 配对,后者在 IPv6 和 IPv4 之间转换数据包。
DNS64 的工作原理#
当仅支持 IPv6 的客户端查询主机名时:
- DNS64 服务器接收查询
- 检查 AAAA 记录
- 如果 AAAA 存在,正常返回
- 如果只有 A 记录存在,使用特殊前缀合成 AAAA 记录
- 客户端连接到合成的 IPv6 地址
- NAT64 网关将连接转换为 IPv4
众所周知的前缀:64:ff9b::/96#
最常见的 DNS64 前缀是 64:ff9b::/96,定义在 RFC 6052 中。地址的最后 32 位嵌入 IPv4 地址。
合成示例:
A 记录: 192.0.2.1
前缀: 64:ff9b::/96
AAAA 记录: 64:ff9b::192.0.2.1
或 64:ff9b::c000:201(十六进制)一些网络使用其他前缀,如 2001:db8::/96 或自定义范围。前缀必须在 DNS64 和 NAT64 上一致配置。
何时需要 DNS64/NAT64#
DNS64 对于以下情况至关重要:
- 仅支持 IPv6 的移动网络(T-Mobile、AT&T 常见)
- 访问传统 IPv4 服务的仅支持 IPv6 的数据中心
- 测试仅支持 IPv6 的客户端行为
如果满足以下条件,则不需要 DNS64:
- 你的网络是双栈
- 你访问的所有服务都有原生 IPv6
- 你可以在所有后端服务上强制使用 IPv6
限制和注意事项#
DNS64 会破坏几件事:
DNSSEC 验证失败 - 合成的 AAAA 记录与签名区域不匹配。DNS64 服务器必须剥离 DNSSEC 签名,降低安全性。
嵌入 IP 地址的应用程序中断 - 如果应用程序在 JSON、XML 或其他数据格式中接收 IPv4 地址,DNS64 不会翻译它。应用程序尝试从仅支持 IPv6 的堆栈连接到 IPv4 地址并失败。
负载均衡器和 CDN 混乱 - DNS64 使所有客户端看起来都来自 NAT64 网关的地址。地理位置、速率限制和客户端识别中断。
引用和重定向失败 - 如果 DNS 响应在附加部分包含 IPv4 地址(如 NS 胶水记录),客户端无法访问它们。
在没有 DNS64 的情况下测试
设计服务以在 IPv6 上原生工作。DNS64/NAT64 是过渡工具,而不是永久解决方案。它增加了延迟、复杂性并破坏了边缘情况。
反向 DNS(PTR 记录)#
反向 DNS 将 IPv6 地址映射回主机名。它对于连接不是强制性的,但对于邮件服务器是必需的,对于日志记录和安全工具也很有用。
ip6.arpa 区域#
IPv6 反向 DNS 使用 ip6.arpa 域。地址的每个半字节(4 位或一个十六进制数字)都成为域名中的一个标签,以相反的顺序编写。
将地址转换为 PTR 格式#
取完整的、未压缩的 IPv6 地址,逐半字节反转,然后附加 ip6.arpa。
示例:2001:db8::1
步骤 1: 展开为完整形式:
2001:0db8:0000:0000:0000:0000:0000:0001步骤 2: 写出所有半字节:
2 0 0 1 0 d b 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1步骤 3: 反转顺序:
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步骤 4: 用点分隔并附加 ip6.arpa:
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 记录名称。它指向你的主机名。
查询反向 DNS#
使用 dig 自动转换:
dig -x 2001:db8::1直接查询 PTR 记录:
dig PTR 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使用 host:
host 2001:db8::1委派反向 DNS#
反向 DNS 区域由你的 ISP 或 RIR 委派。如果你有 /48,你就控制 /48 大小的反向 DNS 空间。大多数提供商允许你通过 Web 界面管理它,或允许你为反向区域运行自己的 DNS 服务器。
对于较小的分配(如 /64),一些 ISP 会为你处理单个 PTR 记录。向他们提供地址和主机名。
邮件服务器的反向 DNS
邮件服务器检查反向 DNS 以减少垃圾邮件。如果你的邮件服务器的 IPv6 地址没有 PTR 记录,或者它与正向查找不匹配,许多邮件系统会拒绝你的消息或将它们评分为垃圾邮件。
IPv6 的常见 DNS 错误#
在没有工作的 IPv6 的情况下发布 AAAA#
这是第一大错误。你在服务器上启用 IPv6,创建 AAAA 记录,并假设它可以工作。但如果防火墙阻止 IPv6,路由中断,或服务器实际上没有在 IPv6 上侦听,客户端就会超时。
症状: 网站加载缓慢,特别是在偏好 IPv6 的移动网络上。
修复: 在发布 AAAA 记录之前,从多个外部 IPv6 网络测试连接。使用我们的 Ping 工具验证可达性。
忘记反向 DNS#
正向 DNS 工作正常,但你跳过了反向 DNS。这会中断邮件传递,混淆日志分析,看起来不专业。
症状: 邮件拒绝,「反向 DNS 查找失败」错误。
修复: 为所有服务器地址设置 PTR 记录。从多个位置使用 dig -x 验证。
A 和 AAAA 之间的 TTL 不匹配#
你的 A 记录有 3600 秒的 TTL,但 AAAA 有 300。当你更新 DNS 时,客户端会得到不一致的结果数小时。
症状: 一些客户端解析到旧地址,其他客户端解析到新地址。难以排查。
修复: 匹配 A 和 AAAA 记录的 TTL。它们应该是相同的。在进行更改之前降低两者,然后在之后再次提高它们。
防火墙阻止通过 IPv6 的 DNS#
你的 DNS 服务器有 IPv6 地址和 AAAA 记录,但防火墙阻止通过 IPv6 的 UDP 和 TCP 端口 53。客户端无法查询它。
症状: 来自仅支持 IPv6 的客户端或网络的 DNS 查询失败。
修复: 允许 IPv4 和 IPv6 的 UDP 和 TCP 端口 53。从仅支持 IPv6 的主机进行测试。请记住,通过 TCP 的 DNS 是强制性的,而不是可选的。
不完整的双栈配置#
你为你的网站配置了 AAAA 记录,但没有为你的 CDN、邮件服务器或 API 端点配置。用户得到混合结果。
症状: 主站点通过 IPv6 工作,但嵌入式内容、API 调用或邮件回退到 IPv4,失去性能优势。
修复: 为链中的所有服务启用 IPv6,而不仅仅是前端。从仅支持 IPv6 的客户端测试完整工作流程。
配置中的硬编码 IPv4 地址#
你的 DNS 解析正常,但应用程序配置文件包含硬编码的 IPv4 地址。当仅支持 IPv6 的客户端尝试连接时,服务中断。
症状: 应用程序在仅支持 IPv6 的网络上失败并出现连接错误。
修复: 在配置文件中使用主机名,而不是 IP 地址。让 DNS 解析到适当的地址族。
最佳实践#
发布前彻底测试#
在向生产 DNS 添加 AAAA 记录之前:
- 验证服务在 IPv6 上侦听:
netstat -an | grep :80(或你的端口) - 从外部 IPv6 地址测试:
curl -6 https://[2001:db8::1]/ - 检查防火墙规则允许 IPv6 流量
- 使用
traceroute6验证路由正确 - 从多个 IPv6 网络(移动、宽带、数据中心)测试
不要因为操作系统有 IPv6 地址就假设它可以工作。
匹配 A 和 AAAA 记录的 TTL#
设置相同的 TTL。这使缓存行为保持一致并简化 DNS 更新。
example.com. 3600 IN A 192.0.2.1
example.com. 3600 IN AAAA 2001:db8::1如果你需要更改地址,在更改前 24-48 小时降低 TTL,进行更新,然后再次提高它。
配置反向 DNS#
为所有公开可路由的 IPv6 地址设置 PTR 记录。这对于邮件服务器是必需的,对于其他所有内容也很有帮助。
与你的 ISP 或 RIR 合作委派反向区域。保持 PTR 记录与正向 DNS 同步——它们应该匹配。
监控两种协议#
分别跟踪 A 和 AAAA 记录的 DNS 查询量、响应时间和错误率。监控通过 IPv4 和 IPv6 传输的解析。
设置警报:
- AAAA 查询失败而 A 查询成功
- IPv4 和 IPv6 之间的响应时间差异
- IPv6 查询量突然下降
单独的监控在用户抱怨之前捕获问题。
使用支持 IPv6 的 DNS 服务器#
你的 DNS 服务器必须通过 IPv4 和 IPv6 响应查询。即使你的网络还不是完全双栈,也要配置两个地址族。
从仅支持 IPv6 的客户端进行测试。令人惊讶的是,许多 DNS 服务器有 AAAA 记录但实际上不接受通过 IPv6 的查询。
小心实施 DNSSEC#
DNSSEC 与 IPv6 兼容,但 DNS64 会破坏它。如果你在网络中使用 DNS64,你无法验证合成记录上的 DNSSEC。
对于生产部署,设计原生双栈并尽可能避免 DNS64。
相关文章#
测试你的 DNS 配置
使用我们的 DNS 查询工具查询 A、AAAA 和 PTR 记录。在使其生效之前验证你的双栈配置是否正确。
常见问题#
双栈服务是否需要 A 和 AAAA 记录?
是的。为双栈服务发布两种记录类型。支持 IPv6 的客户端将使用 AAAA,而仅支持 IPv4 的客户端使用 A。除非你的服务实际上在 IPv6 上工作,否则不要发布 AAAA——损坏的 AAAA 记录会导致超时延迟。
我可以为 IPv4 和 IPv6 使用不同的服务器吗?
可以。A 和 AAAA 记录是独立的,可以指向不同的服务器。这对于渐进式 IPv6 部署或当你想按协议以不同方式路由流量时很有用。只需确保两台服务器提供相同的内容和功能。
为什么我的网站在移动设备上很慢但在 WiFi 上很快?
移动网络通常偏好或要求 IPv6。如果你的 AAAA 记录存在但你的 IPv6 连接中断或很慢,移动用户会等待超时或经历高延迟。从多个移动运营商通过 IPv6 测试你的站点。如果 IPv6 不能正常工作,请删除 AAAA 记录。
是否需要为所有内容设置反向 DNS?
反向 DNS 对于邮件服务器是强制性的,强烈建议用于所有面向公众的服务器。对于客户端地址或内部服务器不是必需的,但拥有它有助于故障排除、日志记录和安全分析。
如何测试 DNS64 是否工作?
从仅支持 IPv6 的客户端查询仅支持 IPv4 的主机名。如果 DNS64 正在工作,你将收到带有配置前缀(通常是 64:ff9b::/96)的合成 AAAA 记录。使用 dig AAAA ipv4only.arpa 作为测试——它是为 DNS64 测试设计的仅支持 IPv4 的域。