← 返回文章列表
POST / 2024-11-21

macOS 清除 DNS 缓存

介绍 macOS DNS 缓存异常的常见表现、清理方法、验证方式,以及 macOS 12 Monterey 之后各版本适用的命令。

在域名更换 IP、修改 DNS 记录或调整本机 hosts 文件后,Mac 有时仍会访问旧地址。这通常不是配置没有生效,而是系统、浏览器或上游 DNS 服务器仍保留着旧的解析结果。

本文介绍如何清除 macOS 的本机 DNS 缓存

问题背景

DNS(Domain Name System)负责把 example.com 这样的域名转换成 IP 地址。为了减少重复查询并提高访问速度,macOS 会暂时缓存解析结果。缓存一般会在记录的 TTL 到期后自动失效,但在以下场景中,我们往往不想等待:

  • 域名刚刚切换到新服务器,Mac 仍访问旧 IP;
  • 修改了 /etc/hosts,但应用中的结果没有变化;
  • 更换了 DNS 服务器、Wi-Fi 或 VPN 后,域名仍无法解析;
  • 网站在其他设备上正常,只有当前 Mac 打不开;
  • 本地开发环境出现 DNS_PROBE_FINISHED_NXDOMAIN、解析超时或错误跳转。

需要注意:清除 DNS 缓存不是通用的“断网修复”方案。服务器故障、代理或 VPN 配置错误、上游 DNS 尚未更新、域名本身配置错误等问题,都不能靠刷新本机缓存解决。

macOS 12 及之后版本

适用于以下版本:

  • macOS 26 Tahoe
  • macOS 15 Sequoia
  • macOS 14 Sonoma
  • macOS 13 Ventura
  • macOS 12 Monterey

打开“终端”(可通过 Spotlight 搜索),执行:

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

输入当前用户的管理员密码后按回车。输入密码时终端不会显示字符或星号,这是正常的安全设计。命令成功执行时通常也不会显示确认信息。

这条命令包含两个操作:

  • dscacheutil -flushcache:清理目录服务缓存,其中包括主机名解析缓存;
  • killall -HUP mDNSResponder:向 macOS 的 DNS 响应进程发送 HUP 信号,使其重新加载并丢弃已有缓存。

这里的 killall 并不是卸载或永久关闭 DNS 服务,系统会继续正常处理后续解析请求。

其他 macOS / OS X 版本

不同历史版本使用过不同的 DNS 服务,命令不能完全通用。

macOS / OS X 版本 使用的命令
macOS 11 Big Sur sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
macOS 10.15 Catalina sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
macOS 10.14 Mojave sudo killall -HUP mDNSResponder
macOS 10.13 High Sierra sudo killall -HUP mDNSResponder
macOS 10.12 Sierra sudo killall -HUP mDNSResponder
OS X 10.11 El Capitan sudo killall -HUP mDNSResponder
OS X 10.10 Yosemite sudo discoveryutil mdnsflushcache; sudo discoveryutil udnsflushcaches
OS X 10.9 Mavericks sudo killall -HUP mDNSResponder
OS X 10.8 Mountain Lion sudo killall -HUP mDNSResponder
Mac OS X 10.7 Lion sudo killall -HUP mDNSResponder
Mac OS X 10.6 Snow Leopard sudo dscacheutil -flushcache
Mac OS X 10.5 Leopard sudo lookupd -flushcache
Mac OS X 10.4 Tiger lookupd -flushcache

Yosemite 在不同小版本中使用过不同组件。如果上述命令不可用,应先通过“关于本机”确认具体系统版本。

如何验证效果

先查询系统当前使用的解析结果:

dscacheutil -q host -a name example.com

example.com 替换成实际域名。清理缓存后再次执行该命令,并观察返回的 IP 是否已经变化。也可以直接测试目标服务:

curl -I https://example.com

刷新成功后,下一次访问会重新发起 DNS 查询。通常可以解决“仍访问旧服务器”“本机解析结果与其他设备不一致”等由本机缓存造成的问题。首次访问可能略慢,这是重新查询带来的正常现象,之后会再次建立缓存。

清理后仍未生效怎么办

DNS 解析可能在多层位置被缓存。系统缓存已清理但问题仍存在时,可以按下面的顺序排查:

  1. 完全退出并重新打开浏览器或相关应用,避免继续使用应用自身的 DNS 或连接缓存;
  2. 暂时停用代理、VPN、广告过滤或安全软件后重试;
  3. 检查 /etc/hosts 中是否存在同名记录;
  4. 使用 dig example.com 查看 DNS 服务器返回的记录,确认新记录是否已经传播;
  5. 断开并重新连接网络,必要时重启路由器或更换 DNS 服务器;
  6. 检查权威 DNS 记录、TTL 和域名解析配置是否正确。

dig 主要用于查看指定 DNS 服务器的回答,并不等同于查询 macOS 应用最终使用的系统缓存结果。因此,排查时最好将它与 dscacheutil 的结果结合起来看。

最终效果与边界

清理操作只影响当前 Mac 上的本地缓存,不会修改域名记录,也不会清除路由器、运营商 DNS、公共 DNS 或其他设备上的缓存。它能够让本机尽快重新查询,但不能让尚未完成的全球 DNS 传播瞬间完成。

如果新记录已经由上游 DNS 正确返回,刷新后通常会立即生效;如果上游仍返回旧记录,则需要等待 TTL 到期或修正 DNS 配置。

参考资料