Birds – Flying beyond the wall

如何测试DNS是否生效:从权威DNS到本地缓存的完整验证方法

更新于 2026-10-30 · birds.mom

简答:测试DNS是否生效,按“权威DNS→公共递归DNS→本地设备”三层检查:先确认权威服务器返回了新记录,再用多个公共DNS对比,最后清理本地缓存并测试访问。只有三层结果一致,才能判断修改已基本生效;网页打不开还要继续排查SSL、服务器或网络问题。

定义:DNS生效是指新记录已经写入当前权威DNS,并被递归DNS和本地设备查询到;它不等于网站一定能正常打开。

先试这一步:用同一条记录完成三层验证

把下面命令中的 example.com 换成你刚修改的域名,把 www.example.com 换成实际主机名。先记录DNS管理页面中的记录类型、主机名、目标值和TTL,避免把根域、www或其他子域混在一起。

验证层级检查什么通过标准不通过时先查什么
权威DNS当前负责该域名的NS及其返回值权威服务器直接返回新值是否改错DNS托管商、记录名或记录类型
公共递归DNS不同解析器看到的结果多个解析器返回相同的新值TTL缓存、负缓存或部分递归服务器尚未刷新
本地设备设备当前使用的DNS及缓存本机查询结果与公共DNS一致本地缓存、路由器缓存、VPN或客户端覆盖
实际访问网站、邮件或其他服务对应服务能够完成连接服务器、端口、SSL、IPv6或应用配置

DNS查询结果中的TTL会随缓存时间递减;NXDOMAIN、NODATA等否定结果也可能被缓存,因此修改后立刻在所有网络看到相同结果并不是统一保证。相关缓存规则见RFC 2308和RFC 9520。

第1层:先查权威DNS是否已经更新

权威DNS是最终保存该域名区域记录的服务器。先查NS,再针对其中一个权威服务器查询目标记录,比直接查询本机默认DNS更适合判断“修改是否已经写入”。Google Public DNS也说明,递归解析器会根据NS记录找到域名的权威服务器,可参考Google Public DNS FAQ。

macOS或Linux:使用dig

  1. 查询域名的权威NS:

    dig NS example.com +short

    预期结果是一个或多个NS主机名,例如 ns1.example-dns.com.。如果这里就出现超时或没有NS结果,先检查域名、注册商委派和网络。

  2. 指定权威服务器查询A记录:

    dig @ns1.example-dns.com www.example.com A +noall +answer

    把 ns1.example-dns.com替换为上一步得到的实际NS。预期结果中的IP应与DNS管理页面填写的值一致。

  3. 按实际记录类型查询:

    dig @ns1.example-dns.com www.example.com AAAA +noall +answer
    dig @ns1.example-dns.com example.com MX +noall +answer
    dig @ns1.example-dns.com example.com TXT +noall +answer
    dig @ns1.example-dns.com example.com CNAME +noall +answer

Windows:使用nslookup

  1. 先查询NS:

    nslookup -type=NS example.com

  2. 再指定权威服务器查询:

    nslookup -type=A www.example.com ns1.example-dns.com

    最后一个参数是DNS服务器地址或主机名。Microsoft文档说明,nslookup可在命令行中指定查询类型和DNS服务器,参见Microsoft nslookup文档。

判断:如果权威DNS仍返回旧值,公共DNS和本机查询新值都不应被当作成功。优先回到当前实际生效的DNS托管商,核对主机名末尾是否多写或少写了域名、记录类型是否正确,以及是否存在冲突记录。

第2层:用多个公共DNS确认传播结果

权威DNS已经返回新值后,再分别查询公共递归DNS。下面使用Google Public DNS的8.8.8.8、Cloudflare的1.1.1.1和Quad9的9.9.9.9作为对照服务器;这些地址只是测试入口,不代表所有网络都必须使用它们。Google官方文档列出了其公共DNS地址及测试方式,见Google Public DNS使用说明。

macOS或Linux

dig @8.8.8.8 www.example.com A +noall +answer
dig @1.1.1.1 www.example.com A +noall +answer
dig @9.9.9.9 www.example.com A +noall +answer

