DNS

Mac 上 DNS 无法解析

DNS 出故障时,Mac 无法把 apple.com 这样的名称转换成 IP 地址。网络连接可能正常,但所有通过名称访问的网站都会失败。

适用于:“系统设置”步骤适用于 macOS 13 Ventura 及更高版本。“终端”命令适用于所有当前 macOS 版本。核查日期:2026年10月29日

症状

  • 浏览器对许多网站显示“找不到服务器”或类似错误。
  • “终端”工具显示“Could not resolve host”或“nodename nor servname provided”。
  • 使用 IP 地址的 App 仍然正常,但名称无法使用。
  • 问题出现在切换网络、连接 VPN 或设置自定 DNS 服务器之后。

可能的原因

  • 没有连接。Mac 没有可用的互联网路径,DNS 查询发不出去。
  • DNS 服务器有误或无法访问。手动填写的 DNS 服务器可能已停止工作,或在当前网络上被屏蔽。
  • 路由器的 DNS 出故障。许多网络会把 DNS 查询发给路由器。如果路由器不再响应,所有设备都无法解析名称。
  • VPN、描述文件或过滤器更改了 DNS。VPN、加密 DNS 描述文件和内容过滤器可能会把查询发往其他服务器。
  • 缓存中的旧回答。Mac 会把回答保留一段时间。网站迁移后,旧回答可能导致访问失败。

如何检查

  1. 确认网络连接正常:ping 一个 IP 地址,这样不会用到 DNS。

    ping -c 3 1.1.1.1
  2. 再 ping 一个名称。如果 IP 地址正常而名称失败,问题就出在 DNS。

    ping -c 3 apple.com
  3. 向 macOS 解析器查询一个名称。这与大多数 App 走的是同一路径。

    dscacheutil -q host -a name apple.com

    输出 ip_address 和 ipv6_address 行。没有这些行即表示查询失败。

  4. 显示 macOS 当前使用的 DNS 配置。第一个解析器是默认解析器。

    scutil --dns
  5. 显示在 Wi-Fi 服务上手动设置的 DNS 服务器。

    networksetup -getdnsservers Wi-Fi

    输出 一组 IP 地址,或者提示未设置 DNS 服务器,此时由网络提供服务器。

如何修复

  1. 移除手动填写的 DNS 服务器。选取苹果菜单 >“系统设置”>“网络”。

  2. 点按网络服务,点按“详细信息”,然后点按“DNS”。选择每个手动添加的服务器,然后点按移除按钮。

  3. 也可以在“终端”中清除它们:用 empty 一词代替服务器地址。

    networksetup -setdnsservers Wi-Fi empty

    需要管理员密码。

  4. 清除 DNS 缓存。请参阅在 Mac 上刷新 DNS 缓存。

    sudo killall -HUP mDNSResponder

    需要管理员密码。

  5. 从路由器获取新的地址和新的 DNS 服务器。请参阅在 Mac 上续租 DHCP。

  6. 暂时断开 VPN 进行测试。如果名称随后能解析,请检查 VPN 的 DNS 设置。请参阅Mac 上 DNS 查询绕过了 VPN。

  7. 如果所有设备的 DNS 都失败,请重启路由器。

使用 Kilobat

  1. Kilobat 会测量一次 DNS 查询并列出正在使用的解析器。请查看 dnsMilliseconds、dnsServers 和 captivePortal。

    kilobat diagnose --json
  2. 针对某个网站或 API,找出失败的那一层。它会先检查 DNS,再检查连接。

    kilobat why api.example.com
  3. CLI 免费。在 App 中,“健康”标签页会显示 DNS 服务器和查询耗时。请参阅找出某个网站或 API 连不上的原因。

常见问题

为什么 ping 1.1.1.1 正常,网站却打不开?

ping IP 地址不会用到 DNS。如果它正常而名称失败,问题出在 DNS,而不是连接。

为什么 dig 正常,App 却失败?

dig 会把查询发给 /etc/resolv.conf 中的服务器。App 使用的是 macOS 解析器,它还可能用到 VPN 和按域名设置的规则。

路由器会重新提供 DNS 服务器吗?

会。“网络”设置中的 DNS 列表为空时,macOS 会使用网络通过 DHCP 提供的服务器。

参考资料

参考资料核查于 2026年10月29日。man 手册页为 macOS 自带版本;在“终端”中用 man <name> 打开。