如何列出所有DNS记录?


188

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

我知道诸如dig和nslookup之类的东西,但它们只是走得太远了。例如,如果我有一个子域A记录为

test A somedomain.co.uk

除非我特别要求,例如

dig any test.somedomain.co.uk

我看不到

有什么方法(除了通过转到DNS管理器查看记录之外)以准确地查看所有DNS记录是什么?

Answers:


202

当查询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密钥保护的传输。这是客户端可以发送到服务器以授权传输的共享机密。


4
谢谢(也感谢deltab)。非常清楚的解释,确认了我所怀疑的内容-可用,但对我而言不可用(除非我开始设置自己的名称服务器)。当我照顾很多域时,仅运行脚本以获取所有DNS条目就好了。
肯(Ken)

13
当我尝试此操作时,亚马逊的Route53名称服务器不包括TXT,MX和SOA。在我特别查询了这些记录之后,它们被包含在任何答案中。所以把它和一粒盐一起吃。
彼得

我刚刚收到“连接被拒绝”的
通知

1
解析器从未就ANY的含义对规范进行过一致的解释。绝对不是全部(有一个要求),尽管有些(不是很多)是这样处理的。其他人只是转储其缓存,而其他人则将其限制为某些记录类型。在现代(2016年以上)中,大多数提供商已禁用ANY(或给它一个无用的答案)或已计划这样做,因为它是许多放大攻击的常见驱动程序。
尼克·巴斯汀

1
@NickBastin 目前正在研究中的这份草稿(tools.ietf.org/html/draft-ietf-dnsop-refuse-any-06)试图加强这种查询类型的答复模式。它还讨论了为什么/不应该使用它。
Patrick Mevzek '18

29

我已经改善了乔什的答案。我注意到,它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

添加行dig -t txt +nocmd $NS "$DOM" +noall +answer(并修改$DOM)以检查域的TXT记录。
Max

19

在没有进行区域传输的能力的情况下,我编写了这个小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)阻止了查询。


3
我知道这种解决方案远非理想,但它为我节省了很多时间,因此希望对其他人有用。
Zaz 2014年

添加dig -t txt +nocmd "$1" +noall +answer(并修改"*.$1"等)以检查域的TXT记录。
Max

15

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.

11
这不能回答问题,即如何在域的DNS区域中查找其他记录,即,另外查找子域的所有记录。这并不是说它host -a不是有用的命令,它只是没有执行OP所需的操作。
spikyjt 2015年


12

对于Windows:

您可能发现需要检查域DNS记录的状态,或者检查“名称服务器”以查看服务器要提取的记录。

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

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

  3. 键入您要查找的DNS记录类型,方法是键入set type=####是记录类型,然后按Enter。您可以使用ANY,A,AAAA,A + AAAA,CNAME,MX,NS,PTR,SOA或SRV作为记录类型。

  4. 现在输入您要查询的域名,然后按Enter。在此示例中,我们将使用Managed.com。

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

  6. 您还可以更改要查询的名称服务器。如果要在DNS完全传播之前检查记录,这将很有用。要更改名称服务器,请键入服务器[名称服务器]。用您要使用的名称服务器替换[名称服务器]。在此示例中,我们将其设置为NSA.managed.com。

  7. 更改后,根据需要更改查询类型(步骤3),然后输入新的新域(步骤4)。

对于Linux:

1)使用Dig命令检查DNS记录Dig代表域信息groper是用于查询DNS名称服务器的灵活工具。它执行DNS查找,并显示从查询的名称服务器返回的答案。大多数DNS管理员使用dig来解决DNS问题,因为它具有灵活性,易用性和输出清晰性。其他查找工具的功能往往比挖掘少。

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

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

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

3)使用主机命令检查DNS记录host是用于执行DNS查找的简单实用程序。通常用于将名称转换为IP地址,反之亦然。如果未提供任何参数或选项,主机将打印其命令行参数和选项的简短摘要。


这在Windows 7中非常适合我,但在Windows 10中似乎有问题,这就是我用来调试Windows 10中的TXT记录的方法:nslookup -querytype = txt yourdomainnamehere.com
编码器

11

您想要的就是区域传输。您可以使用来请求区域转移dig -t axfr

是一个域,下面的所有域未委派到另一台服务器。

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


1

没有一个简单的方法可以在一个实例中获取域的所有DNS记录。例如,您只能查看某些记录,如果您想查看某个域的A记录,则可以使用以下命令:dig a(记录类型)domain.com。您想在该域中看到的所有其他类型的记录都相同。

如果您不熟悉命令行界面,则也可以使用mxtoolbox.com之类的网站。Wich是获取域记录的非常方便的工具。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.