网络与 IP

DNS 测试怎么做?nslookup、dig 与在线 DNS 查询工具的用法

DNS 测试就是向指定的 DNS 服务器发出查询,看三件事:返回的记录对不对、花了多长时间、各地结果是否一致。本机用 nslookup 或 dig 测记录和响应时间,用 dig +trace 和直接询问权威服务器确认源头;全国各地的生效情况,用在线 DNS 查询工具的多地解析结果来看。

作者 顶联产品团队发布于 7 分钟阅读

DNS 测试怎么做?向一台指定的 DNS 服务器发出查询,检查三件事:返回的记录对不对、响应要多长时间、各地拿到的结果是否一致。命令行工具有两个:Windows 自带的 nslookup(Linux、macOS 也有),以及输出更完整的 dig(RHEL 系在 bind-utils 软件包里,Debian 系在 dnsutils 里)。测记录要问域名的权威服务器,测访客看到的结果要问递归服务器,测全国生效情况则要借助在线 DNS 查询工具的多地探测点。先弄清楚自己要回答哪个问题,再选工具和询问对象,测试结果才有意义。

DNS 测试先分清测什么

要回答的问题 测什么 问谁 用什么
解析记录加对了没有 记录的内容和设置的 TTL 域名的权威服务器 dig @权威服务器 +norec、nslookup 指定服务器
访客现在拿到的是什么 缓存里的结果和剩余 TTL 本机 DNS、公共 DNS、各地运营商 DNS dig、nslookup、在线多地查询
这台 DNS 服务器好不好用 能否应答、响应时间、有无超时 被测的那台服务器 dig 的 Query time、连续查询统计
解析链条哪一环出了问题 根、域名后缀(如 .com)、权威各级的委派与应答 从根开始逐级询问 dig +trace
全国各地是否已经生效 多地区、多运营商的结果 各地的递归服务器 在线 DNS 查询工具

常说的“DNS 测试入口”,一类是命令行工具,另一类是站长工具类网站里的“DNS 查询”“多地 DNS 解析”“DNS 检测”功能,在搜索引擎里用这几个词就能找到。两者互补:命令行能精确控制问谁、问什么,在线工具能一次看到几十个地区和运营商的结果。

nslookup 命令常用用法

nslookup www.example.com                                 # 用本机配置的 DNS 查询
nslookup www.example.com 223.5.5.5                       # 指定 DNS 服务器
nslookup -type=AAAA www.example.com 223.5.5.5            # 指定记录类型:A、AAAA、CNAME、MX、NS、TXT、SOA
nslookup -type=NS example.com                            # 查这个域名的权威服务器
nslookup 203.0.113.10                                    # 参数是 IP 时做反向解析(PTR)
nslookup -vc www.example.com 223.5.5.5                   # 改用 TCP 查询,测 TCP 53 是否通
nslookup -timeout=3 -retry=1 www.example.com 223.5.5.5   # 缩短等待,快速判断服务器是否应答
nslookup -debug www.example.com                          # 显示完整的请求与应答,包括 TTL

Windows 上查一个使用了 CDN 的域名,输出类似这样:

服务器:  public1.alidns.com
Address:  223.5.5.5

非权威应答:
名称:    www.example.com.cdn-example.net
Addresses:  198.51.100.20
          198.51.100.21
Aliases:  www.example.com

“服务器”一行是这台 DNS 反向解析出的名字,查不到时显示 UnKnown,不影响结果。“名称”是 CNAME 链最终指向的名字,“Aliases”列出你查询的原始名字,说明这个域名是通过 CNAME 接入 CDN 的。“非权威应答”表示结果来自递归服务器,不是权威服务器亲自回答。

需要连续换着服务器、换着类型查时,用交互模式更方便:

nslookup
> server 119.29.29.29
> set type=mx
> example.com
> set norecurse
> set debug
> exit

