如何使用dig命令行测试和验证DNSSEC
在Linux,macOS,* BSD和类似Unix的系统下,如何使用dig命令行测试和验证DNSSEC?
DNSSEC是域名系统安全扩展的首字母缩写。
它是一组Internet工程任务组(IETF)规范,用于保护域名系统(DNS)提供的某些类型的信息。
Dig是一个DNS查找工具,用于查询dns服务器以获取DNS记录。
例如,dig可以使用DNS解析器告诉您邮件服务器或者网站的IP地址。
可以使用DNSSEC减轻安全风险,并帮助防止恶意动作,例如缓存中毒,篡改和中间人攻击。
使用DNSSEC,可以验证和认证DNS数据和DNS完整性。
本教程说明如何使用dig命令测试和验证影响DNS解析的DNSSEC问题。
如何使用dig测试和验证DNSSEC
- 在Linux/Unix/macOS桌面上打开终端应用程序
- 使用dig验证DNSSEC记录,运行:
dig YOUR-DOMAIN-NAME + dnssec + short
- 获取用于验证DNS记录的公共密钥,执行:
dig DNSKEY YOUR-DOMAIN-NAME + short
- 使用dig命令显示DNSSEC信任链:dig DS YOUR-DOMAIN-NAME + trace
- 使用dig进行DNSSEC验证,运行以下两个命令:
dig . DNSKEY | grep -Ev '^($|;)' > keys dig +sigchase +trusted-key=./keys YOUR-DOMAIN-NAME. A | less dig +sigchase +trusted-key=./keys YOUR-DOMAIN-NAME. A | grep -i validation
让我们详细查看所有命令和示例。
是否为指定域名启用了DNSSEC?
启用DNSSEC时,签名委托(DS)记录提供有关签名区域文件的信息。
让我们使用dig打印域的DS记录:
dig DS {domain-name} dig DS google.com dig DS theitroad.local +short
DNSKEY只是一条记录,其中包含一个公用密钥,DNS解析程序可以使用该公用密钥来验证DNSSEC签名。
要显示DNSKEY,请运行:
dig DNSKEY {domain-name} dig DNSKEY google.com dig DNSKEY theitroad.local +short
DNSKEY记录包含一个公共签名密钥,而DS记录包含一个DNSKEY记录的哈希(如果启用了DNSSEC)
请注意,google.com没有定义DS和DNSKEY。
换句话说,该域未启用DNSSEC。
使用dig验证dnssec
接下来,我们将查询并验证DNSSEC。
语法非常简单:
dig +dnssec {domain-name}. dig +dnssec www.theitroad.local. +short dig +dnssec www.theitroad.local.
首先,您需要传递+ dnssc
标志来深入验证区域数据。
其次,当我的解析器配置为自行执行DNSSEC验证时,请注意输出中的" ad",以确认区域数据正确。
第三看响应的RRSIG
行。
ad标志表示经过身份验证的答案,必须设置do标志指示DNSSEC正常:
dig theitroad.local +dnssec +multi
输出示例:
; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> theitroad.local +dnssec +multi ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53272 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;theitroad.local. IN A ;; ANSWER SECTION: theitroad.local. 135 IN A 104.20.187.5 theitroad.local. 135 IN A 104.20.186.5 theitroad.local. 135 IN RRSIG A 13 2 300 ( 20191212194711 20191210174711 34505 theitroad.local. meJ8aERJ6AddCA3Fbno7ixH63hRQTal0wXCnaJG8de4z yhXDJRMXYJshPnKR6ucKONa/R6SO4rivCxSiqSfcsw== ) ;; Query time: 0 msec ;; SERVER: 192.168.1.254#53(192.168.1.254) ;; WHEN: Thu Dec 12 00:19:55 IST 2019 ;; MSG SIZE rcvd: 183
DNSSEC验证失败的示例
运行以下dig命令:
dig www.dnssec-failed.org dig www.brokendnssec.net +dnssec
; <<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> www.brokendnssec.net +dnssec ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 22087 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;www.brokendnssec.net. IN A ;; Query time: 1378 msec ;; SERVER: 192.168.1.254#53(192.168.1.254) ;; WHEN: Thu Dec 12 00:08:50 IST 2019 ;; MSG SIZE rcvd: 49
上面的dig命令返回了SERVFAIL错误,因为区域数据不正确。
使用dig测试dnssec
我们可以使用dig命令显示DNSSEC信任链。
您所要做的就是将+ trace
选项传递给dig,如下所示:
dig DS {your-domain.} +trace dig DS google.com +trace @8.8.4.4 dig DS google.com +trace @1.1.1.1 dig DS theitroad.local +trace dig DS theitroad.local +trace @8.8.8.8
完整的例子
让我们看看如何从Linux或者Unix/macOS命令行测试DNSSEC的有效性。
首先,从根服务器获取根密钥,运行以下dig命令以及grep命令
dig . DNSKEY | grep -Ev '^($|;)' > keys
使用cat命令查看键:
cat keys
输出示例:
. 49440 IN DNSKEY 256 3 8 AwEAAbPwrxwtOMENWvblQbUFwBllR7ZtXsu9rg/LdyklKs9gU2GQTeOc 59XjhuAPZ4WrT09z6YPL+vzIIJqnG3Hiru7hFUQ4pH0qsLNxrsuZrZYm XAKoVa9SXL1Ap0LygwrIugEk1G4v7Rk/Alt1jLUIE+ZymGtSEhIuGQdX rEmj3ffzXY13H42X4Ja3vJTn/WIQOXY7vwHXGDypSh9j0Tt0hknF1yVJ CrIpfkhFWihMKNdMzMprD4bV+PDLRA5YSn3OPIeUnRn9qBUCN11LXQKb +W3Jg+m/5xQRQJzJ/qXgDh1+aN+Mc9AstP29Y/ZLFmF6cKtL2zoUMN5I 5QymeSkJJzc= . 49440 IN DNSKEY 257 3 8 AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3 +/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kv ArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF 0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+e oZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfd RUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwN R1AkUTV74bU=
最后使用dig进行DNSSEC验证,如下所示:
dig +sigchase +trusted-key=./keys www.theitroad.local. A | more dig +sigchase +trusted-key=./keys www.theitroad.local. A | grep -i validation
最后命令的输出示例:
;; WE HAVE MATERIAL, WE NOW DO VALIDATION ;; WE HAVE MATERIAL, WE NOW DO VALIDATION ;; WE HAVE MATERIAL, WE NOW DO VALIDATION ;; Ok this DNSKEY is a Trusted Key, DNSSEC validation is ok: SUCCESS
我可以请求一个没有DNSSEC签名的域,而应该只给出正常的DNS答案吗?
是的,后备功能是一个功能。
这是apple.com的操作方法
dig www.apple.com +dnssec
输出示例:
<<>> DiG 9.11.5-P4-5.1ubuntu2.1-Ubuntu <<>> www.apple.com +dnssec ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4032 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;www.apple.com. IN A ;; ANSWER SECTION: www.apple.com. 806 IN CNAME www.apple.com.edgekey.net. www.apple.com.edgekey.net. 3592 IN CNAME www.apple.com.edgekey.net.globalredir.akadns.net. www.apple.com.edgekey.net.globalredir.akadns.net. 2182 IN CNAME e6858.dsce9.akamaiedge.net. e6858.dsce9.akamaiedge.net. 20 IN A 23.66.255.148 ;; Query time: 360 msec ;; SERVER: 192.168.1.254#53(192.168.1.254) ;; WHEN: Thu Dec 12 00:24:42 IST 2019 ;; MSG SIZE rcvd: 193