DNS基本工具

使用命令行工具如dig、nslookup进行DNS查询

dig

参考 系统极客

dig 命令可以查询各种类型 DNS 记录信息,包括:主机名称记录(A、AAAA)、邮件交换记录(MX)和别名记录(CNAME)等等。由于其灵活性和易用性,它是系统管理员解决 DNS 问题时最常用的工具。

验证是否安装dig

1
dig -v

dig命令语法

1
dig [server] [name] [type]
  • [server]查询指向的主机名或 IP 地址
  • [name]要查询服务器的 DNS(域名服务器)
  • [type]要检索的 DNS 记录类型。默认情况下(或如果留空),dig 查询 A 记录。

dig命令输出

1
dig www.aliyun.com

dig_output

第一行显示 dig 命令的版本,以及查询的域名;

第二行显示全局选项(默认情况下,仅有 cmd)

HEADER部分显示从被请求机构(DNS 服务器)收到响应的详细技术信息。标题显示由 dig 执行操作的「操作码」和「操作状态」的「标头」,上述示例中的「操作状态」是NOERROR,这意味着被请求的 DNS 服务器可以没有任何阻碍地提供查询。
Flags是回答格式的参考。

OPT PSEUDOSECTION显示高级数据

  • EDNS DNS 的扩展机制
  • Flags 未指定标志时为空
  • UDP UDP 数据包大小

QUESTION部分显示发送的查询数据:

  • 第一列是查询的域名
  • 第二列是查询的类型(IN 表示互联网)
  • 第三列指定了记录类型(如果未指定则默查询 A 记录)

最重要的部分是ANSWER部分:

  • 第一列列出了被查询的服务器名称
  • 第二列是 TTL(存活时间),在此之后记录将被刷新
  • 第三列显示查询的类别 – 在本例中,IN代表互联网
  • 第四列显示查询的类型 – 在本例中,CNAME代表 CNAME(别名)记录,A代表 A(地址)记录
  • 最后一列显示与域名关联的别名和 IP 地址(结果)

最后的STATISTICS统计信息部分显示关于查询的元数据:

  • Query time响应花费的时间
  • SERVER 响应 DNS 服务器的 IP 地址和端口
  • WHEN命令运行的时间戳
  • MSG SIZE rcvd从 DNS 服务器收到的回复大小

指定DNS服务器

默认情况下,如果未指定名称服务器,dig 命令会使用/etc/resolv.conf文件中列出的服务器进行查询。

要指定 DNS 服务器进行查询,可以使用@后跟 DNS 服务器 IP 地址的方式来手动指定 DNS 服务器。

例如,要使用 阿里云 DNS 的233.5.5.5查询www.aliyun.com域名,可以使用如下 命令:

1
dig www.aliyun.com @233.5.5.5

仅输出响应结果

在绝大多数情况下,只使用 dig 查询相应的 DNS 记录,而不需要太多复杂的、不相关的响应和输出。此时就可以使用以下两种方式。

  • 输出简短结果
1
dig www.aliyun.com +short
  • 输出详细响应,先使用+noall参数关闭所有结果,再使用+answer参数打开结果部分。
1
dig www.aliyun.com +noall +answer

使用dig命令查询特定记录类型

  • 查询A记录,要获取域名的所有 IP 地址列表,请使用a参数:
1
dig +nocmd www.aliyun.com a +noall +answer

dig_a

  • 查询CNAME记录
    1
    dig +nocmd www.aliyun.com cname +noall +answer

dig_cname

  • 查询TXT记录,使用txt参数检索特定域的所有「TXT 记录」:
    1
    dig +nocmd aliyun.com txt +noall +answer
    dig_txt
  • 查询MX记录,获取特定域的所有邮件交换记录
    1
    dig +nocmd aliyun.com mx +noall +answer
    dig_mx
  • 查询NS记录,查找特定域的权威名称服务器
    1
    dig +nocmd aliyun.com ns +noall +answer
    dig_ns

使用 dig 命令进行 PTR 反向 DNS 查询

要查询与特定 IP 地址关联的主机名,请使用-x参数。

