更改 Mac El Capitan 上的 DNS 搜索顺序

Bri*_*ick 4 networking dns private-network osx-el-capitan macos

我有一个路由器,它也在运行一个 DNS,其中包含本地网络上机器的名称。它设置为转发请求,因此对于任何公共机器,它都会访问我的 ISP 提供的 DNS。路由器配置为主要 DNS,而 ISP 的 DNS 列为辅助 DNS。我有几台具有静态 IP 的机器(那些在我的私有 DNS 中有条目的机器)。其他机器,包括作为这个问题主题的 Mac,通过 DHCP 获取它们的地址。

此网络上的 Windows 机器运行良好。他们将私有名称解析为我网络上的机器,并且还可以访问公共互联网。

我的单台 Mac 笔记本电脑不工作。它可以毫无问题地访问公共互联网,但它没有访问我的内部 DNS 来获取内部名称。例如,如果我对内部机器执行 ping 操作

ping internal.example.com
Run Code Online (Sandbox Code Playgroud)

我收到了数据包,但它显示了一个对应于 Hover 的 IP 地址。(显然 Hover 正在为没有公共路由的任何子域放置一个登录页面。)如果我这样做

nslookup internal.example.com
Run Code Online (Sandbox Code Playgroud)

但是,我在本地网络上获得了机器的正确(内部)IP。

最后,如果我再次执行 ping 但这次强制它使用我的内部 DNS (192.168.1.2),

ping internal.example.com 192.168.1.2
Run Code Online (Sandbox Code Playgroud)

我从本地网络上正确机器得到响应。这似乎表明即使“本地”方法也可以做我想做的事,只要它使用正确的 DNS。

我找到了很多讨论这个问题的文章,但到目前为止我实际发现的要么已经过时,要么不是我的问题的完整解决方案。到目前为止我拼凑的东西:

  • 在几次操作系统升级过程中,Apple 一直在改变其 DNS 解析方法,因此在线答案很快就会过时。
  • 从 El Capitan 开始,Mac 具有(至少)两个同时运行的 DNS 解析方案。这与从 ping 和 nslookup 获得不同的结果有关,如上所述。在“通常的”linux 系统上运行的命令行实用程序似乎至少在他们的手册页上记录了这一点,通常在标题为“Mac OS X Notice”之类的部分下。不幸的是,在不一一检查的情况下,不清楚哪些实用程序使用了哪些实用程序。(到目前为止,看起来 nslookup 和 dig 使用 linux 方法,而 ping 使用 Mac OS 的“本机”。)
  • 这是“本地”DNS 方法的(或多或少)记录功能,它动态选择要使用的 DNS。这尤其意味着,出现在窗口中的顺序(如网络控制面板)或路由器(在我的情况下)指定的顺序不受尊重。
  • sudo killall -INFO mDNSResponder使用命令行上的命令从“本机”DNS 工具中获取了一些信息。将消息转储到/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 的解决方案。

Spi*_*iff 14

macOS 有一个复杂的 DNS 请求路由系统(“范围查询”),以处理像 VPN 这样的情况,在这种情况下,您可能希望对您作品域名的请求通过您的 VPN 隧道,以便您从作品的内部 DNS 服务器获得答案,它可能比您工作的外部 DNS 服务器具有更多/不同的信息。

要查看 macOS 使用的所有 DNS 服务器,以及如何设置查询范围,请使用:

scutil --dns
Run Code Online (Sandbox Code Playgroud)

要以 macOS 的方式查询 DNS,请使用:

dns-sd -G v4v6 example.com
Run Code Online (Sandbox Code Playgroud)

…或者…

dns-sd -q example.com 255 255
Run Code Online (Sandbox Code Playgroud)

请参阅手册页scutil(8)dns-sd(1)获取更多信息。

DNS的故障排除工具,例如nslookup(1)dig(1)host(1)包含自己的DNS解析程序代码,并没有利用系统的DNS查询的API,所以他们没有得到系统的行为。如果您没有指定供他们使用的 DNS 服务器,他们可能只会使用 中列出的服务器之一/etc/resolv.conf,该服务器是自动生成的,并且仅包含用于无作用域查询的默认 DNS 服务器。

非特定于 DNS 的传统 Unix 命令行工具(例如ping(8))可能会调用传统gethostbyname(3)API,而后者在 macOS 上利用系统的 DNS 解析器行为。

要查看您的 DHCP 服务器告诉您的 Mac 使用什么,请查看以下domain_name_server输出中的行:

ipconfig getpacket en0
Run Code Online (Sandbox Code Playgroud)

(将 en0 替换为正确的 BSD 样式接口名称,如您在 中看到的那样ifconfig

请注意,我很确定 DNS RFC 不需要 DNS 实现来考虑按偏好排列的服务器列表。尽管 DNS 实现以这种方式对待它们是很常见的,但如果相关标准中没有规定,依赖所有实现都以这种方式实现事物可能是不明智的。

哦,还要注意您的 Mac 也可能从 IPv6 路由器广告或 DHCP6 获取 DNS 服务器列表,如果它们在您的网络上处于活动状态。当然还有 VPN 设置、已安装的配置文件、Open Directory、Active Directory 等,如果其中任何一项在您的环境中使用的话。