我有一个路由器,它还运行一个 DNS,其中包含本地网络上机器的名称。它设置为转发请求,因此对于任何公共机器,它都会连接到我的 ISP 提供的 DNS。路由器配置为它是主 DNS,而 ISP 的 DNS 被列为辅助 DNS。我有几台机器(在我的私有 DNS 中有条目的机器)具有静态 IP。其他机器,包括本问题的主题 Mac,通过 DHCP 获取其地址。
此网络上的 Windows 计算机运行正常。它们将私有名称解析为我网络上的计算机,并且还可以访问公共互联网。
我的单台 Mac 笔记本电脑无法正常工作。它可以毫无问题地访问公共互联网,但它无法访问我的内部 DNS 来获取内部名称。例如,如果我对内部机器执行 ping 操作,如下所示
ping internal.example.com
我收到了数据包,但它显示的 IP 地址与 Hover 相对应。(显然,Hover 正在为没有公共路由的任何子域设置登录页面。)如果我这样做
nslookup internal.example.com
然而,我在本地网络上获得了该机器的正确(内部)IP。
最后,如果我再次 ping 但这次强制它使用我的内部 DNS (192.168.1.2),
ping internal.example.com 192.168.1.2
我收到了我的本地网络上的正确机器。这似乎表明,只要使用正确的 DNS,即使是“本机”方法也可以完成我想要的操作。
我找到了很多讨论这个问题的文章,但到目前为止,我发现的内容要么已经过时,要么无法完全解决我的问题。到目前为止,我拼凑起来的内容如下:
- 在几次操作系统升级过程中,Apple 一直在改变其 DNS 解析方法,因此网上的答案很快就变得过时了。
- 从 El Capitan 开始,Mac 至少有两个 DNS 解析方案同时运行。这与从 ping 和 nslookup 获得不同的结果有关,如上所述。在“常见”Linux 系统上运行的命令行实用程序似乎至少在其手册页中记录了这一点,通常在标题为“Mac OS X 注意事项”的部分下。不幸的是,如果不逐一检查,就无法确切知道哪些实用程序使用了哪些。(到目前为止,nslookup 和 dig 似乎使用 Linux 方法,而 ping 则使用 Mac OS 的“原生”方法。)
- 这是“本机”DNS 方法的一个(或多或少)已记录的功能,即它可以动态选择要使用的 DNS。这特别意味着,在网络控制面板等窗口中显示的顺序或路由器指定的顺序(就我而言)不受尊重。
- 我从命令行上的命令中获取了一些“本机”DNS工具的信息
sudo killall -INFO mDNSResponder
。该工具将消息转储到/var/log/system.log
。从该日志消息中可以看出,我的ISP的DNS在该系统中首先列出。(我再次指出,它被列在第二在路由器的配置和网络控制面板中。如果我运行,它也会列在第二位scutil
。) - 我尝试使用 mDNSResponder 刷新缓存
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder;
,但没有帮助。 com.apple.mDNSResponder.plist
我尝试按照这些说明编辑文件(https://www.cnet.com/news/os-x-10-6-3-and-dns-server-priority-changes/),但我无法编辑该文件。(即使使用,也是只读的sudo vi
。)此外,我系统上的文件的内容与这些说明中明确引用的内容不同。
然而,尽管如此,我仍有一台 Mac 无法在网络上正常工作,而网络上还有许多其他运行良好的计算机。我可能会在路由器上删除 ISP 的 DNS,这样它甚至无法提供,但这感觉像是黑客攻击。El Capitan 上有没有好的解决方法?
如果这个问题已经得到解答,我很抱歉。(我觉得它一定在某个地方!)我断断续续地搜索了一整天,但到目前为止还没有在 El Capitan 上找到解决方案。
答案1
macOS 拥有一套复杂的 DNS 请求路由系统(“范围查询”),用于处理 VPN 之类的情况,您可能希望对您工作域名的请求通过 VPN 隧道传输,以便从您工作的内部 DNS 服务器获得答案,而这些服务器可能比您工作外部 DNS 服务器拥有更多/不同的信息。
要查看 macOS 正在使用的所有 DNS 服务器以及如何设置查询范围,请使用:
scutil --dns
要按照 macOS 的方式查询 DNS,请使用:
dns-sd -G v4v6 example.com
…或者…
dns-sd -q example.com 255 255
请参阅手册页scutil(8)
和dns-sd(1)
以获取更多信息。
DNS 故障排除工具(例如nslookup(1)
、dig(1)
和 )host(1)
包含自己的 DNS 解析器代码,不使用系统的 DNS 查询 API,因此它们无法获取系统行为。如果您不指定它们要使用的 DNS 服务器,它们可能只会使用 中列出的服务器之一/etc/resolv.conf
,该服务器是自动生成的,仅包含无范围查询的默认 DNS 服务器。
传统的 Unix 命令行工具并非特定于 DNS,例如ping(8)
,可能会调用传统gethostbyname(3)
API,在 macOS 上,这些 API 利用系统的 DNS 解析器行为。
要查看 DHCP 服务器告诉 Mac 使用什么,请查看domain_name_server
输出中的以下行:
ipconfig getpacket en0
(将 en0 替换为您在 中看到的正确的 BSD 样式接口名称ifconfig
)
请注意,我很确定 DNS RFC 不要求 DNS 实现考虑按优先顺序排列服务器列表。尽管 DNS 实现通常以这种方式处理它们,但如果相关标准中没有指定,那么依赖所有实现都以这种方式实现可能并不明智。
哦,还请注意,如果您的网络上启用了 IPv6 路由器广告或 DHCP6,您的 Mac 还可能从这些广告或 DHCP6 获取 DNS 服务器列表。当然,如果您的环境中使用了其中任何一项,则还会获取 VPN 设置、已安装的配置文件、Open Directory、Active Directory 等。