1
dig -x 208.118.235.148 +noall +answer

dig_ptr

Trace 参数

+trace参数可以列出查询经过的不同 DNS 服务器,直到最终目的地。可以使用此参数来确定流量中断的 IP 地址:

1
dig www.aliyun.com +trace

对域名www.baidu.com A记录的trace查询可以看到根域.,顶级域.com,以及baidu.com的域名权威服务器的地址及其各自的返回结果,这样对于追踪dns解析中的问题有很大的帮助。

dig 命令批量 DNS 查询

如果要对大量域名进行 DNS 查询,可以将其全部写入到一个文本文件中(一行一个),然后使用-f参数,再跟止文件名即可,例如:

1
dig -f domains.txt +short

.digrc 文件

还可通过不同用户的${HOME}/.digrc文件来控制 dig 命令的行为,如果.digrc文件存在于用户的主目录中,则 dig 可以读取其中的参数,而无需用户在执行命令时手动添加。例如,直接在~/.digrc文件中写入+nocmd +noall +answer参数。

nslookup

nslookup代表 名称服务器查找。它是一个命令行工具,用于查询 DNS(域名系统)服务器,以检索有关域名、IP 地址和其他 DNS 记录的信息。通过促进 DNS 查询,nslookup 帮助用户和管理员诊断和解决与 DNS 相关的问题。

作用

  • 验证 DNS 服务器配置。
  • 确认 DNS 记录的存在和配置。
  • 检测 DNS 传播问题。
  • 协助排除与 DNS 相关的连接问题。

与其他 DNS 工具的区别

  • dig(域信息探测器): 提供比 nslookup 更详细和灵活的查询选项。许多网络管理员更喜欢它,因为它的输出更全面。
  • host: 一个更简单的 DNS 查找工具,适合快速查询而无需大量输出。

基本语法

1
nslookup [选项] [主机名] [DNS 服务器]

基本主机名查找

1
nslookup www.aliyun.com

反向 IP 查找

1
nslookup xxx.xxx.xxx.xxx

指定 DNS 服务器

1
nslookup www.aliyun.com 223.5.5.5

设置查询类型

1
nslookup -type=[记录类型] [主机名]
  • 检索A记录

    1
    nslookup -type=A www.aliyun.com
  • 检索MX记录

    1
    nslookup -type=MX aliyun.com
  • 检索CNAME记录

    1
    nslookup -type=CNAME www.aliyun.com

交互模式

  • set type=[记录类型]: 指定要查询的 DNS 记录类型(例如 A、MX、CNAME)。
  • server [DNS 服务器]: 更改会话中用于查询的 DNS 服务器。
  • exit: 退出交互模式。

在脚本中使用 nslookup

nslookup 可以集成到脚本中,以自动化 DNS 查询,实现批处理和 DNS 记录监控。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

# 要查询的域名列表
domains=("example.com" "google.com" "nonexistentdomain.xyz")

# 要使用的 DNS 服务器
dns_server="8.8.8.8"

# 遍历每个域名并执行 A 记录查找
for domain in "${domains[@]}"; do
echo "正在使用 DNS 服务器 $dns_server 查询 $domain 的 A 记录"
nslookup -type=A "$domain" "$dns_server"
echo "----------------------------------------"
done

常见的DNS系统(如:Bind、PowerDNS等)及相关软件特性

Bind

BIND(Berkeley Internet Name Domain)作为一款目前市面是最主流的开源DNS软件,占据了市面上DNS服务器软件的九成,目前由 互联网系统协会 (Internet Systems Consortium) 负责开发和维护。

PowerDNS

PowerDNS(PDNS)成立于20世纪90年代末,是开源DNS软件、服务和支持的主要供应商,它们提供的权威认证DNS服务器和递归认证DNS服务器都是100%开源的软件,同时也和红帽等开源方案提供商一样提供了付费的技术支持版本。同时官方表示为了避免和软件使用者出现竞争,他们只提供服务支持而不提供DNS托管服务。

编程语言中常用的相关库(Go, Java)

Java

DNSJava

Go

https://github.com/miekg/dns

1
go get github.com/miekg/dns