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.com 的 DS 记录由 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 验证进行故障排除
- 浏览到 http://dnsviz.net/
- 在显示的文本字段中输入域名。
- 如果 DNSViz 之前从未分析过该站点,则单击显示的分析按钮。
- 如果 DNSViz 之前已分析过该站点,则单击显示的立即更新按钮。
无 DNSSEC 的示例
下面是 dnsviz.net 用图形表示的无 DNSSEC 的工作域示例:
具有正确 DNSSEC 的示例
以下是 TLD 域名服务器与 cloudflare.com 的权威域名服务器之间具有正常运行 DNSSEC 记录的域的示例:
权威域名服务器上 RRSIG 记录缺失或错误的示例
以下是当权威域名服务器未提供有效 DNSKEY 记录以匹配 TLD 域名服务器发布的 DS 记录时,dnsviz.net 如何显示错误委派的示例:
后续步骤
如果在 DNSSEC 实施中发现问题,请与域名注册商联系,确认 DS 记录与权威 DNS 提供商指定的内容相匹配。如果 Cloudflare 是权威 DNS 提供商,请按照使用 Cloudflare 配置 DNSSEC 的说明进行操作。