查询AAAA、MX、TXT时,把命令中的记录类型替换即可,例如:

dig @8.8.8.8 example.com MX +noall +answer
dig @8.8.8.8 example.com TXT +noall +answer

Windows PowerShell

Resolve-DnsName -Name www.example.com -Type A -Server 8.8.8.8
Resolve-DnsName -Name www.example.com -Type A -Server 1.1.1.1
Resolve-DnsName -Name www.example.com -Type AAAA -Server 8.8.8.8

也可以使用:

nslookup -type=A www.example.com 8.8.8.8
nslookup -type=A www.example.com 1.1.1.1

结果判断:如果多个公共DNS都返回新值,说明记录已经被这些递归解析器看到;如果有的返回旧值、有的返回新值,通常先检查TTL和缓存,不要重复修改记录。降低TTL只能影响之后产生的缓存,不能立即清除已经存在的缓存。

第3层:确认本地设备没有继续使用旧缓存

本地设备查询结果可能受到操作系统DNS缓存、浏览器缓存、路由器缓存、VPN或网络客户端的影响。Windows官方文档建议用ipconfig /all检查当前DNS服务器,用ipconfig /flushdns清理DNS客户端缓存,见Microsoft DNS客户端排查文档和ipconfig命令文档。

Windows

  1. 查看本机正在使用的DNS:

    ipconfig /all

  2. 清理DNS缓存:

    ipconfig /flushdns

  3. 重新查询:

    nslookup www.example.com

如果本机仍与公共DNS不一致,检查网卡、路由器、VPN或网络客户端是否指定了其他DNS。若要查看本地缓存,可使用ipconfig /displaydns。

macOS

  1. 用命令直接绕过默认解析器进行对照:

    dig @8.8.8.8 www.example.com A +noall +answer

  2. 在系统设置中打开“系统设置→网络→当前网络→详细信息→DNS”,确认DNS服务器列表是否为预期配置。Apple的入口说明见Apple更改Mac上的DNS设置。

  3. 如仍怀疑本地缓存,可执行常用刷新命令后重新查询:

    sudo dscacheutil -flushcache

    命令执行后通常不会显示成功提示;应以再次查询结果为准。若问题只在浏览器出现,完全退出浏览器后重新打开。

Linux

使用dig直接指定公共DNS:

dig @8.8.8.8 www.example.com A +noall +answer

如果系统使用NetworkManager、systemd-resolved或其他本地解析服务,应同时检查当前连接配置和本地解析器状态;不同发行版的缓存清理命令并不统一,因此不要把某一条命令当成所有Linux发行版的通用步骤。

按记录类型判断什么才算正确

记录类型查询示例正确结果常见误判
Adig @8.8.8.8 www.example.com A返回预期IPv4地址只查了根域,实际修改的是www子域
AAAAdig @8.8.8.8 www.example.com AAAA返回预期IPv6地址,或确认没有配置AAAAAAAA仍指向旧服务器,导致部分网络优先走IPv6
CNAMEdig @8.8.8.8 www.example.com CNAME返回预期目标主机名,并可继续解析目标把CNAME和同名A记录同时配置造成冲突
MXdig @8.8.8.8 example.com MX返回邮件主机和优先级MX已生效,但邮件主机本身没有A或AAAA记录
TXTdig @8.8.8.8 example.com TXT返回完整验证文本复制时漏掉引号、空格或分段内容
NSdig @8.8.8.8 example.com NS返回当前委派的权威NS修改了一个DNS服务商,却仍查询另一个服务商

查询时必须保持“主机名、记录类型、查询服务器”一致;只看网页能否打开,无法确认MX、TXT或NS是否正确。

