ping6.net

IPv6 DNS:AAAA 记录、双栈解析和最佳实践

了解 DNS 如何与 IPv6 协同工作,包括 AAAA 记录、双栈解析顺序、DNS64 和常见配置错误。

ping6.net2024年12月14日6 min read
IPv6DNSAAAA记录DNS64双栈名称解析

DNS 是 IPv6 部署成败的关键。如果在 IPv6 连接正常工作之前发布 AAAA 记录,用户就会经历超时等待。跳过反向 DNS,邮件服务器会拒绝你的流量。配置错误的双栈解析会使网络变得更慢而不是更快。

本指南介绍 DNS 如何与 IPv6 协同工作、会出现哪些问题以及如何在问题出现之前修复它。

TL;DR - 快速摘要

要点:

  • AAAA 记录是 A 记录的 IPv6 等价物(quad-A = 4 个 A,用于 128 位地址)
  • Happy Eyeballs(RFC 8305)首先尝试 IPv6,但在 50-250 毫秒内回退到 IPv4
  • DNS64 从 A 记录为仅 IPv6 网络合成 AAAA 记录,但会破坏 DNSSEC

跳转至: AAAA 记录了解基础知识,双栈解析了解性能,或常见错误了解故障排除。

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)
记录类型128
查询大小较小较大(影响 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 工作时优先选择它。算法如下:

  1. 查询 DNS 获取 A 和 AAAA 记录
  2. 首先开始连接 IPv6 地址
  3. 等待 50-250 毫秒(取决于实现)
  4. 如果 IPv6 还没有连接,并行启动 IPv4 连接
  5. 使用首先完成的连接

这种方法在性能和可靠性之间取得平衡。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 的客户端查询主机名时:

  1. DNS64 服务器接收查询
  2. 检查 AAAA 记录
  3. 如果 AAAA 存在,正常返回
  4. 如果只有 A 记录存在,使用特殊前缀合成 AAAA 记录
  5. 客户端连接到合成的 IPv6 地址
  6. 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 记录之前:

  1. 验证服务在 IPv6 上侦听:netstat -an | grep :80(或你的端口)
  2. 从外部 IPv6 地址测试:curl -6 https://[2001:db8::1]/
  3. 检查防火墙规则允许 IPv6 流量
  4. 使用 traceroute6 验证路由正确
  5. 从多个 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 的域。