DNS 测试怎么做?nslookup、dig 与在线 DNS 查询工具的用法
DNS 测试就是向指定的 DNS 服务器发出查询,看三件事:返回的记录对不对、花了多长时间、各地结果是否一致。本机用 nslookup 或 dig 测记录和响应时间,用 dig +trace 和直接询问权威服务器确认源头;全国各地的生效情况,用在线 DNS 查询工具的多地解析结果来看。
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、响应时间。按下面的顺序读:
- 先看解析结果是不是你设置的值。设置了按运营商或地区解析的域名,按线路分组看:电信的探测点应当拿到电信线路的记录,联通、移动同理。
- 再看 TTL 列。它是那台递归服务器缓存里剩余的秒数。拿到旧地址、剩余 TTL 还很大,说明这个缓存要过一阵才会过期;TTL 接近你设置的值,说明它刚刚从权威服务器取回了数据。
- 看 IP 归属地。用了 CDN 时各地结果不同是正常的,只要都属于 CDN 的节点;某个探测点返回了一个和你的服务器、CDN 都无关的地址,要怀疑解析配置错误或被劫持。
- 看失败的探测点。个别探测点超时,多半是探测点自己的网络问题;同一运营商的多个探测点同时失败才值得关注;全部失败,回到
+trace检查 NS 委派和权威服务器。 - 响应时间只做横向参考。它包含探测点到递归服务器的往返和递归查询时间,和你自己访问时的体验不能直接对应。
所谓“DNS 生效”,本质是各地递归服务器的缓存过期后重新取到了新值,并没有一个主动推送的过程。修改记录后,最长要等旧记录的 TTL 到期,少数不遵守 TTL 的缓存会更久。在线工具也有局限:它代表的是探测点所用的 DNS,不代表你的电脑和你的用户(很多用户改用了公共 DNS);结果只是查询那一刻的快照;内网域名和只在内网生效的解析,它查不到。
域名解析到服务器后:A、AAAA、CNAME 怎么验证
把域名指向新服务器,按下面五步验证,前一步通过再做下一步:
- 权威服务器上的记录对不对:
dig @ns1.example.net www.example.com A +norec +noall +answer
dig @ns1.example.net www.example.com AAAA +norec +noall +answer
- 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 一侧的加速域名还没配置好。
- 加了 AAAA 记录,就要确认服务器真的能经 IPv6 访问。从一台有 IPv6 的机器执行
curl -6 -sI https://www.example.com/。AAAA 指向的地址不通,有 IPv6 的访客会出现打不开或者先卡一下再打开的情况。 - 改解析之前,先直接测新服务器。
--resolve让 curl 把域名临时指向指定 IP,证书、站点绑定、跳转都能提前验证,不影响任何访客:
curl -sI --resolve www.example.com:443:203.0.113.10 https://www.example.com/
- 改完之后,确认实际连到的是哪个 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 服务器高频批量查询,可能被当作攻击而限速或封禁;要对自己的权威服务器做压力测试,先和解析服务商确认。