如何列出所有DNS记录?

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

我知道像dig和nslookup这样的东西,但它们只能到此为止。例如,如果我有一个子域a记录为

test A somedomain.co.uk

除非我特别提出要求。

dig any test.somedomain.co.uk

我看不见。

有什么方法(除了通过到DNS管理器查看记录)来确切地查看所有DNS记录是什么?

569601 次浏览

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

是一个域,它下面的所有域都没有委托给另一个服务器。

注意,并不总是支持区域传输。它们不用于正常的查找,只用于在服务器之间复制DNS数据;但是有其他协议可以用于此目的(例如ssh上的rsync),暴露名称可能存在安全风险,并且区域传输响应生成和发送的成本比通常的DNS查找要高。

简单地说,这通常是不可能的,除非你控制了这个领域。

选项1:ANY查询

当您查询ANY时,您将得到该级别的所有记录的列表,但不低于该级别。

# try this
dig google.com any

这可能会返回A记录,TXT记录,NS记录,MX记录等,如果域名是"google.com"。但是,它不会返回子记录(例如,www.google.com)。更准确地说,如果这些记录存在,您可能会得到它们。

如果名称服务器选择不返回这些记录(例如,为了减少响应的大小),则不必返回这些记录。大多数DNS服务器拒绝任何查询。

选项2:AXFR查询

AXFR是一种区域传输,可能是您想要的。但是,这些通常是受限的,除非您控制了该区域,否则不可用。您通常会直接从权威服务器(下面的@ns1.google.com)和可能不会发布的名称服务器(隐形名称服务器)执行区域传输。

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

如果您可以控制该区域,则可以对其进行设置,以获得受TSIG密钥保护的传输。这是客户端可以发送给服务器以授权传输的共享秘密。

选项3:用脚本刮

另一种选择是使用脚本抓取所有DNS记录。您必须遍历所有DNS记录类型,还必须遍历公共子域,具体取决于您的需要。

选项4:使用专门的工具

有一些在线工具可以枚举子域,还有一些在线工具列出所有DNS记录用于DNS名称。注意,子域枚举通常不是详尽的。

在没有区域传输功能的情况下,我写了这个小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. 区域传输是确保您拥有所有子域记录的唯一方法。如果DNS配置正确,则通常不能执行外部区域传输。

  2. 扫描。>项目有一个DNS记录数据库,可以下载和搜索子域。这需要下载87GB的DNS数据,或者您可以尝试在https://hackertarget.com/find-dns-host-records/上在线搜索数据

host -a工作良好,类似于dig any

例如:

$ host -a google.com
Trying "google.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10403
;; flags: qr rd ra; QUERY: 1, ANSWER: 18, AUTHORITY: 0, ADDITIONAL: 0




;; QUESTION SECTION:
;google.com.            IN  ANY


;; ANSWER SECTION:
google.com.     1165    IN  TXT "v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all"
google.com.     53965   IN  SOA ns1.google.com. dns-admin.google.com. 2014112500 7200 1800 1209600 300
google.com.     231 IN  A   173.194.115.73
google.com.     231 IN  A   173.194.115.78
google.com.     231 IN  A   173.194.115.64
google.com.     231 IN  A   173.194.115.65
google.com.     231 IN  A   173.194.115.66
google.com.     231 IN  A   173.194.115.67
google.com.     231 IN  A   173.194.115.68
google.com.     231 IN  A   173.194.115.69
google.com.     231 IN  A   173.194.115.70
google.com.     231 IN  A   173.194.115.71
google.com.     231 IN  A   173.194.115.72
google.com.     128 IN  AAAA    2607:f8b0:4000:809::1001
google.com.     40766   IN  NS  ns3.google.com.
google.com.     40766   IN  NS  ns4.google.com.
google.com.     40766   IN  NS  ns1.google.com.
google.com.     40766   IN  NS  ns2.google.com.

我改进了杰克的答案。我注意到dig只显示已经存在于查询的名称服务器缓存中的条目,所以最好从SOA中提取一个权威的名称服务器(而不是依赖于默认的名称服务器)。我还禁用了通配符ip的过滤,因为我通常对设置的正确性更感兴趣。

