DNSSEC 故障排除

DNSSEC 可保护 DNS。  本文讨论如何检测影响 DNS 解析的 DNSSEC 问题。


使用 Dig 测试 DNSSEC

Dig 是一个命令行工具,用于查询 DNS 记录的域名服务器。例如,dig 可以向 DNS 解析器请求 www.cloudflare.com 的 IP 地址(选项 + short 仅输出结果)

$ dig www.cloudflare.com +short198.41.215.162198.41.214.162

使用 dig 验证 DNSSEC 记录。  在下面的示例中,最后一行输出的是 RRSIG 记录。  RRSIG 是附加到记录的 DNSSEC 签名。使用 RRSIG,DNS 解析器可确定 DNS 响应是否可信。

$ dig www.cloudflare.com +dnssec +short198.41.214.162198.41.215.162A 13 3 300 20180927180434 20180925160434 35273 cloudflare.com.DYYZ/bhHSAIlpvu/HEUsxlzkC9NsswbCQ7dcfcuiNBrbhYV7k3AI8t46 QMnOlfhwT6jqsfN7ePV6Fwpym3B0pg==

Dig 还会检索用于验证 DNS 记录的公共密钥。  域的 DNS 记录都使用相同的公共密钥签名。  因此,查询根域的公共密钥,而不是子域的公共密钥: 

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

DNS 响应包括两个记录:

  • DNSKEY 记录 256 是名为“区域签名密钥”的公共密钥,用于验证 A、MX、CNAME、SRV 等的 DNS 记录签名。
  • DNSKEY 记录 257 称为“密钥签名密钥”,用于验证 DNSKEY、CDS 和 CDNSKEY 记录的签名。
有关如何使用公共密钥验证签名的详细信息超出了本文的范围。

+ short 选项未与 dig 一起使用时,如果响应标头中出现 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

使用 Dig 查看 DNSSEC 信任链

域签名(例如:cloudflare.com)的完整验证涉及验证顶级域(例如:.com)的密钥签名密钥。  然后通过在根服务器级别检查 .com 的密钥签名密钥来执行类似的验证。DNSSEC 根密钥分发到 DNS 客户端以完成信任链。

启用 DNSSEC 后,注册商的 DNS 需要 DS 记录DS 记录包含公共密钥签名密钥的哈希以及密钥的元数据。

使用 dig 查找 DS 记录

$ dig +short DS cloudflare.com2371 13 2 32996839A6D808AFE3EB4A795A0E6A7A39A76FC52FF228B22B76F6D6 3826F2B9

使用 +trace 选项时dig 将确认答案是cloudflare.com 的域名服务器还是 .com 的域名服务器返回。  在此示例中,cloudflare.comDS 记录由 egtld-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 在线工具。请参阅使用 DNSViz 对 DNSSEC 验证进行故障排除的详细信息或通过 DNSViz 获取 cloudflare.com 的 DNSSEC 结果的示例。


使用 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 选项提供 DNS 结果,而无需任何 DNSSEC 验证。

$ dig A brokendnssec.net @1.0.0.1 +dnssec +cd +short104.20.49.61104.20.48.61

在上面的示例中,如果在使用 +cd 选项时收到正确的 DNS 响应,但使用 DNSSEC 的查询返回 SERVFAIL 响应,则说明 DNSSEC 配置错误。 当权威域名服务器发生更改但 DS 记录未更新时,通常会发生此问题。  如果攻击者试图伪造对查询的响应,也会发生此问题。 


使用 DNSViz 对 DNSSEC 验证进行故障排除

  1. 浏览到 http://dnsviz.net/

  2. 在显示的文本字段中输入域名。

  3. 如果 DNSViz 之前从未分析过该站点,则单击显示的分析按钮。

  4. 如果 DNSViz 之前已分析过该站点,则单击显示的立即更新按钮。

无 DNSSEC 的示例

下面是 dnsviz.net 用图形表示的无 DNSSEC 的工作域示例:

Screen_Shot_2018-09-18_at_10.31.54_AM.png

具有正确 DNSSEC 的示例

以下是 TLD 域名服务器与 cloudflare.com 的权威域名服务器之间具有正常运行 DNSSEC 记录的域的示例:

Screen_Shot_2018-10-16_at_2.png

权威域名服务器上 RRSIG 记录缺失或错误的示例

以下是当权威域名服务器未提供有效 DNSKEY 记录以匹配 TLD 域名服务器发布的 DS 记录时,dnsviz.net 如何显示错误委派的示例:

Screen_Shot_2018-09-18_at_10.25.49_AM.png


后续步骤 

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


相关资源

Not finding what you need?

95% of questions can be answered using the search tool. This is the quickest way to get a response.

由 Zendesk 提供技术支持