DNS

连接 VPN 时内部名称无法解析

macOS 可以把某个域名的查询发给一个 DNS 服务器,把其他查询发给另一个。VPN 就是用这种分离 DNS 来解析内部名称的。

适用于:所有当前 macOS 版本。核查日期:2026年10月29日

症状

  • intranet.corp.example 等内部名称无法访问,但公共网站正常。
  • 内部 IP 地址能访问,但它的名称不行。
  • dig 或 nslookup 失败,但浏览器正常,或者反过来。

可能的原因

  • VPN 没有为该域名添加解析器。VPN 必须告诉 macOS 哪些域名要发往它的 DNS 服务器。
  • 测试工具绕过了 macOS 的规则。dig 使用 /etc/resolv.conf 中的服务器,而不是 App 所用的按域名解析器。
  • 手动设置的 DNS 服务器。在 Wi-Fi 上手动设置的 DNS 服务器不认识内部名称。
  • 短名称缺少搜索域。像 intranet 这样的短名称需要搜索域才能变成完整名称。

如何检查

  1. 连接 VPN,显示所有解析器。查找带有公司域名 domain 行的解析器。

    scutil --dns
  2. 通过 macOS 解析器查询该名称,而不是通过 dig。

    dscacheutil -q host -a name intranet.corp.example
  3. 显示该服务的搜索域。

    networksetup -getsearchdomains Wi-Fi

如何修复

  1. 询问管理员 VPN 应使用哪个域名和 DNS 服务器。

  2. 如果按域名解析器的文件夹不存在,就创建它。

    sudo mkdir -p /etc/resolver

    需要管理员密码。

  3. 创建一个以该域名命名的文件。每个服务器在其中写一行 nameserver。

    sudo nano /etc/resolver/corp.example

    需要管理员密码。

  4. 在一行中输入内部 DNS 服务器的地址。

    nameserver 10.0.0.53
  5. 保存文件。运行 scutil --dns,查找新添加的域名。

  6. 使用完整名称,或在“系统设置”>“网络”> 该服务 >“详细信息”>“DNS”中添加搜索域。

  7. 不再需要时,删除该文件。

    sudo rm /etc/resolver/corp.example

    需要管理员密码。

使用 Kilobat

  1. 对于私有名称,why 会说明查询发往了哪个 VPN 解析器,以及该解析器是否应答。

    kilobat why intranet.corp.example

常见问题

为什么浏览器正常,dig 却失败?

dig 询问的是 /etc/resolv.conf 中的服务器。浏览器使用 macOS 解析器,而它还会使用按域名解析器。

可以编辑 /etc/resolv.conf 吗?

不可以。resolver 的 man 手册页说明,此文件由 macOS 自动维护。请使用“网络”设置或 /etc/resolver。

参考资料

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