用 nslookup 测试要注意两个细节:

  • Windows 版会拼接 DNS 后缀。名字末尾没有点时,nslookup 会先把网卡的 DNS 后缀(如公司域名)拼上去查询,加入了域的电脑上用 -debug 能看到它先查了 www.example.com.corp.example 之类的名字。在末尾加一个点,写成 www.example.com.,就只查这一个名字。
  • nslookup 不走系统的解析流程。它直接给 DNS 服务器发包,不读 hosts 文件,也不用系统缓存。浏览器打不开而 nslookup 正常时,Windows 用 Resolve-DnsName www.example.com、Linux 用 getent hosts www.example.com 走一遍系统流程对比。

dig 命令常用参数

参数 作用 例子
@服务器 指定询问的 DNS dig @119.29.29.29 www.example.com
记录类型 写在域名后面:A、AAAA、CNAME、MX、NS、TXT、SOA、CAA dig example.com MX
+short 只输出结果 dig +short www.example.com
+noall +answer 只看应答段,保留名字、TTL 和类型 dig www.example.com +noall +answer
+identify 配合 +short,同时显示哪台服务器、用了多少毫秒 dig +short +identify www.example.com @223.5.5.5
+norec 不请求递归,询问权威服务器时使用 dig @ns1.example.net www.example.com +norec
+trace 从根服务器开始逐级查询 dig www.example.com +trace
+nssearch 向每台权威服务器查 SOA,对比序列号和响应时间 dig example.com +nssearch
+tcp 用 TCP 查询 dig +tcp @223.5.5.5 www.example.com
+time= +tries= 单次等待秒数与尝试次数 dig +time=2 +tries=1 www.example.com
-4、-6 只通过 IPv4 或 IPv6 发送查询 dig -6 @2400:3200::1 www.example.com
-x 反向解析 dig -x 203.0.113.10 +short
-f 文件 批量查询文件里的每一行 dig -f names.txt +noall +answer
+subnet= 在查询里携带客户端子网(ECS),模拟另一个地区的用户 dig @ns1.example.net www.example.com +subnet=198.51.100.0/24

看响应时间:Query time 怎么读

dig 完整输出的末尾有一行 ;; Query time: 28 msec,是从发出查询到收到这台服务器应答的时间。用 +short +identify 可以把它和结果放在同一行,适合连续观察:

for i in $(seq 20); do dig +short +identify +time=2 +tries=1 www.example.com @223.5.5.5 || echo timeout; done
# 203.0.113.10 from server 223.5.5.5 in 9 ms.
现象 说明
第一次几十到几百毫秒,紧接着再查降到个位数 正常,第二次命中了递归服务器的缓存
每次都要几百毫秒,而 ping 这台 DNS 只有十几毫秒 递归服务器每次都要去权威服务器取数据(TTL 设得很短),或权威服务器本身慢,用 +trace 看是哪一级
20 次里出现几次 timeout 到这台 DNS 的路径丢包,或服务器在限速;对访客来说,一次超时就意味着那次解析要等系统解析器超时重试,多花 1 秒到几秒

+trace 与 +nssearch:断在哪一级、权威服务器是否一致

+trace 只在第一步向本机配置的 DNS 取根服务器列表,之后不经过递归服务器的缓存,从根开始逐级询问,每一级后面的 Received ... in N ms 就是这一级的响应时间:

.                      518400  IN  NS  a.root-servers.net.
;; Received 239 bytes from 223.5.5.5#53(223.5.5.5) in 12 ms

com.                   172800  IN  NS  a.gtld-servers.net.
;; Received 1170 bytes from 198.41.0.4#53(a.root-servers.net) in 156 ms

example.com.           172800  IN  NS  ns1.example.net.
;; Received 656 bytes from 192.5.6.30#53(a.gtld-servers.net) in 210 ms

www.example.com.       600     IN  A   203.0.113.10
;; Received 60 bytes from 192.0.2.53#53(ns1.example.net) in 35 ms

