如何在macOS上刷新DNS缓存(Sequoia、Sonoma、Ventura)

学习如何使用一条终端命令清除macOS上的DNS缓存。修复域名更改后的过时DNS记录、重定向失效以及奇怪的解析问题。

DNS缓存问题很容易被误诊。您更新了域名记录,等待传播完成,然后打开浏览器,旧网站仍然加载。或者曾经能正常访问的网站突然拒绝连接。服务器没问题,您的网络没问题,问题是您的Mac缓存了一个过时的DNS答案,并且仍然在使用它。

刷新DNS缓存会告诉macOS忘记那些存储的答案,重新从头开始查询。只需一条命令,大约五秒钟。

为什么Mac要缓存DNS记录

每次您访问网站时,Mac都需要将域名(如example.com)转换为IP地址。这个转换过程是这样的:Mac首先检查本地DNS缓存,然后询问DNS解析器(通常是您ISP的服务器或公共解析器如1.1.1.1),如果两者都没有答案,解析器会联系该域名的权威名称服务器。

缓存通常是好事。它能加快浏览速度,因为您的Mac可以跳过最近访问过的网站的整个查询链。问题出现在DNS记录更改时,Mac缓存的答案仍然指向旧目的地。DNS记录上的TTL(存活时间)告诉解析器缓存多长时间,但macOS并不总是精确遵守它。

DNS刷新实际上能解决什么问题

并非每个网络问题都是DNS缓存问题。刷新在以下情况下有帮助:

  • 您刚更改了域名的DNS记录,但Mac仍在解析到旧IP
  • 即使DNS更改已在其他地方传播,网站仍重定向到错误的位置
  • 您从VPN或自定义DNS设置切换后,某些域名解析不正确
  • 一个确实存在的域名在您的机器上返回"找不到服务器",但在其他地方解析正常

如果网站只是很慢,或者连接超时,或者您遇到TLS错误,刷新DNS可能没有帮助。这些是不同的问题。

在macOS上刷新DNS缓存的命令

最近几个macOS版本的命令是相同的。打开终端(在"应用程序 > 实用工具"中找到,或用Spotlight搜索),然后运行:

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

提示时输入您的密码。终端在您输入时不会显示字符,这是正常的。成功时您不会看到任何确认输出,这也是正常的。

此命令适用于:

  • macOS Sequoia(15.x)
  • macOS Sonoma(14.x)
  • macOS Ventura(13.x)

如果您仍在使用Monterey或Big Sur,它同样适用。

这条命令做了两件事。dscacheutil -flushcache清除目录服务缓存,其中包含DNS缓存。killall -HUP mDNSResponder向macOS的DNS响应器进程发送信号,告诉它重新加载。两者都需要。仅运行dscacheutil在旧版macOS上曾经足够,但多年前就不再有效了。

sudo前缀是必要的,因为这些是系统级操作。没有它,两条命令都会静默失败或返回权限错误。

验证刷新是否生效

刷新后,打开一个新的浏览器标签页并访问您遇到问题的域名。如果问题是缓存过时,您应该能看到正确的网站。

要进行更确定的检查,您可以执行DNS查询并确认获得的IP地址与您期望的一致。NetUtil的DNS查询工具使这一操作变得简便:打开应用,进入DNS查询,输入域名,然后运行查询。结果显示您的Mac现在解析到的A记录(IPv4地址)或AAAA记录(IPv6地址)。如果IP与您更新的DNS记录匹配,说明刷新生效且新记录已被采用。

如果您看到旧IP,问题不在于您的本地缓存,可能是上游解析器仍在传播中,或者DNS更改尚未完全生效。在这种情况下,等待几分钟后再试。

您也可以直接在终端中使用nslookup example.comdig example.com来检查解析到的IP。

一次刷新,搞定

在macOS上刷新DNS只需一行命令,几秒钟即可完成。结果不会以任何可见的方式持续存在,它只是清除了过时的缓存答案,让Mac重新开始。如果您等待的DNS更改已经传播,刷新后您将立即解析到正确的地址。如果尚未传播,刷新也不会造成任何损害,等传播完成后重新运行一次即可。

NetUtil包含DNS查询工具,以及Ping、路由追踪、Whois、端口扫描和Netstat。这是一款免费的macOS应用,替代了Apple在macOS Big Sur中移除的"网络实用工具"。