看懂DNS测试结果:NOERROR、NXDOMAIN和超时

  • NOERROR并有Answer:查询成功,继续核对Answer中的值、记录类型和TTL。
  • NOERROR但没有Answer:域名本身可能存在,但当前查询类型没有对应记录,或返回了NODATA;例如只配置了A,却查询AAAA。RFC 2308对NODATA的定义是域名有效但没有所查询类型的记录,见RFC 2308。
  • NXDOMAIN:被查询的名称不存在,可能是主机名写错、委派错误,或此前的不存在结果仍在负缓存中。先核对完整域名,再查询权威NS。
  • SERVFAIL:解析器未能完成查询,不能直接等同于“记录不存在”;应换一个公共DNS并直接查询权威DNS。
  • Timeout:当前设备到指定DNS服务器的查询没有在期限内得到响应,优先检查网络、防火墙、UDP/TCP DNS连通性或DNS服务器地址。
  • 返回旧IP:先比较权威DNS和公共DNS。如果权威DNS已是新值而公共DNS仍是旧值,通常是缓存;如果权威DNS仍是旧值,则应回到DNS托管配置核对。

Google的DNS排查文档也建议分别测试UDP和TCP查询,以区分解析器不可达、查询被拦截或其他网络问题,见Google Public DNS排查说明。

最后的验收标准与回退路径

  1. 记录层:权威DNS对目标记录返回新值。

  2. 传播层:至少两个公共DNS返回相同的新值;若不一致,记录查询时间和TTL,稍后复测。

  3. 本地层:清理本机缓存后,默认查询结果与公共DNS一致。

  4. 服务层:A或AAAA记录对应的网站能够连接;MX记录还要单独验证邮件收发;TXT记录要回到使用该验证记录的平台重新检查。

如果修改后出现断网、网站完全无法解析或邮件异常,先把受影响记录恢复为修改前的值,再按“权威DNS→公共DNS→本地设备”重新测试。不要同时更改DNS、服务器IP、IPv6和客户端配置,否则很难判断是哪一层发生变化。

常见问题

DNS修改后多久算生效?

没有适用于所有域名的固定时长。实际看到新值的时间取决于权威DNS更新、递归解析器缓存、TTL以及否定缓存。最可靠的判断方式不是等待某个固定小时数,而是查询权威DNS并对比多个公共DNS。

为什么权威DNS已经是新IP,但我电脑仍显示旧IP?

通常是本地设备、路由器、浏览器或网络客户端仍在使用缓存或其他DNS。Windows可执行ipconfig /flushdns后复查;macOS和Linux可用dig @8.8.8.8与默认dig对比。

DNS已经生效,为什么网站还是打不开?

这说明DNS解析成功不代表应用服务正常。继续检查目标IP上的Web服务、端口、防火墙、TLS证书、Host配置,以及AAAA是否指向不可用的IPv6地址;也可以用固定IP或同服务器的其他主机名做分层对照。

只查A记录够不够?

不一定。网站可能同时使用A和AAAA,邮件依赖MX,域名验证常用TXT,域名委派依赖NS。应查询与你刚修改的记录类型相同的记录,不能用A记录结果替代MX、TXT或NS的验证。

要不要反复修改DNS才能让它刷新?

不建议。反复修改会让结果更难判断,也可能重新产生不同缓存。先记录权威DNS、公共DNS、本地DNS和TTL,再根据差异定位是哪一层没有更新。

常见问题

DNS修改后多久算生效?

没有统一固定时长。应先查询权威DNS,再对比多个公共DNS和本地结果;TTL与否定缓存会影响不同网络看到新值的时间。

为什么权威DNS是新IP,本机还是旧IP?

优先检查本地DNS缓存、路由器缓存、浏览器、VPN或网络客户端。Windows可执行 ipconfig /flushdns 后重新查询。

DNS已经生效,为什么网站仍打不开?

DNS只负责把名称解析到记录值,网站仍可能受服务器、端口、SSL、Host配置或IPv6问题影响。

只测试A记录够不够?

不够。网站可能使用AAAA,邮件使用MX,域名验证使用TXT,委派使用NS;应测试实际修改的记录类型。

相关阅读

参考资料

  1. Microsoft:nslookup命令
  2. Microsoft:ipconfig命令
  3. Google:Get Started with Public DNS
  4. Google:Public DNS Troubleshooting
  5. Apple:Change DNS settings on Mac
  6. RFC 2308:Negative Caching of DNS Queries
  7. RFC 9520:Negative Caching of DNS Resolution Failures