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 的差异。

Linux命令Linux系统UbuntuUbuntu 22.04命令行网络工具2026/10/16

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>反向查询 PTR8.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 一种,常用四件套横向对比——

工具提供来源特点适用场景
nslookupbind9-dnsutils 包人类可读双段输出(Server 头 + 答案)、支持交互模式、失败 rc=1人工快速核对、多轮连查
digbind9-dnsutils 包分节输出(QUESTION/ANSWER)、+short 取值干净、+trace 可追根精确查询与脚本取值
hostbind9-dnsutils 包单行精简输出一眼看答案
resolvectlsystemd-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 + 域名 + : NXDOMAIN1
服务器超时timed out ×3 + no servers could be reached1
端口无服务connection refused ×3 + no servers could be reached1
无效选项*** Invalid option: h1

💡 要点: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)在两个工具下的信息量对比——

信息项nslookupdig
应答服务器/端口Server: + Address: 192.168.146.2#53SERVER: 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 帮助)的一个能力差距。

六、参考链接