我怎样才能列出所有的DNS记录?

有什么办法可以列出一个域名的所有DNS记录吗?

我知道诸如dig和nslookup之类的东西,但它们只能做到这一步。例如,如果我有一个子域的A记录为

test A somedomain.co.uk

那么,除非我特别要求它,例如。

dig any test.somedomain.co.uk

我看不到它。

有没有什么办法(除了通过进入DNS管理器查看记录外)可以看到所有的DNS记录到底是什么?

解决办法

当你查询ANY时,你会得到一个该级别的所有记录的列表,但不包括下面的记录。

# try this
dig google.com any

如果域名正好是"google.com",这可能返回A记录、TXT记录、NS记录、MX记录等。然而,它不会返回子记录(例如,www.google.com)。更确切地说,如果这些记录存在,你可能会得到它们。如果名称服务器选择不返回这些记录(例如,为了减少响应的大小),它就不一定要返回。

AXFR是一个区域转移,可能是你想要的。然而,这些记录通常是受限制的,除非你控制了该区域,否则无法使用。你通常会直接从权威服务器(下面的@ns1.google.com)进行区域转移,并且经常从一个可能没有公布的名称服务器(隐形名称服务器)进行区域转移。

# This will return "Transfer failed"
dig @ns1.google.com google.com axfr

如果你控制了该区域,你可以将其设置为获得受TSIG密钥保护的传输。这是一个共享的秘密,客户可以将其发送给服务器以授权传输。

评论(6)

在没有能力进行区域转移的情况下,我写了这个小的bash脚本,dg

#!/bin/bash
COMMON_SUBDOMAINS=(www mail smtp pop imap blog en ftp ssh login)
if [[ "$2" == "x" ]]; then
    dig +nocmd "$1" +noall +answer "${3:-any}"
    wild_ips="$(dig +short "*.$1" "${3:-any}" | tr '\n' '|')"
    wild_ips="${wild_ips%|}"
    for sub in "${COMMON_SUBDOMAINS[@]}"; do
        dig +nocmd "$sub.$1" +noall +answer "${3:-any}"
    done | grep -vE "${wild_ips}"
    dig +nocmd "*.$1" +noall +answer "${3:-any}"
else
    dig +nocmd "$1" +noall +answer "${2:-any}"
fi

现在我使用dg example.com来获得一个漂亮的、干净的DNS记录列表,或者使用dg example.com x来包括一堆其他流行的子域。

grep -vE "${wild_ips}"过滤掉可能是通配符DNS记录的记录,如* 10800 IN A 1.38.216.82。否则,通配符条目会使每个`$COMMON_SUBDOMAN'看起来都有记录。

注意:这依赖于 "ANY "查询,这被一些DNS提供商如CloudFlare所阻止

评论(1)

你想要的东西被称为区转移。你可以使用 "dig -t axfr "请求进行区域转移。

一个是一个域名和它下面所有没有委托给其他服务器的域名。

请注意,区域转移并不总是被支持的。它们不用于正常的查询,只用于在服务器之间复制DNS数据;但有其他协议可用于此(如rsync over ssh),暴露名称可能会有安全风险,而且区域转移响应的生成和发送成本比通常的DNS查询更高。

评论(0)