第三段是 .com 的服务器告诉你“这个域名由谁负责”,在注册商处改了 NS 之后,看这一段就知道 .com 这一级是否已经更新;最后一段是权威服务器给出的当前记录。哪一段超时或报错,问题就在哪一级。

一个域名通常有两台以上权威服务器,它们之间不同步时,有的访客拿到新记录、有的拿到旧记录,而且时好时坏。+nssearch 一次问遍所有权威服务器:

SOA ns1.example.net. hostmaster.example.com. 2026122302 3600 600 1209600 300 from server 192.0.2.53 in 35 ms.
SOA ns1.example.net. hostmaster.example.com. 2026122301 3600 600 1209600 300 from server 198.51.100.53 in 41 ms.

两台的序列号不同(2026122302 与 2026122301),说明第二台还没有同步最近一次修改。使用解析服务商时这种情况少见;自建主从 DNS 时,常见原因是从服务器无法从主服务器传输区域数据(被防火墙或传输权限拦截),或还没到刷新时间。反过来,主服务器改了记录却忘了增大序列号时,从服务器不会去同步,两台的序列号相同、内容却不同,+nssearch 看不出来,要逐台查记录对比。

在线 DNS 查询工具:多地解析结果怎么看

在线工具在各省、各运营商以及海外部署了探测点,每个探测点用当地的递归服务器查询你的域名,再把结果汇总成一张表,常见的列有:检测点(地区和运营商)、解析结果、IP 归属地、TTL、响应时间。按下面的顺序读:

  1. 先看解析结果是不是你设置的值。设置了按运营商或地区解析的域名,按线路分组看:电信的探测点应当拿到电信线路的记录,联通、移动同理。
  2. 再看 TTL 列。它是那台递归服务器缓存里剩余的秒数。拿到旧地址、剩余 TTL 还很大,说明这个缓存要过一阵才会过期;TTL 接近你设置的值,说明它刚刚从权威服务器取回了数据。
  3. 看 IP 归属地。用了 CDN 时各地结果不同是正常的,只要都属于 CDN 的节点;某个探测点返回了一个和你的服务器、CDN 都无关的地址,要怀疑解析配置错误或被劫持。
  4. 看失败的探测点。个别探测点超时,多半是探测点自己的网络问题;同一运营商的多个探测点同时失败才值得关注;全部失败,回到 +trace 检查 NS 委派和权威服务器。
  5. 响应时间只做横向参考。它包含探测点到递归服务器的往返和递归查询时间,和你自己访问时的体验不能直接对应。

所谓“DNS 生效”,本质是各地递归服务器的缓存过期后重新取到了新值,并没有一个主动推送的过程。修改记录后,最长要等旧记录的 TTL 到期,少数不遵守 TTL 的缓存会更久。在线工具也有局限:它代表的是探测点所用的 DNS,不代表你的电脑和你的用户(很多用户改用了公共 DNS);结果只是查询那一刻的快照;内网域名和只在内网生效的解析,它查不到。

域名解析到服务器后:A、AAAA、CNAME 怎么验证

把域名指向新服务器,按下面五步验证,前一步通过再做下一步:

  1. 权威服务器上的记录对不对:
dig @ns1.example.net www.example.com A +norec +noall +answer
dig @ns1.example.net www.example.com AAAA +norec +noall +answer
  1. CNAME 链是否完整。接入 CDN 的域名,应答里会依次出现 CNAME 和最终的 A 记录,两级的 TTL 各自独立:
www.example.com.                  600  IN  CNAME  www.example.com.cdn-example.net.
www.example.com.cdn-example.net.   60  IN  A      198.51.100.20

只有 CNAME、没有后面的 A 记录,同时 status 显示 NXDOMAIN,说明 CNAME 指向的名字查不到,通常是 CDN 一侧的加速域名还没配置好。

  1. 加了 AAAA 记录,就要确认服务器真的能经 IPv6 访问。从一台有 IPv6 的机器执行 curl -6 -sI https://www.example.com/。AAAA 指向的地址不通,有 IPv6 的访客会出现打不开或者先卡一下再打开的情况。
  2. 改解析之前,先直接测新服务器。--resolve 让 curl 把域名临时指向指定 IP,证书、站点绑定、跳转都能提前验证,不影响任何访客:
