核心思路是并行验证指定域名列表在各自权威DNS服务器上的解析结果是否生效,需绕过缓存直连NS、用dig @nsX +short精准查询、timeout防阻塞,并结构化输出“域名|NS|类型|值|状态”。

用 dig 并行查多个域名的权威 DNS 解析结果
核心思路不是“全网所有域名”——那不可能,而是你手头有一份待验证的域名列表(比如刚批量改过 NS 记录的 50 个客户域名),要确认它们在各权威服务器上是否已返回新 IP。关键在于绕过本地缓存、直连权威服务器,并统一比对结果。dig 是最可靠的选择,+short 去噪,@nsX.example.com 指定权威服务器,避免递归污染。
实操建议:
- 先用
whois example.com | grep "Name Server"或dig +short NS example.com拿到每个域名当前配置的权威 NS 列表 - 对每个域名,用
dig @ns1.example.com example.com A +short和dig @ns2.example.com example.com A +short分别查,不要依赖系统默认 resolver - 用
timeout 3包裹单次dig,防止单个慢查询拖垮整个脚本 - 结果为空、超时、或与期望值不一致,都算“未生效”,需单独标记
用 bash 脚本组织多域名+多 NS 的交叉校验逻辑
不能简单 for 循环套 for 循环就完事——出错时无法定位是哪个域名、哪台 NS、哪个记录类型的问题。必须结构化输出:每行一个“域名|NS 服务器|记录类型|实际值|状态”。
实操建议:
- 把域名列表存在
domains.txt,每行一个;NS 列表存在authoritative_ns.txt,也是一行一个(可从dig NS domain.com +short动态生成) - 用
while IFS= read -r domain; do ... done 逐行读,避免空格和特殊字符崩掉循环 - 对每个域名,先跑一次
dig $domain NS +short确认当前 NS 是否已更新,再查 A/AAAA —— 这步常被跳过,导致误判“DNS 未生效”,其实是 NS 记录本身还没推下去 - 用
printf格式化输出,别用echo,避免变量含换行或-e被误解析
处理常见失败场景:超时、格式不一致、CNAME 链断裂
dig 返回空不等于“没解析”,可能是超时、被限频、或返回了 CNAME 但没继续追。直接比对 +short 输出会漏掉这些信号。
实操建议:
- 不用
+short查 CNAME 场景:改用dig $domain A +noall +answer,然后用awk '/A$/ {print $5}'提取 IP,同时保留响应头里的status:字段判断是否NOERROR - 遇到
servfail或refused,大概率是目标 NS 临时故障或 ACL 拒绝了你的 IP,记日志但不立即标为“失败”,可重试一次 - CNAME 目标未生效?脚本里加一层自动跟随:若第一轮查出
example.com. CNAME www.example.com.,则立刻补查www.example.com A,否则你会以为主域名“没 A 记录” - 不同 NS 返回的 IP 格式可能不一致(有末尾点、无点、IPv6 带冒号),统一用
sed 's/\.$//; s/ //g'清理后再比较
为什么不用 host 或 Python 的 dnspython?
host 默认走系统 resolver,无法指定权威服务器,且错误码模糊(比如 host: command not found 和 host: example.com has no A record 都返回 1);dnspython 功能强但引入额外依赖,在无 pip 环境或容器里部署麻烦,且默认启用递归查询,容易受本地 DNS 配置干扰。
实操建议:
- 坚持用系统自带
dig,CentOS/RHEL/Ubuntu 都预装,bind-utils或dnsutils包提供 - 如果必须用 Python,禁用递归:
resolver = dns.resolver.Resolver(configure=False); resolver.nameservers = ['8.8.8.8']; resolver.flags &= ~dns.flags.RD,再手动发 query 到权威 NS - 别信“一键检测平台”的 API,它们通常只查几个公共 DNS(如 114、阿里云),不代表你的客户实际访问时看到的结果
真正难的不是并发查几百个域名,而是当某台 NS 返回 NOERROR 但内容为空、另一台返回 SERVFAIL、第三台返回旧 IP 时,怎么定义“一致”——这得根据你的业务容忍度来设规则,脚本只能帮你把事实摊开。











