# Mac 怎么清除 DNS 缓存

> 清除 macOS DNS 缓存的终端命令，什么时候清了有用，什么时候真正的原因是代理、VPN、浏览器缓存或 /etc/hosts，以及怎么确认结果。

Published: 2026-10-11 | Updated: 2026-10-17

Mac 清除 DNS 缓存，从**应用程序 › 实用工具**打开**终端**，运行下面这一行：

```shell
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
```

按提示输入登录 Mac 的密码，成功时不会有任何输出；重启 Mac 也能清掉缓存，[Apple 关于 DNS 缓存的文章](https://support.apple.com/101481)里就写着，可以重新启动 Mac 来更新缓存的信息。

这篇 Apple 文章已经归档，不再更新，里面最新的一条是给 OS X Yosemite 10.10.4 及更高版本的 `sudo killall -HUP mDNSResponder`，`dscacheutil -flushcache` 则是它列给 Snow Leopard 的命令。Apple 之后没有发过新版说明，所以上面那一行两条都跑：`killall` 那半句是 Apple 给当前系统列的做法，`dscacheutil -flushcache` 按它的手册页（`man dscacheutil`）是清空目录服务缓存，手册还说只该在极端情况下用，DNS 记录过期正好算一种。Mole Mac 不做清除 DNS 缓存这件事，这是终端里的操作。

## DNS 缓存是什么

App 要连 `example.com` 时，macOS 得先把名字换成 IP 地址，在 Mac 上，这一步交给 `mDNSResponder`，它的手册页（`man mDNSResponder`）说，它替其他进程发 DNS 查询，并保存一份答复的缓存。

有了缓存，重复查同一个名字就省掉一来一回，每条答复按域名 DNS 记录允许的时长保留，到期再重新查。大多数时候这一切没人察觉，出问题是在缓存里的答案还没到期就已经过时了：网站搬到了新服务器，你换了 DNS 服务器，或者某次查询失败了，这个失败结果还在被反复使用。

`killall -HUP mDNSResponder` 里的 `-HUP` 是选 `killall` 发哪个信号，不加的话 `killall` 默认发 TERM（`man killall`），Apple 列出的重置 DNS 缓存的写法就是 HUP 这一种，所以别省掉这个参数，也别换成 `-9`。

## 什么时候清 DNS 缓存有用

| 情况 | 为什么有用 |
|---|---|
| 网站或服务器换了地址，你的 Mac 还连到旧地址 | 缓存里的答案还没过期 |
| 你在网络设置里换了 DNS 服务器 | 之前那台服务器给的答案还留在缓存里 |
| 改了 `/etc/hosts`，却没生效 | `hosts` 手册页说这个文件由 mDNSResponder 读取，它手里可能还是之前的答案 |
| 一分钟前某个网站解析失败，别的设备能打开，这台 Mac 还是失败 | 失败的查询结果可能被缓存了 |

## 什么时候清了也没用

清缓存只清 Mac 自己解析器里的缓存，下面几种常见情况跟它无关：

- **代理**：流量走 HTTP 或 SOCKS 代理时，名字常常由代理自己解析，用 `scutil --proxy` 可以看当前的系统代理配置。
- **VPN**：VPN 可能装上自己的 DNS 服务器，或者只把部分域名交给它们解析，`scutil --dns` 会列出所有在用的解析器，带域名的补充解析器只负责那个域名，公司内网域名打不开时，要查的是 VPN 的 DNS。
- **浏览器自己的缓存**：浏览器可能留着自己的短期 DNS 结果，还会复用已经打开的连接，清完之后把浏览器彻底退出再打开，光刷新标签页不够。
- **上游缓存**：路由器和 DNS 服务商也会缓存答案，清 Mac 的缓存没法让它们早点去取新记录。
- **网站本身挂了**，或者在你的网络里被拦了，换一个网络的其他设备也打不开，原因就不在这台 Mac 的 DNS 上。

如果只是网页加载慢、不是打不开，DNS 缓存很少是瓶颈，更可能的原因见[Mac WiFi 卡顿](https://mole.fit/zh/blog/mac-wifi-stutter-awdl)和[哪个 App 在用 Mac 的网络](https://mole.fit/zh/blog/what-app-is-using-my-network-mac)。

## 看看 Mac 实际解析出了什么

用系统解析器查，得到的是 App 拿到的那个答案：

```shell
dscacheutil -q host -a name example.com
```

`dscacheutil` 手册页说，`-q` 通过标准调用发起查询，结果要么来自缓存，要么现取。

再直接问 DNS 服务器：

```shell
dig example.com
```

`dig` 不经过 macOS 的解析器，它的手册页说它用 `/etc/resolv.conf` 里列的服务器，而 macOS 上这个文件开头就写着，系统里大多数进程做 DNS 解析时并不读它。所以 `dig` 给出新地址、`dscacheutil` 还是旧地址，差别就出在 Mac 的缓存或解析器配置上，清一次缓存应该就好；两边都是旧地址，说明上游的记录还没变过来。

看 Mac 正在用哪些 DNS 服务器：

```shell
scutil --dns
```

手动设置的服务器在**系统设置 › 网络**里，选中一个网络服务，点**详细信息**，再点 **DNS**（[Apple](https://support.apple.com/guide/mac-help/change-dns-settings-on-mac-mh14127/mac)）。

## 怪缓存之前，先看 /etc/hosts

`/etc/hosts` 里写了的名字会绕过 DNS，开发工具、广告拦截工具和一些老教程会往里加几行，然后就忘在那里了，查看它：

```shell
cat /etc/hosts
```

正常的文件只有几行 `localhost` 和以 `#` 开头的注释，如果里面出现了那个出问题的域名，它为什么解析成那样就清楚了。只改那一行，用 `sudo` 运行编辑器，改之前留一份原文件，改完再清一次缓存，`localhost` 那几行别删。

## 确认结果

1. 运行清缓存的命令。
2. 对出问题的域名再跑一次 `dscacheutil -q host -a name example.com`，看地址对不对。
3. 把出问题的浏览器或 App 退出再打开。
4. 还不行，就对照 `dig`、`scutil --dns` 和 `scutil --proxy`，看到底是哪一层在回答。

## 不要这样做

- 不要定时清 DNS 缓存，也别把它当提速技巧，缓存热着查询更快，清空后头几次反而更慢。
- 不要删 `/etc/hosts`，也不要改它的权限。
- 用着 VPN 或管理描述文件的公司、学校 Mac，不要自己换 DNS 服务器，先问管理的人，内网名字可能就解析不了了。
- 不要为了「测试 DNS」去改代理或 VPN 设置，先弄清是哪一层在回答。

## 常见问题

### Mac 怎么清除 DNS 缓存？

在终端运行 `sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder`，输入密码就行，重启 Mac 也能清掉。

### 现在的 macOS 清 DNS 缓存用什么命令？

Apple 已归档的文章给 OS X 10.10.4 及更高版本列的是 `sudo killall -HUP mDNSResponder`，之后没有发新的说明，前面再加一句 `sudo dscacheutil -flushcache` 是常见写法，清掉的只是缓存数据。

### 清 Mac 的 DNS 缓存会顺带清浏览器缓存吗？

不会，它只清 macOS 解析器的缓存，浏览器要退出再打开，才不会继续用它自己的 DNS 结果和已经打开的连接。

### 清完缓存，网站为什么还是去旧地址？

查一下 `/etc/hosts`、代理或 VPN，再看 `dig` 有没有拿到新地址，上游的 DNS 记录还没变的话，本地怎么清都没用。

### Mole 能清 DNS 缓存吗？

不能，Mole Mac 没有清除 DNS 缓存的功能，用上面的终端命令，或者重启 Mac。

---

Canonical HTML page: https://mole.fit/zh/blog/how-to-flush-dns-cache-mac
Blog index for agents: https://mole.fit/zh/blog/llms.txt
Site index for agents: https://mole.fit/llms.txt