curl -sI --resolve www.example.com:443:203.0.113.10 https://www.example.com/
  1. 改完之后,确认实际连到的是哪个 IP:
curl -s -o /dev/null -w '%{remote_ip}\n' https://www.example.com/

全国解析不一致怎么排查

现象 可能原因 怎么确认
部分地区仍是旧 IP 这些地区的递归服务器缓存还没过期 在线工具看这些探测点的剩余 TTL;直接问权威服务器得到的是新值
同一地区的结果在新旧之间来回跳 权威服务器之间不同步 dig +nssearch 对比 SOA 序列号,再逐台 dig @每台权威 +norec
电信、联通、移动拿到不同的 IP 设置了按线路解析;或某条线路漏加了记录,多数解析服务商会让它落到“默认”线路 在解析后台逐条核对各线路的记录
各地 IP 不同,但都属于 CDN CDN 按地区和运营商调度,正常 查 IP 归属
个别地区拿到陌生 IP,或不存在的子域名也能解析出地址 解析配置错误、运营商改写或劫持 与权威服务器的结果对比;用一个肯定不存在的子域名测试
刚加的记录,有的地方查不到 添加之前有人查过,“不存在”的结果被缓存 查 SOA 记录:否定结果的缓存时间取 SOA 最后一个字段与 SOA 记录本身 TTL 中较小的一个
只有自己的电脑不一样 hosts 文件、系统或浏览器缓存、代理软件 用 Resolve-DnsName 或 getent hosts 与 nslookup 的结果对比

按线路解析的域名,可以用 +subnet 模拟某个地区的用户,直接向权威服务器提问:

dig @ns1.example.net www.example.com +subnet=198.51.100.0/24 +noall +answer

把 198.51.100.0/24 换成目标地区、目标运营商的一个用户网段。这要求权威服务器支持 ECS(EDNS Client Subnet);不支持时它会忽略这个参数,按发起查询的地址来判断线路,测出来的就只是你自己所在线路的结果。

在管理系统里怎么落地

多地测试里出现一个陌生 IP,第一个要回答的问题是:它是不是我们的?Toplink DCIM 的 IP 地址管理 登记了机房的每个地址段,以及每个地址分配给了哪台服务器,查一下就知道这个 IP 是否属于机房、在哪台机器上;不在任何登记的地址段里,就按解析配置错误或劫持去查。客户迁移服务器、更换 IP 之后反映“部分地区打不开”,也可以先核对解析结果里的地址是不是系统里分配给他的那一个,有些“解析没生效”,其实是记录里填成了旧地址或别人的地址。

常见问题

怎么清除本机的 DNS 缓存?

Windows 执行 ipconfig /flushdns;macOS 执行 sudo dscacheutil -flushcache 和 sudo killall -HUP mDNSResponder;使用 systemd-resolved 的 Linux 执行 resolvectl flush-caches。浏览器还有自己的缓存,Chrome 可以在 chrome://net-internals/#dns 页面清除,或者直接重启浏览器。

Windows 上没有 dig,用什么代替?

PowerShell 自带的 Resolve-DnsName 可以指定服务器和记录类型,例如 Resolve-DnsName www.example.com -Type AAAA -Server 223.5.5.5;加 -DnsOnly 只走 DNS 协议,加 -NoHostsFile 不读 hosts 文件。需要 +trace 这类功能时,可以在 WSL 或一台 Linux 服务器上用 dig。

做 DNS 测试会影响线上解析吗?

普通查询只是读取,不会改变任何记录,也不影响别人。但不要对别人的 DNS 服务器高频批量查询,可能被当作攻击而限速或封禁;要对自己的权威服务器做压力测试,先和解析服务商确认。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88