nslookup 命令详解与参数实测(Ubuntu 22.04)
实测 Ubuntu 22.04 的 nslookup:Server 头与 Non-authoritative answer 解读、指定 DNS、-type= 各记录类型、IP 反查 PTR、交互模式、-timeout 与 -port、NXDOMAIN 与超时的退出码、-debug 揭示 A+AAAA 双查询、直查权威对账、/etc/hosts 对照及与 dig 的差异。
nslookup 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 nslookup 的每一个常用参数——默认查询的 Server 头与 Non-authoritative answer 解读、指定 DNS 服务器、-type= 各记录类型(a/cname/mx/ns/txt/soa/aaaa)、IP 反查、交互模式、-timeout 超时、-port 端口、NXDOMAIN 与超时的退出码、-debug 细节、直查权威服务器、/etc/hosts 对照,全部命令与回显已在 Ubuntu 22.04(nslookup 9.18.39)实测通过。
一、环境信息
本章记录实测环境的操作系统、内核、工具版本与 DNS 基线,保证文中所有回显可追溯、可复现。以下信息均在实测机上真实采集。
- 操作系统:Ubuntu 22.04.5 LTS(取自
/etc/os-release,实测见下) - 内核版本:6.8.0-138-generic(
uname -r实测) - 硬件架构:x86_64(
uname -m实测) - 本机主机名 / 地址:f1034b9326b2 / 172.17.0.2(实测见下)
- 默认 DNS 服务器:192.168.146.2(
grep nameserver /etc/resolv.conf实测;所有未指定服务器的查询均发往它,输出首部Server:行可印证) - 外部公共 DNS:223.5.5.5(阿里)与 8.8.8.8(Google),实测均可达(见 3.2)
- 工具版本:nslookup 9.18.39-0ubuntu0.22.04.7-Ubuntu(
nslookup -version实测,见 2.3;软件包bind9-dnsutils 1:9.18.39-0ubuntu0.22.04.7) - 演示数据目录:/root/demo/nslookup/(存放 /etc/hosts 演示的备份文件 hosts.bak,见 3.13)
环境基线采集命令与实测回显:
head -2 /etc/os-release; hostname; hostname -I
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
f1034b9326b2
172.17.0.2
uname -r; uname -m
6.8.0-138-generic
x86_64
grep nameserver /etc/resolv.conf
nameserver 192.168.146.2
dpkg -l bind9-dnsutils | tail -1
ii bind9-dnsutils 1:9.18.39-0ubuntu0.22.04.7 amd64 Clients provided with BIND 9
💡 说明:nslookup 与 dig、host 同属 bind9-dnsutils 软件包(BIND 9 客户端工具集),Ubuntu 22.04 默认未预装,安装命令为
apt install dnsutils。三者查询同一套系统 DNS,但输出风格与退出码语义差别不小(对照见 3.10 与第五章)。
二、命令概览
2.1 语法与测试数据
nslookup 是最"人类友好"的 DNS 查询工具:默认输出就两块——被询问的服务器(Server:/Address: 头部)和人类可读的答案(Name:/Address: 列表)。它支持非交互(一条命令带参数)与交互(直接运行进入 > 提示符)两种用法,选项用单破折号 -type= 风格,与 dig 的 +short 风格不同。
官方语法(摘自 man 手册 SYNOPSIS,nslookup 无命令行帮助选项,见 2.2):
nslookup [-option] [name | -] [server]
三个书写要点:
-option主要是-type=记录类型、-timeout=秒数、-port=端口号、-debug,单破折号风格,多数可连写多个;name是要查的名字;裸 IP 会自动走反向查询(等价查 PTR,见 3.6);server写在最后,指定本次查询的 DNS 服务器;省略则读/etc/resolv.conf。
本文测试数据约定:
- 默认查询
www.baidu.com(答案为 CNAME + 多条地址,且能看到 nslookup 特有的双栈行为); - 指定服务器演示覆盖本地 DNS(192.168.146.2)与两个公共 DNS(223.5.5.5 / 8.8.8.8);
- 交互模式演示用管道喂入
server/set type指令(无终端环境下的标准做法,见 3.7); - /etc/hosts 演示采用"追加条目 → 对照实测 → 删除条目 → diff 核验还原"流程(见 3.13)。
参数速查表(每项实测值均来自第三章):
| 参数/用法 | 语义 | 本机实测 |
|---|---|---|
nslookup <域名> | 默认查询(A + AAAA 双查询) | 头部 Server 行 + Non-authoritative answer + 6 行答案(3.1) |
nslookup <域名> <server> | 指定 DNS 服务器 | 8.8.8.8 返回了不同的 CNAME 链(3.2) |
-type=a / -type=cname | 指定记录类型 | A 只给 v4;CNAME 只给别名行(3.3) |
-type=mx / -type=ns | 邮件/权威记录 | NS 查询附 NS 地址清单(glue)(3.4) |
-type=txt/soa/aaaa | 其他常用类型 | SOA 多行展开 origin/serial 等(3.5) |
nslookup <IP> | 反向查询 PTR | 8.8.8.8 → dns.google.(3.6) |
交互模式(server/set type=) | 连续查询 | Default server 切换 + NS 查询(3.7) |
-timeout=2 | 限定每次尝试的超时 | 超时 3 次后 no servers could be reached,rc=1(3.8) |
-port=53 / -port=5353 | 指定服务器端口 | 无服务端口 connection refused,rc=1(3.9) |
| 查不存在域名 | NXDOMAIN 形态 | ** server can't find + 域名,rc=1(3.10) |
-debug | 显示报文级细节 | 暴露默认行为是 A+AAAA 两条查询、含 TTL(3.11) |
nslookup <域名> <权威NS> | 直查权威 | 无 "Non-authoritative" 字样(3.12) |
关键差异:-type= 决定查什么记录;server 位置参数决定问谁;-debug 只加显示细节不改查询内容;失败类输出(NXDOMAIN/超时)统一 rc=1,比 dig 的"NXDOMAIN 也算成功"更适合脚本(见 3.10 与第五章 Q3)。
💡 技术拓展:Linux 下的 DNS 查询工具不止 nslookup 一种,常用四件套横向对比——
工具 提供来源 特点 适用场景 nslookup bind9-dnsutils 包 人类可读双段输出(Server 头 + 答案)、支持交互模式、失败 rc=1 人工快速核对、多轮连查 dig bind9-dnsutils 包 分节输出(QUESTION/ANSWER)、 +short取值干净、+trace可追根精确查询与脚本取值 host bind9-dnsutils 包 单行精简输出 一眼看答案 resolvectl systemd-resolved(Ubuntu 22.04 默认) 走本地 stub 解析器,可看缓存与按链路 DNS 配置 排查系统解析链路 本文主角取 nslookup,取其「交互模式 + 人类友好 + 失败即 rc=1」之长;纯脚本取值更推荐 dig,系统级解析排查用
resolvectl query。
2.2 帮助形态实测(没有 -h)
nslookup 没有命令行帮助选项——这是它与 dig 的直观差别之一。实测三种求助途径的行为:
nslookup -h; echo rc=$?
*** Invalid option: h
rc=1
nslookup -version; echo rc=$?
nslookup 9.18.39-0ubuntu0.22.04.7-Ubuntu
rc=0
交互模式下输入 help 也不可用(实测):
printf 'help\nexit\n' | nslookup
The 'help' command is not yet implemented.
💡 说明:nslookup 的完整用法说明在联机手册
man nslookup里;-version是唯一可用的版本类选项(逐字输出包版本串)。同一软件包的dig -h提供全量帮助(详见本专栏 dig 篇 2.2),记不住选项时可借道 dig。
2.3 版本信息
nslookup -version
dig -v
nslookup 9.18.39-0ubuntu0.22.04.7-Ubuntu
DiG 9.18.39-0ubuntu0.22.04.7-Ubuntu
💡 说明:
-version输出以 "nslookup" 开头、完整携带 BIND 版本号;dig -v同包同版本,两行互为印证。本文全部实测基于 9.18.39-0ubuntu0.22.04.7-Ubuntu。
三、参数逐项实测
本章逐个参数实测:每个参数给出实测命令、真实回显与要点说明。所有查询均真实发出,回显中的地址顺序与缓存 TTL 每次运行可能不同,属正常现象。
3.1 默认查询:Server 头 + Non-authoritative answer
裸 nslookup 域名 是最常见用法。实测:
nslookup www.baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.70.57
Name: www.a.shifen.com
Address: 110.242.69.21
Name: www.a.shifen.com
Address: 2408:871a:2100:1b23:0:ff:b07a:7ebc
Name: www.a.shifen.com
Address: 2408:871a:2100:186c:0:ff:b07e:3fbc
逐段解读:
Server:/Address: 192.168.146.2#53——应答者:本机配置的 DNS 192.168.146.2 及其端口 53(#53是 nslookup 的端口标注写法);Non-authoritative answer:(非权威应答)——应答来自递归缓存服务器,而不是该域名的权威服务器。缓存答案可能滞后于权威配置,对账方法见 3.12;www.baidu.com canonical name = www.a.shifen.com.——CNAME 别名关系,nslookup 的表述是 "canonical name"(规范名);Name: / Address:行——最终答案。注意实测给出了 2 个 IPv4 + 2 个 IPv6:nslookup 默认先查 A 再自动补查 AAAA(-debug实测铁证见 3.11),这是它与 dig 默认行为的显著差异。
💡 要点:头部两行回答"问的谁",
Non-authoritative answer回答"谁说了算",答案行回答"是什么"。三处都看,才不会被缓存答案误导。
3.2 指定服务器:域名后跟服务器参数
服务器地址直接作为最后一个位置参数。实测本地与两个公共 DNS:
nslookup www.baidu.com 223.5.5.5
Server: 223.5.5.5
Address: 223.5.5.5#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.70.57
Name: www.a.shifen.com
Address: 110.242.69.21
Name: www.a.shifen.com
Address: 2408:871a:2100:1b23:0:ff:b07a:7ebc
Name: www.a.shifen.com
Address: 2408:871a:2100:186c:0:ff:b07e:3fbc
nslookup www.baidu.com 8.8.8.8
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
www.a.shifen.com canonical name = www.wshifen.com.
Name: www.wshifen.com
Address: 103.235.46.96
Name: www.wshifen.com
Address: 103.235.47.188
解读:
- 头部
Server:随指定地址变化,答案正文结构相同; - 8.8.8.8 返回了不同的 CNAME 链(多一跳 www.wshifen.com,指向境外 CDN 节点 103.235.46.x)——这是智能调度(按请求来源地域返回不同答案)的真实演示,并非解析错误。
💡 要点:不同递归服务器的答案不同,先区分两种原因——调度设计(如本例)与缓存污染(答案明显异常)。指定服务器参数是验证这类差异的最快手段。
3.3 -type=a 与 -type=cname:限定 A 与别名记录
-type= 指定记录类型(大小写不敏感)。实测:
nslookup -type=a www.baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.69.21
Name: www.a.shifen.com
Address: 110.242.70.57
nslookup -type=cname www.baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Authoritative answers can be found from:
解读:
-type=a只返回 IPv4 地址(无 AAAA 行)——与 3.1 对比可知:显式指定类型会关掉 nslookup 的"自动补查另一族"行为;-type=cname只给别名行;Authoritative answers can be found from:后面为空——nslookup 在答案不带地址时会把"可以去哪查权威"的提示区留空,这个区块的用法见 3.4 的 NS 查询。
💡 要点:查 CDN 域名时,
canonical name行就是"真实正名";要拿纯 v4 地址列表就用-type=a(顺带屏蔽 v6 干扰)。
3.4 -type=mx 与 -type=ns:邮件与权威记录(含 glue 地址清单)
nslookup -type=mx baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
baidu.com mail exchanger = 10 mx.maillb.baidu.com.
baidu.com mail exchanger = 20 mx.baidu.com.
Authoritative answers can be found from:
nslookup -type=ns baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
baidu.com nameserver = ns4.baidu.com.
baidu.com nameserver = ns7.baidu.com.
baidu.com nameserver = ns3.baidu.com.
baidu.com nameserver = dns.baidu.com.
baidu.com nameserver = ns2.baidu.com.
Authoritative answers can be found from:
dns.baidu.com internet address = 110.242.68.134
ns2.baidu.com internet address = 220.181.33.31
ns3.baidu.com internet address = 36.155.132.78
ns3.baidu.com internet address = 153.3.238.93
ns4.baidu.com internet address = 14.215.178.80
ns4.baidu.com internet address = 111.45.3.226
ns7.baidu.com internet address = 14.215.178.80
dns.baidu.com has AAAA address 240e:bf:b801:1002:0:ff:b024:26de
ns2.baidu.com has AAAA address 240e:940:603:4:0:ff:b01b:589a
ns7.baidu.com has AAAA address 240e:bf:b801:1002:0:ff:b024:26de
ns7.baidu.com has AAAA address 240e:940:603:4:0:ff:b01b:589a
解读:
- MX 行格式
mail exchanger = 优先级 主机名——数字小者优先投递(10 的 mx.maillb.baidu.com 先于 20); - NS 行格式
nameserver = 主机名——baidu.com 共 5 个权威; Authoritative answers can be found from:区块在 NS 查询时填入了各权威 NS 的地址(A 与 AAAA)——这是 glue 记录(随 NS 答案附带的"找得到路"信息),nslookup 把它单独列在此区;- dns.baidu.com 未在 NS 清单里出现 A 地址行之外的重复,说明它就是主权威(与 3.5 的 SOA origin 一致)。
💡 要点:拿到 NS 清单 + glue 地址,就能在递归不可用时"绕开递归直连权威"(见 3.12)——这是 nslookup 输出里最实用的附赠信息。
3.5 -type=txt、-type=soa、-type=aaaa
nslookup -type=txt baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
baidu.com text = "_globalsign-domain-verification=qjb28W2jJSrWj04NHpB0CvgK9tle5JkOq-EcyWBgnE"
baidu.com text = "google-site-verification=GHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwM"
baidu.com text = "v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com include:spf4.baidu.com -all"
baidu.com text = "9279nznttl321bxp1j464rd9vpps246v"
Authoritative answers can be found from:
nslookup -type=soa baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
baidu.com
origin = dns.baidu.com
mail addr = sa.baidu.com
serial = 2012151573
refresh = 300
retry = 300
expire = 2592000
minimum = 600
Authoritative answers can be found from:
nslookup -type=aaaa www.qq.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
www.qq.com canonical name = ins-r23tsuuf.ias.tencent-cloud.net.
ins-r23tsuuf.ias.tencent-cloud.net canonical name = tra-kbagmtra.ias.tencent-cloud.net.
Name: tra-kbagmtra.ias.tencent-cloud.net
Address: 2408:80f1:21:c120::e
Name: tra-kbagmtra.ias.tencent-cloud.net
Address: 2408:80f1:21:c120::c
解读:
- TXT 行以
text =开头、文本原样带引号输出,实测四条覆盖了三类用途:随机串(站点归属)、google-site-verification=(搜索引擎验证)、v=spf1开头的 SPF(发件服务器白名单,防伪造邮件); - SOA 被 nslookup 展开成七行字段:origin(主权威)、mail addr(管理员邮箱,首个点即 @,即 sa@baidu.com)、serial(区域序列号,改一次区域文件加一)、refresh/retry/expire(从权威同步节奏)、minimum(否定缓存 TTL)——字段逐行可读是 nslookup 的强项;
- AAAA 查询确认 www.qq.com 经两级 CNAME 指向 IPv6 地址——CNAME 行为与 A 查询一致。
💡 要点:SOA 的 serial 是判断"权威区域文件有没有变更过"的坐标,迁移 DNS 或排查主从同步时先看它。
3.6 IP 反查:裸 IP 自动查 PTR
参数是 IP 时,nslookup 自动改查 PTR 记录(等价 nslookup -type=ptr x.x.x.x.in-addr.arpa)。实测:
nslookup 8.8.8.8
8.8.8.8.in-addr.arpa name = dns.google.
Authoritative answers can be found from:
nslookup 223.5.5.5
5.5.5.223.in-addr.arpa name = public1.alidns.com.
Authoritative answers can be found from:
解读:8.8.8.8.in-addr.arpa 是自动生成的反查名(IP 倒序 + in-addr.arpa 后缀),name = dns.google. 即 PTR 答案;阿里公共 DNS 的 223.5.5.5 反查为 public1.alidns.com。无 PTR 的地址实测形态——直接给出反查名的 NXDOMAIN(连 Server 头都不出)且 rc=1:
nslookup 172.17.0.1; echo rc=$?
** server can't find 1.0.17.172.in-addr.arpa: NXDOMAIN
rc=1
💡 要点:日志里出现陌生 IP 时一条命令问出"它叫什么",配合 3.2 指定服务器可交叉验证。
3.7 交互模式:server / set type 连续查询
直接运行 nslookup 进入 > 提示符,可用内部指令连续查询。无终端环境用管道喂入等效复现。实测切换服务器 + 切换类型两连:
printf 'server 223.5.5.5\nset type=ns\nbaidu.com\nexit\n' | nslookup
Default server: 223.5.5.5
Address: 223.5.5.5#53
Server: 223.5.5.5
Address: 223.5.5.5#53
Non-authoritative answer:
baidu.com nameserver = ns4.baidu.com.
baidu.com nameserver = ns2.baidu.com.
baidu.com nameserver = dns.baidu.com.
baidu.com nameserver = ns7.baidu.com.
baidu.com nameserver = ns3.baidu.com.
Authoritative answers can be found from:
逐行解读:
server 223.5.5.5生效后先回显Default server: 223.5.5.5(设置确认),随后的查询头部 Server 行同步变为 223.5.5.5;set type=ns与命令行的-type=ns等效;- 之后每次输入域名即触发一次查询,直到
exit退出。
常用内部指令:server <地址>(换服务器)、set type=<类型>(换记录类型)、set debug(等效 -debug)、exit(退出)。
💡 要点:交互模式适合"同一批名字反复换服务器/类型对账"的人工排查场景;脚本化场景仍用非交互参数形式。
3.8 -timeout:超时控制与失败形态
-timeout=秒数 限定每次尝试的等待时间。向一个不响应的地址查询(192.0.2.1 为保留测试网段)实测失败形态:
nslookup -timeout=2 www.baidu.com 192.0.2.1; echo rc=$?
;; communications error to 192.0.2.1#53: timed out
;; communications error to 192.0.2.1#53: timed out
;; communications error to 192.0.2.1#53: timed out
;; no servers could be reached
rc=1
解读:nslookup 对同一服务器默认重试共 3 次尝试(三条 timed out),全部失败后给出 ;; no servers could be reached,退出码 1;整个耗时约 6 秒(3 次 × 2 秒),调小 -timeout 可显著缩短脚本失败时的等待。
💡 要点:
timed out(发出无应答)与 3.9 的connection refused(明确拒绝)含义不同:前者是链路/防火墙丢包,后者是端口无服务——排障时看报错动词就能分方向。
3.9 -port:指定服务器端口
-port=端口号 指定查询端口(默认 53)。实测标准端口与无服务端口:
nslookup -port=53 www.baidu.com 223.5.5.5
Server: 223.5.5.5
Address: 223.5.5.5#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.70.57
Name: www.a.shifen.com
Address: 110.242.69.21
Name: www.a.shifen.com
Address: 2408:871a:2100:1b23:0:ff:b07a:7ebc
Name: www.a.shifen.com
Address: 2408:871a:2100:186c:0:ff:b07e:3fbc
nslookup -port=5353 -timeout=2 www.baidu.com 127.0.0.1; echo rc=$?
;; communications error to 127.0.0.1#5353: connection refused
;; communications error to 127.0.0.1#5353: connection refused
;; communications error to 127.0.0.1#5353: connection refused
;; no servers could be reached
rc=1
解读:-port=53 与默认行为一致(头部同样显示 #53);本机 5353 无服务,内核立即回拒绝,3 次尝试瞬间失败,rc=1——connection refused 比 timed out 快得多,据此可区分"端口没人听"与"包被丢"。
💡 要点:验证自建 DNS(dnsmasq、BIND 监听非 53 端口)时 -port 是必配项;头部
#端口号永远回显实际使用的端口,先看它确认参数生效。
3.10 NXDOMAIN 形态与退出码
查一个不存在的域名,看 nslookup 怎么报告:
nslookup no-such-8zq7.invalid; echo rc=$?
Server: 192.168.146.2
Address: 192.168.146.2#53
** server can't find no-such-8zq7.invalid: NXDOMAIN
rc=1
解读:
- NXDOMAIN(名字不存在)的 nslookup 形态是一行
** server can't find <域名>: NXDOMAIN,**前缀标记异常; - 退出码 1——与 dig 不同(dig 对 NXDOMAIN 返回 0,见本专栏 dig 篇 3.10),nslookup 把"没有答案"视为失败,这对脚本判断更直接。
本组实测的 nslookup 退出码汇总:
| 场景 | 输出形态 | 退出码 |
|---|---|---|
| 正常应答(含 Non-authoritative) | Server 头 + 答案 | 0 |
| 名字不存在 | ** server can't find + 域名 + : NXDOMAIN | 1 |
| 服务器超时 | timed out ×3 + no servers could be reached | 1 |
| 端口无服务 | connection refused ×3 + no servers could be reached | 1 |
| 无效选项 | *** Invalid option: h | 1 |
💡 要点:nslookup 的 rc 语义简单直接——0 即有答案、非 0 即各种失败;但它不区分"失败原因",需要看输出文案细分(NXDOMAIN / timed out / refused / Invalid option)。
3.11 -debug:报文级细节(揭示默认双查询行为)
-debug 打印每条查询/应答的内部结构。实测:
nslookup -debug www.baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
------------
QUESTIONS:
www.baidu.com, type = A, class = IN
ANSWERS:
-> www.baidu.com
canonical name = www.a.shifen.com.
ttl = 5
-> www.a.shifen.com
internet address = 110.242.70.57
ttl = 5
-> www.a.shifen.com
internet address = 110.242.69.21
ttl = 5
AUTHORITY RECORDS:
ADDITIONAL RECORDS:
------------
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.70.57
Name: www.a.shifen.com
Address: 110.242.69.21
------------
QUESTIONS:
www.a.shifen.com, type = AAAA, class = IN
ANSWERS:
-> www.a.shifen.com
has AAAA address 2408:871a:2100:186c:0:ff:b07e:3fbc
ttl = 5
-> www.a.shifen.com
has AAAA address 2408:871a:2100:1b23:0:ff:b07a:7ebc
ttl = 5
AUTHORITY RECORDS:
ADDITIONAL RECORDS:
------------
Name: www.a.shifen.com
Address: 2408:871a:2100:186c:0:ff:b07e:3fbc
Name: www.a.shifen.com
Address: 2408:871a:2100:1b23:0:ff:b07a:7ebc
逐段解读:
- 第一段
------------包裹的是 A 查询报文:QUESTIONS 节www.baidu.com, type = A, class = IN,ANSWERS 节逐条带 ttl = 5(缓存剩余 TTL)——这是普通输出里看不到的信息; - 第二段暴露了关键行为:nslookup 在 A 查询之后又自动发起了一条
www.a.shifen.com, type = AAAA查询——3.1 里答案包含 IPv6 的原因就在此; AUTHORITY RECORDS:与ADDITIONAL RECORDS:为空——递归缓存应答未附带权威节记录。
💡 要点:nslookup 默认"双栈两条查询"(A + AAAA)且显示合并结果;
-debug是看清这一点、并拿到 TTL 的唯一途径。怀疑双栈查询干扰排查时,用-type=a显式限定单类型。
3.12 直查权威服务器:Non-authoritative 字样消失
用 3.4 拿到的权威地址直连权威查询,对比应答标记:
nslookup baidu.com dns.baidu.com
Server: dns.baidu.com
Address: 110.242.68.134#53
Name: baidu.com
Address: 124.237.177.164
Name: baidu.com
Address: 110.242.74.102
Name: baidu.com
Address: 111.63.65.103
Name: baidu.com
Address: 111.63.65.247
解读:
- 头部
Server: dns.baidu.com——应答者就是 baidu.com 的主权威(地址 110.242.68.134 来自 3.4 的 glue 清单); - "Non-authoritative answer:" 字样消失了——这是 nslookup 标记权威应答的方式:有缓存中介才需要声明非权威,权威亲答则无需声明;
- 答案与递归应答一致,说明 192.168.146.2 的缓存与权威同步正常——这就是"对账":两边一致放行,不一致以权威为准。
💡 要点:nslookup 判断递归/权威靠"有没有 Non-authoritative answer 行",比 dig 的 flags(ra/aa)更隐晦——这也是它"人类友好但细节少"的典型体现。
3.13 nslookup 与 /etc/hosts 的关系:hosts 不影响 nslookup
与 dig 一样,nslookup 是纯 DNS 协议工具,不读 /etc/hosts。全程备份核验的两态对照实测。先备份并追加条目:
cp /etc/hosts /root/demo/nslookup/hosts.bak
echo '127.0.0.1 demo2.local' >> /etc/hosts
系统解析器(getent)能拿到答案:
getent hosts demo2.local
127.0.0.1 demo2.local
nslookup 却向 DNS 服务器查询并报 NXDOMAIN:
nslookup demo2.local; echo rc=$?
Server: 192.168.146.2
Address: 192.168.146.2#53
** server can't find demo2.local: NXDOMAIN
rc=1
清理条目并核验还原:
grep -v 'demo2.local' /etc/hosts > /tmp/hosts.clean && cat /tmp/hosts.clean > /etc/hosts
diff /etc/hosts /root/demo/nslookup/hosts.bak; echo rc=$?
rc=0
diff 无差异、rc=0,hosts 还原完成。
💡 要点:同一个名字,getent 能解析(读 hosts)、nslookup 报 NXDOMAIN(只认 DNS)——排查"本机应用能连、DNS 工具却说查不到"时先想到这一层。
四、实战示例
本章给出一组组合场景,命令均来自第三章实测,可按场景直接套用。
4.1 双栈快速核对域名解析
场景:确认域名在 IPv4/IPv6 双栈下都能解析。
nslookup www.baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.70.57
Name: www.a.shifen.com
Address: 110.242.69.21
Name: www.a.shifen.com
Address: 2408:871a:2100:1b23:0:ff:b07a:7ebc
Name: www.a.shifen.com
Address: 2408:871a:2100:186c:0:ff:b07e:3fbc
一条命令同时给出 CNAME 关系、v4 与 v6 地址(默认双查询行为,见 3.1/3.11)——这是 nslookup 相比 dig 默认行为最省事的一点。
4.2 邮件排障:MX 与 SOA 连查
场景:收发异常时确认邮件路由与权威状态。
nslookup -type=mx baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
baidu.com mail exchanger = 10 mx.maillb.baidu.com.
baidu.com mail exchanger = 20 mx.baidu.com.
Authoritative answers can be found from:
nslookup -type=soa baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
baidu.com
origin = dns.baidu.com
mail addr = sa.baidu.com
serial = 2012151573
refresh = 300
retry = 300
expire = 2592000
minimum = 600
Authoritative answers can be found from:
判读:MX 优先级 10 先投 mx.maillb.baidu.com;SOA 的 mail addr(sa.baidu.com)给出域名管理方联系方式,serial 用于核对区域是否刚变更过。
4.3 交互式多轮核对(换服务器 + 换类型)
场景:人工对账一批名字。交互指令连续执行(实测见 3.7):
printf 'server 223.5.5.5\nset type=ns\nbaidu.com\nexit\n' | nslookup
Default server: 223.5.5.5
Address: 223.5.5.5#53
Server: 223.5.5.5
Address: 223.5.5.5#53
Non-authoritative answer:
baidu.com nameserver = ns4.baidu.com.
baidu.com nameserver = ns2.baidu.com.
baidu.com nameserver = dns.baidu.com.
baidu.com nameserver = ns7.baidu.com.
baidu.com nameserver = ns3.baidu.com.
Authoritative answers can be found from:
交互式的好处是 Default server 切换即时生效、连续查询免重复敲服务器地址;核对完记得 exit 退出。
4.4 直查权威对账(绕开递归缓存)
场景:怀疑递归缓存陈旧,直连权威验证(权威清单来自 3.4,两步实测):
nslookup -type=ns baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
baidu.com nameserver = ns4.baidu.com.
baidu.com nameserver = ns7.baidu.com.
baidu.com nameserver = ns3.baidu.com.
baidu.com nameserver = dns.baidu.com.
baidu.com nameserver = ns2.baidu.com.
Authoritative answers can be found from:
dns.baidu.com internet address = 110.242.68.134
ns2.baidu.com internet address = 220.181.33.31
ns3.baidu.com internet address = 36.155.132.78
ns3.baidu.com internet address = 153.3.238.93
ns4.baidu.com internet address = 14.215.178.80
ns4.baidu.com internet address = 111.45.3.226
ns7.baidu.com internet address = 14.215.178.80
dns.baidu.com has AAAA address 240e:bf:b801:1002:0:ff:b024:26de
ns2.baidu.com has AAAA address 240e:940:603:4:0:ff:b01b:589a
ns7.baidu.com has AAAA address 240e:bf:b801:1002:0:ff:b024:26de
ns7.baidu.com has AAAA address 240e:940:603:4:0:ff:b01b:589a
nslookup baidu.com dns.baidu.com
Server: dns.baidu.com
Address: 110.242.68.134#53
Name: baidu.com
Address: 124.237.177.164
Name: baidu.com
Address: 110.242.74.102
Name: baidu.com
Address: 111.63.65.103
Name: baidu.com
Address: 111.63.65.247
判读:第一步拿权威清单与地址,第二步直查权威;Non-authoritative answer 行消失即确认权威亲答(见 3.12)。
4.5 脚本判断:rc=1 的 NXDOMAIN 直接可用
场景:巡检脚本判断"域名是否可解析"。nslookup 的 NXDOMAIN 返回 1(实测见 3.10),退出码即可判断,比 dig(NXDOMAIN 也是 0)少一步输出解析:
nslookup no-such-8zq7.invalid; echo rc=$?
Server: 192.168.146.2
Address: 192.168.146.2#53
** server can't find no-such-8zq7.invalid: NXDOMAIN
rc=1
nslookup www.baidu.com >/dev/null; echo rc=$?
rc=0
脚本骨架:nslookup 域名 >/dev/null 2>&1 || echo "解析失败"——0 即通过,1 即失败(NXDOMAIN/超时/拒绝统一归 1,见 3.10 的退出码汇总)。
五、注意事项与常见问题
Q1:Non-authoritative answer:(非权威应答)到底是什么意思?
表示应答来自递归缓存服务器而非该域名的权威服务器——递归服务器把自己缓存的答案给你,可能存在滞后。实测对照:普通查询带此行(3.1),直查权威 dns.baidu.com 时此行消失(3.12)。看到这行就意味着"答案可能有缓存延迟",对账方法是指定权威服务器重查。
Q2:为什么 nslookup 默认会给出 IPv6 地址,dig 默认只有 IPv4?
nslookup 默认自动发起两条查询:先 A 再 AAAA,并合并显示(-debug 实测铁证见 3.11 第二段 QUESTIONS);dig 默认只查 A。想让 nslookup 只查 v4,用 -type=a 显式限定(实测见 3.3)。
Q3:nslookup 的退出码怎么用?和 dig 有什么不同? 实测汇总(见 3.10):有答案 rc=0;NXDOMAIN、超时、拒绝、无效选项统一 rc=1。而 dig 对 NXDOMAIN 返回 0(只有服务器不可达才非 0)。脚本判断"域名是否存在",nslookup 看 rc 即可,dig 必须解析输出——这是 nslookup 在脚本场景的实用优势。
Q4:nslookup 为什么没有 -h 帮助?
实测 nslookup -h 报 *** Invalid option: h、交互式 help 报 The 'help' command is not yet implemented.(见 2.2)——nslookup 确实没有内置帮助,完整文档在 man nslookup;版本用 -version 查(实测 nslookup 9.18.39-0ubuntu0.22.04.7-Ubuntu)。记不住选项时可借同包 dig 的帮助(dig -h)对照,两者能力高度重合。
Q5:/etc/hosts 里的名字为什么 nslookup 查不到?
nslookup 是纯 DNS 协议工具,不读 /etc/hosts。实测对照(见 3.13):hosts 加了 127.0.0.1 demo2.local 后 getent hosts demo2.local 返回 127.0.0.1,而 nslookup demo2.local 报 ** server can't find demo2.local: NXDOMAIN(rc=1)。验证 hosts 生效用 getent;验证 DNS 用 nslookup/dig。
Q6:nslookup 与 dig 的输出差异速查?(人类友好 vs 运维精细) 同一查询(www.baidu.com)在两个工具下的信息量对比——
| 信息项 | nslookup | dig |
|---|---|---|
| 应答服务器/端口 | Server: + Address: 192.168.146.2#53 | SERVER: 192.168.146.2#53(192.168.146.2) (UDP) 且注明传输协议 |
| 递归/权威标记 | 有无 Non-authoritative answer 行 | flags:ra(递归)/ aa(权威)直接可见 |
| TTL(缓存剩余秒数) | 默认不显示,需 -debug | 答案行直接给出 |
| 退出码语义 | NXDOMAIN 也算失败(rc=1) | NXDOMAIN 算成功(rc=0) |
| 附加信息 | 无 | Query time / MSG SIZE / EDNS / 权威节 |
选型:给非运维同事看结果、或写"存在性判断"脚本用 nslookup;深挖解析链路、看 flags/TTL/耗时用 dig。
Q7:-timeout=2 为什么还是等了约 6 秒才失败?
-timeout 限定每次尝试的等待,nslookup 默认对同一服务器重试共 3 次尝试(实测 3 行 timed out,见 3.8),总耗时约为 timeout × 3。缩短总等待的办法是把 -timeout 调小(如 -timeout=1);nslookup 没有调整尝试次数的命令行选项,这是它与 dig(+tries/+retry 可调,见 dig 篇 2.2 帮助)的一个能力差距。
六、参考链接
- nslookup(1) 手册(man7.org):https://man7.org/linux/man-pages/man1/nslookup.1.html
- nslookup(1) Ubuntu 22.04 联机手册:https://manpages.ubuntu.com/manpages/jammy/en/man1/nslookup.1.html
- BIND 9 官方文档(ARM,含 nslookup 章节说明):https://bind9.readthedocs.io/
- RFC 1035(DNS 协议与报文格式):https://datatracker.ietf.org/doc/html/rfc1035
- RFC 2308(否定缓存与 NXDOMAIN 语义):https://datatracker.ietf.org/doc/html/rfc2308