直接向 DNS 服务器查询记录,验证解析结果、权威服务器和委派链。
dig 是 macOS 自带的 BIND 查询工具,输出包含状态码、标志位、ANSWER/AUTHORITY/ADDITIONAL 段和 TTL,适合排 DNS。常用 +short 取精简结果,@服务器 指定解析器,-x 做反向查询,+trace 从根开始跟踪委派。macOS 上它位于 /usr/bin/dig,版本通常比 Homebrew 的 bind 旧。
关键差异:macOS 的系统解析由 mDNSResponder 负责,会读取 /etc/hosts、VPN 的 scoped resolver 和 .local 的 mDNS;dig 不走这套逻辑,而是直接读 /etc/resolv.conf 并向其中列出的服务器发查询。因此在 VPN 分流、内网域名或本地 hosts 场景里,dig 的结果可能和浏览器不一致,这时要看 scutil --dns 或 dscacheutil -q host。
dig 默认不应用 search domain,除非加 +search;要查绝对域名可以在末尾加点,例如 example.com.。脚本判断记录是否存在不能只看退出码,dig 对 NXDOMAIN 仍返回 0,必须检查输出里的 status:。
# 完整查询 A 记录和 TTL
% dig example.com
# 只要结果,适合脚本
% dig +short example.com
# 查 AAAA 和 MX
% dig +short example.com AAAA
% dig example.com MX +noall +answer
# 指定公共 DNS,绕过本机配置
% dig @8.8.8.8 example.com A
# 反向解析 IP
% dig -x 8.8.8.8 +short
# 从根服务器跟踪委派链,诊断权威 DNS 问题
% dig +trace example.com
# 强制 TCP 并请求 DNSSEC 记录
% dig +tcp +dnssec example.com
# 查看 macOS 实际使用的解析器和搜索域
% scutil --dns | head -30
dig 不读 /etc/hosts,本地映射能 ping 通但 dig 查不到是正常的;用 dscacheutil -q host -a name 主机名 验证系统视角。/etc/resolv.conf 在 macOS 上只是兼容文件,注释明确说系统解析不走它;VPN 下 dig 可能查错服务器,用 scutil --dns 找当前 resolver,再 dig @服务器。dig 退出码仍是 0,脚本必须检查 status: NXDOMAIN,否则会把“不存在”当成成功。SERVFAIL 是服务器或上游失败,NXDOMAIN 是域名不存在,两者处理方式不同;不要一律当成“DNS 挂了”。+short 在失败时可能什么都不输出,排错时去掉 +short 看完整头部。@8.8.8.8 会绕过内网 split-horizon DNS,内网域名查不到;应指定公司 DNS 或 VPN 下发的服务器。+trace 直接向根和各级权威查询,可能被防火墙拦截,也不适用于只在内网可见的域名。+https 等 DoH 选项不存在;需要新特性时用 Homebrew 的 bind。nslookup — 更简单的交互式查询,适合快速确认dscacheutil — 查看系统解析结果并清缓存ping — 拿到 IP 后验证连通性curl — 验证 DNS 之后的 TLS/HTTP 环节合上页面,先回答,再展开对照。
dig 能查到域名,浏览器却打不开?+short 没有输出就一定是域名不存在吗?scutil --dns 和 curl -v 分层确认。+short 看 status: 和 flags 才能判断。scutil --dns 查看 resolver 顺序和 nameserver,再用 dig @该服务器 复现系统查询。
小程序版
微信扫码,随时查命令