跳转到内容
搜索文档

故障排除

最后更新 查看 MarkdownAgent 设置

了解如何排查 DNSSEC 相关问题。

使用 Dig 测试 DNSSEC

Dig 是用于向名称服务器查询 DNS 记录的命令行工具。

例如,dig 可以向 DNS 解析器询问 www.cloudflare.com 的 IP 地址:

dig www.cloudflare.com +short
198.41.215.162
198.41.214.162

选项 +short 仅输出结果。

使用 +dnssec 验证 DNS 记录是否已签名:

dig www.cloudflare.com +dnssec +short
198.41.214.162
198.41.215.162
A 13 3 300 20180927180434 20180925160434 35273 cloudflare.com. DYYZ/bhHSAIlpvu/HEUsxlzkC9NsswbCQ7dcfcuiNBrbhYV7k3AI8t46 QMnOlfhwT6jqsfN7ePV6Fwpym3B0pg==

在此示例中,输出的最后一行是 RRSIG 记录。RRSIG 是附加到记录上的 DNSSEC 签名。借助 RRSIG,DNS 解析器可以判断 DNS 响应是否可信。

Dig 还可以检索用于验证 DNS 记录的公钥 DNSKEY

dig DNSKEY cloudflare.com +short
257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+ KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==
256 3 13 koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z 1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==

域名的 DNS 记录均使用相同的公钥签名。因此,应查询 apex 域名(cloudflare.com)的公钥,而不是子域(www.cloudflare.com)的公钥。

DNS 响应包含两条记录:

  • DNSKEY 记录 256 是称为区域签名密钥(ZSK)的公钥。ZSK 用于验证 AMXCNAMESRV 等 DNS 记录签名。
  • DNSKEY 记录 257 称为密钥签名密钥(KSK)。KSK 用于验证 DNSKEYCDSCDNSKEY 记录的签名。

在不使用 dig+short 选项时,若响应头中出现 ad 标志,则表示 DNS 响应已通过 DNSSEC 认证:

dig www.cloudflare.com
[...]
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65326
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
[...]
;; QUESTION SECTION:
;www.cloudflare.com.        IN  A
[...]
;; ANSWER SECTION:
www.cloudflare.com. 15  IN  A   198.41.215.162
www.cloudflare.com. 15  IN  A   198.41.214.162

使用 DNSViz 排查 DNSSEC 验证

要可视化并发现潜在的 DNSSEC 问题:

  1. 前往 https://dnsviz.net/
  2. 在出现的文本字段中输入域名。
  3. 若 DNSViz 此前从未分析过该站点,请选择 Analyze(分析)
  4. 若该站点此前已被 DNSViz 分析过,请选择 Update Now(立即更新)

权威名称服务器上缺少或不正确的 RRSIG 记录示例

以下示例展示了当权威名称服务器未提供与 TLD 名称服务器发布的 DS 记录匹配的有效 DNSKEY 记录时,dnsviz.net 如何显示不正确的委派:

未提供有效 DNSKEY 记录时的不正确委派

使用 Dig 查看 DNSSEC 信任链

完整验证域名签名(例如 cloudflare.com)需要验证顶级域(例如 .com)处的密钥签名密钥。

然后通过在根服务器级别检查 .com 的密钥签名密钥进行类似验证。DNSSEC 根密钥会分发给 DNS 客户端以完成信任链。

启用 DNSSEC 时,注册商的 DNS 处需要有一条 DS 记录。DS 记录包含公钥签名密钥的哈希以及有关该密钥的元数据。

使用 dig 查找 DS 记录:

dig +short DS cloudflare.com
2371 13 2 32996839A6D808AFE3EB4A795A0E6A7A39A76FC52FF228B22B76F6D6 3826F2B9

使用 +trace 选项时,dig 可确认答案是由 cloudflare.com 的名称服务器还是 .com 的名称服务器返回。在此示例中,cloudflare.comDS 记录由 e.gtld-servers.net 返回:

dig DS cloudflare.com +trace
[...]
cloudflare.com.     86400   IN  DS  2371 13 2 32996839A6D808AFE3EB4A795A0E6A7A39A76FC52FF228B22B76F6D6 3826F2B9
[...]
com.            172800  IN  NS  e.gtld-servers.net.
[...]
;; Received 1213 bytes from 2001:502:1ca1::30#53(e.gtld-servers.net) in 37 ms

手动执行上述步骤的更简便替代方案是使用第三方工具 DNSViz


使用 Dig 排查 DNSSEC 验证

若在更改权威 DNS 提供商时未更新或移除注册商处的旧 DNSSEC 记录,则会出现问题:

dig A brokendnssec.net @1.0.0.1
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 10663

通过使用带 +cd 选项的 dig 运行查询,确认 SERVFAIL 响应是否与 DNSSEC 相关。+cd 选项在不进行任何 DNSSEC 验证的情况下提供 DNS 结果。

dig A brokendnssec.net @1.0.0.1 +dnssec +cd +short
104.20.49.61
104.20.48.61

在此示例中,若使用 +cd 选项时收到正确的 DNS 响应,但使用 DNSSEC 的查询返回 SERVFAIL 响应,则说明 DNSSEC 配置错误。此问题通常发生在更改了权威名称服务器但未更新 DS 记录时。若攻击者尝试伪造查询响应,也可能出现此问题。


禁用 DNSSEC 后删除残留的 DNSKEY 记录

禁用 DNSSEC 后,DNSKEY 记录仍会出现在 DNS 查询与 zone 传输中。在 disabled 状态下,Cloudflare 仍会签名 zone 并提供 RRSIG、NSEC 与 DNSKEY 记录。这是预期行为,并非错误配置或故障。详情请参阅 DNSSEC 状态RFC 8078

不过,部分安全厂商或审计工具可能会将这些 DNSKEY 记录标记为有问题,报告“找到 DNSKEY 记录但未找到 DS 记录”,并将安全结果标为“可证明不安全(Provably Insecure)”。你可以使用 API 移除这些 DNSKEY 记录。

如何移除残留的 DNSKEY 记录

使用 Delete DNSSEC API 将 zone 转换为 deleted 状态。这会停止所有 zone 签名,并移除所有 DNSSEC 记录类型(RRSIG、NSEC、DNSKEY、CDS 与 CDNSKEY):

Required API token permissions

At least one of the following token permissions is required:
  • DNS Write
Delete DNSSEC recordsbash
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dnssec" \
	--request DELETE \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

有关 DNSSEC 状态的更多信息,请参阅 DNSSEC 状态

验证 DNSKEY 已移除

移除 DNSKEY 记录后,验证它们不再出现在 DNS 响应中。空响应可确认移除成功。

dig DNSKEY example.com +short

若 DNSKEY 记录仍然出现,请等待生存时间(TTL)过期。DNSKEY 记录通常具有较长的 TTL 值(通常为 3600 秒或更长),因此传播可能需要一小时或更长时间。


后续步骤

若发现 DNSSEC 实现存在问题,请联系域名的注册商,并确认 DS 记录与权威 DNS 提供商指定的内容匹配。若 Cloudflare 是权威 DNS 提供商,请按照使用 Cloudflare 配置 DNSSEC 的说明操作。

这篇文档对您有帮助吗?