新脚本接受一个-x参数用于扩展输出,并接受一个-s NS参数来选择特定的命名服务器:dig -x example.com

#!/bin/bash
set -e; set -u
COMMON_SUBDOMAINS="www mail mx a.mx smtp pop imap blog en ftp ssh login"
EXTENDED=""


while :; do case "$1" in
--) shift; break ;;
-x) EXTENDED=y; shift ;;
-s) NS="$2"; shift 2 ;;
*) break ;;
esac; done
DOM="$1"; shift
TYPE="${1:-any}"


test "${NS:-}" || NS=$(dig +short  SOA "$DOM" | awk '{print $1}')
test "$NS" && NS="@$NS"


if test "$EXTENDED"; then
dig +nocmd $NS "$DOM" +noall +answer "$TYPE"
wild_ips=$(dig +short "$NS" "*.$DOM" "$TYPE" | tr '\n' '|')
wild_ips="${wild_ips%|}"
for sub in $COMMON_SUBDOMAINS; do
dig +nocmd $NS "$sub.$DOM" +noall +answer "$TYPE"
done | cat  #grep -vE "${wild_ips}"
dig +nocmd $NS "*.$DOM" +noall +answer "$TYPE"
else
dig +nocmd $NS "$DOM" +noall +answer "$TYPE"
fi
在一个实例中获取一个域的所有DNS记录是不容易的。 你只能查看某些记录,例如,如果你想查看某个域的A记录,你可以使用命令:dig A (type of record) domain.com。这对于您想要查看该域的所有其他类型的记录都是一样的。< / p >

如果你不熟悉命令行界面,你也可以使用像mxtoolbox.com这样的网站。Wich是非常方便的工具,以获得一个领域的记录。

我希望这能回答你的问题。

Windows:

您可能会发现需要检查您的域名DNS记录的状态,或检查名称服务器,以查看服务器正在拉动哪些记录。

  1. 通过导航到“开始>命令提示符”或通过“运行> CMD”启动Windows命令提示符。

  2. 输入NSLOOKUP并按Enter。默认服务器设置为您的本地DNS,地址将是您的本地IP。

  3. 通过键入set type=##来设置您希望查找的DNS记录类型,其中##是记录类型,然后按Enter。您可以使用ANY, A, AAAA, A+AAAA, CNAME, MX, NS, PTR, SOA或SRV作为记录类型。

  4. 现在输入你想查询的域名,然后按enter ..在本例中,我们将使用Managed.com。

  5. NSLOOKUP现在将返回您输入的域的记录条目。

  6. 您还可以更改您正在查询的名称服务器。如果要在DNS完全传播之前检查记录,这很有用。修改名称服务器类型为服务器[Name Server]。将[name server]替换为您希望使用的名称服务器。在本例中,我们将这些设置为NSA.managed.com。

  7. 一旦更改,如果需要更改查询类型(步骤3),然后输入new一个新域(步骤4)。

Linux:

1)使用Dig命令查看DNS记录 Dig是域名信息探勘器(domain information groper)的缩写,是一种用于查询DNS名称服务器的灵活工具。它执行DNS查找并显示从所查询的名称服务器返回的答案。大多数DNS管理员使用dig来排除DNS问题,因为它的灵活性、易用性和输出的清晰度。其他查找工具的功能往往不如dig

2)使用NSlookup命令查看DNS记录 Nslookup是一个用于查询Internet域名服务器的程序。Nslookup有交互和非交互两种模式

交互式模式允许用户查询名称服务器,以获取各种主机和域的信息,或打印某个域中的主机列表。

非交互模式用于仅打印主机或域的名称和请求信息。这是网络管理工具,将帮助他们检查和排除DNS相关问题。

3)使用主机命令查看DNS记录 host是一个用于执行DNS查找的简单实用程序。它通常用于将名称转换为IP地址,反之亦然。当没有给出参数或选项时,host打印其命令行参数和选项的简短摘要

许多DNS服务器拒绝“任何”查询。所以唯一的方法是单独查询每种类型。幸运的是,有些网站可以让这变得更简单。例如,https://www.nslookup.io默认显示最流行的记录类型,并支持所有现有的记录类型。

dig @8.8.8.8 example.domain any

将列出所有DNS记录。这里8.8.8.8是谷歌的DNS。