DNSSEC
- 域名系统安全扩展 (DNSSEC) 是由互联网工程任务组 (IETF)制定的一套规范,用于保护互联网协议 (IP) 网络中域名系统 (DNS) 提供的某些类型的信息。它是 DNS 的一组扩展,为 DNS 客户端(解析器)提供 DNS 数据的来源验证、不存在的验证以及数据完整性,但不提供可用性或机密性。
安装 DNSSEC 验证解析器
为了确保全系统范围内验证 DNSSEC,请设置一个能够验证 DNSSEC 记录的本地 DNS 服务器,并配置 resolv.conf(5) 以使用该服务器,从而使所有 DNS 查询都经过它。可用验证解析器请参阅 域名解析#DNS 服务器。请注意,某些 DNS 服务器需要特定选项才能启用 DNSSEC 验证。
如果您尝试访问一个具有伪造 (spoofed) IP 地址的网站,验证解析器将防止您接收到无效的 DNS 数据,且您的浏览器(或其他应用程序)将被告知不存在此类主机。由于所有 DNS 查询都经过验证解析器,因此在使用此选项时,您不需要安装内置 DNSSEC 支持的软件。
测试本地验证解析器
通过终端测试
要测试本地解析器是否正确验证了 DNSSEC,请使用支持设置 DO ("DNSSEC OK") 位的 DNS 查询工具,例如 drill(1)。
测试解析器是否不对具有无效签名的域名返回答案,例如 badsig.test.dnscheck.tools, rhybar.cz 或 dnssec-failed.org
$ drill -D badsig.test.dnscheck.tools
;; ->>HEADER<<- opcode: QUERY, rcode: SERVFAIL, id: 5610 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; badsig.test.dnscheck.tools. IN A ;; ANSWER SECTION: ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 44 msec ;; EDNS: version 0; flags: do ; udp: 1232 ; EDE: 6 (DNSSEC Bogus): 49 37 34 56 (I74V) ;; SERVER: 127.0.0.1 ...
返回代码应为 SERVFAIL (服务器失败),答案部分应为空,且标志 (flags) 中不应包含 ad (已验证数据)。
接下来,测试一个具有有效签名的域名
$ drill -D test.dnscheck.tools
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 20952 ;; flags: qr rd ra ad ; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; test.dnscheck.tools. IN A ;; ANSWER SECTION: test.dnscheck.tools. 5 IN A 116.203.95.251 ... ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 45 msec ;; EDNS: version 0; flags: do ; udp: 1232 ;; SERVER: 127.0.0.1 ...
查询应成功返回并包含 ad (已验证数据) 标志。
通过 Web 浏览器测试
多个网站提供了检查您的 DNS 解析器是否验证 DNSSEC 的测试
- http://www.dnssec-or-not.com/
- https://dnscheck.tools/
- https://wander.science/projects/dns/dnssec-resolver-test/
- https://internet.nl/connection/
带有 DNSSEC 验证的递归查询
要在不涉及递归解析器的情况下验证某个域名的 DNSSEC,请使用能够从 DNS 根开始追踪域名的 DNS 查询工具。例如 drill(1) (来自 ldns) 或 dig(1) (来自 bind)。
使用 drill 时,使用 -D 选项设置 DO (DNSSEC OK) 位,使用 -T 选项从根名称服务器向下追踪到被解析的域名
$ drill -DT example.com
将 example.com 替换为您想要执行 DNSSEC 验证的域名。
对于具有无效 DNSSEC 签名的域名,结果应以以下行结尾
$ drill -DT badsig.test.dnscheck.tools
[B] badsig.test.dnscheck.tools. 1 IN A 116.203.95.251 ;; Error: Bogus DNSSEC signature ;;[S] self sig OK; [B] bogus; [T] trusted; [U] unsigned
对于具有可信签名的域名,结果应以以下行结尾
$ drill -DT test.dnscheck.tools
[T] test.dnscheck.tools. 1 IN A 116.203.95.251 ;;[S] self sig OK; [B] bogus; [T] trusted; [U] unsigned
参见
- DNSSEC 工具
- DNSSEC Visualizer - 一个用于可视化 DNS 区域状态的工具。
- Red Hat: 使用 DNSSEC 保护 DNS 流量 - 关于使用 unbound 实现 DNSSEC 的详尽文章。请注意,某些工具是 Red Hat 特有的,在 Arch Linux 中无法找到。
- 维基百科:域名系统安全扩展
- dns_tools — 简化 DNSSEC 区域管理的工具。