域名解析命令翻来覆去就那两个:dig 和 nslookup。会一个,日常排查基本够用;但决定结果准不准的,常常不是你挑哪个命令,而是你问了哪台 DNS 服务器。见过有人拿本地缓存的结果跟客户争半天,最后发现两边查的压根不是同一台机器。

两个命令的脾气,差别比想象大
dig 在 Linux 上装个 bind-utils 或者 dnsutils 就有了,不同发行版包名不一样,以系统包管理器里实际显示的为准。第一次看它输出会头皮发麻,一大坨,还分了好几个 SECTION。nslookup 更老资格,Windows 上开个 cmd 直接就能敲,所以绝大多数人先会的是它,dig 是后补的。
用起来的感觉,dig 像一把能整个拆开的螺丝刀,每一层都摆给你看;nslookup 更像随手揣兜里的瑞士军刀,够用,但有些细节它藏着。这个差别在排查复杂解析时特别明显,比如一串 CNAME 挂过去、中间断开一环,dig 会把链条列清楚,nslookup 只给你一个最终结果,让你猜是哪段出的问题。
同一个域名,两个人查出不同结果
十有八九是缓存和服务器的问题,不是命令的问题。Linux 上 /etc/resolv.conf 里写的是谁,dig 默认就问谁;装了 systemd-resolved 的机器上经常看到 127.0.0.53,那是个本地 stub,转一手才出去。你在这台机器上查到的结果,跟公网上任何一个人查到的都可能不一样。
所以养成一个习惯:先看输出里 SERVER 那一行。dig 会明明白白打出来问的是哪个 IP、53 端口;nslookup 上面那两行 Server 和 Address 也是这个意思,只是很多人扫一眼就往下翻了。
dig 的输出里,真正要看的就那几行
status 先扫一眼:NOERROR 是正常,NXDOMAIN 是这个名字根本不存在,SERVFAIL 是服务器那边出了问题,可能上游挂了,也可能 DNSSEC 校验没过。这三个词分清楚,能省掉一半瞎猜。
然后看 ANSWER SECTION,记录和 TTL 都在里面。TTL 剩多少,直接决定你改完解析要等多久才在别人那儿生效——你本地清了缓存,不代表别人也清了。
想省事就加 +short,一条记录一行,脚本里处理起来舒服,比如 dig +short www.example.com。但要看 CNAME 链就别用 +short,老老实实看完整输出。查别的类型同理:dig MX example.com +short、dig TXT example.com +short,类型写在域名前面。
nslookup 那些让人别扭的地方
Windows 上敲 nslookup example.com,回车之后它有时候会先卡一下——那是在反解你用的那台 DNS 服务器 IP 的主机名,反解不到就干等。不影响结果,但容易让人误以为网络出了毛病。
那句 Non-authoritative answer 也劝退过不少人。非权威不等于错,只说明答案是从缓存里拿的,不是从权威服务器直接问来的。判断解析到底生效没生效,非权威的答案反而更贴近现实——终端用户拿到的也是缓存。
指定服务器写在后面:nslookup example.com 223.5.5.5。查 MX 要用 -type=mx,或者进交互模式 set type=mx。Windows 上没有 dig,实在想要可以用 PowerShell 的 Resolve-DnsName,输出结构化,管道里好处理;或者装个 WSL,把 Linux 那套工具搬过来。
域名解析命令不指定服务器,基本等于白查
这是我最想说的一条。默认查询永远走你本机配置的那台,运营商 DNS、公司内网 DNS 都可能动过手脚,或者缓存着旧记录。要判断一条记录在公网上长什么样,就得挨个问:dig @223.5.5.5 example.com、dig @8.8.8.8 example.com、dig @1.1.1.1 example.com。几个结果一致,基本可以放心;只有某一家不一样,那就是那家缓存还没过期,等 TTL 走完就行。
再狠一点,直接问权威。先 dig NS example.com 拿到权威服务器列表,然后 dig @ns1.xxx example.com。权威给的才是最终答案,中间那些递归服务器说到底都是复读机。
加不加 +trace,结论可能反过来
dig +trace example.com 是从根服务器开始,一级一级顺着委派走下来,把每层的 NS 都列给你。域名明明改了 NS 却没生效、或者被上一级的委派卡住,这种情况用它一眼就能看出来。
但它不走缓存,也绕开了递归服务器,所以你看到的结果跟终端用户看到的可能完全不同。有人拿 +trace 的输出跟客户解释解析是对的,客户那边还是打不开,不矛盾,只是查的根本不是同一条路径。
到底哪个更靠谱
这问题方向就问偏了。工具没有靠谱不靠谱,只有合不合适。要在脚本、监控里批量跑,用 dig +short,输出干净好解析;临时看一眼、人在 Windows 上,nslookup 抬手就有;要追委派链路,dig +trace;PowerShell 环境里 Resolve-DnsName 更顺手。
真要挑刺,nslookup 的老毛病是输出格式不统一,跨平台还略有差异,写脚本容易踩坑;dig 的毛病是输出太长,不加 +short 得找半天才看到想要的那行。都是小毛病,用熟了都不叫事。
下次再碰上「我这边能打开、你那边打不开」,按这个顺序走一遍:先 dig 看 SERVER 是不是你以为的那台;再 @几个公共 DNS 对比一下;然后 dig NS 找到权威直接问;最后看 TTL 还剩多少。四步下来,是缓存、是配置、还是压根没生效,基本就清楚了。工具选哪个不重要,问对机器才重要。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!