各个进程如何使用 DNS?

各个进程如何使用 DNS?

当将 FQDN 或计算机名称解析为本地网络 (mycompany.internal) 上的 IP 地址时,我可以使用命令行上的 dig (linux/mac) 或 nslookup (windows) 来查询配置的服务器并获取响应。但尝试在 ping 命令或 Web 浏览器中输入 FQDN 或甚至只是计算机名称都会导致“未知主机”或 DNS 错误。以下是 Mac 上的一个示例:

mac:~ atroon$ dig server.mycompany.internal


; <<>> DiG 9.6.0-APPLE-P2 <<>>
server.mycompany.internal ;; global
options: +cmd ;; Got answer: ;;
->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5219 ;; flags: qr aa rd
ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0,
ADDITIONAL: 0

;; QUESTION SECTION:
;server.mycompany.internal.  IN A

;; ANSWER SECTION:
server.mycompany.internal. 1200 IN A 172.16.254.36

;; Query time: 0 msec ;; SERVER:
172.16.254.8#53(172.16.254.8) ;; WHEN: Wed Dec 16 11:39:15 2009 ;; MSG SIZE 
rcvd: 55

mac:~ atroon$ ping server.mycompany.internal<br>
ping: cannot resolve server.mycompany.internal: Unknown host

我无论如何也想不出这个问题。DNS 服务器是一个 SBS 2003 盒子,它为小型公司网络处理 AD、一些文件/打印等。这个问题每周发生在我身上大约三次,当我直接连接到本地网络时,甚至使用与服务器相同的交换机。我可以使用 IP 地址建立任何我想要的连接,但无法使 DNS 工作。此外,在我遇到这个问题的同时,其他用户都很好,这让我认为这是我的 Mac 上的问题。但是什么问题?为什么 dig 可以发送查询并得到回复,而 ping 却说“未知主机”?

我在这里发布与 serverfault 相关的帖子是因为我认为这是本地问题而不是服务器问题...但是如果有人能指出服务器的问题,我想我们会沿着街道前往一个或两个域。

答案1

根据您使用的 Mac OS X 版本,系统处理 DNS 的方式已经发生改变。

本质上,Mac OS X 中有两种 DNS 解析机制。一种/etc/resolv.conf是标准 UNIX 方法()dig,另一种是系统其余部分使用的方法。

在 Mac OS X 10.4 和 10.5 中,这两种方法联系得更加紧密;刷新其中一种方法往往会刷新两种方法。然而,在 10.6 中以及在较小程度上在 10.5 中,可能会给dig您正确的值,而系统解析机制仍然有错误的值。

要刷新 Mac OS X 各个版本的 DNS 缓存:

  • 10.4:lookupd -flushcache
  • 10.5:dscacheutil -flushcache
  • 10.6:sudo dscacheutil -flushcache或者sudo killall -HUP mDNSResponder(第一个命令现在应该为您执行第二个命令,但在 10.6 的早期版本中似乎没有这样做)

ping如果我记得使用系统查找 - 那么不同的解析机制。/etc/resolv.conf将始终按顺序使用 DNS 服务器,而mDNSResponder尝试变得“智能”,这可能会根据您的设置给您带来麻烦。

另外,您的 Mac 上是否指定了多个 DNS 服务器和/或通过 DHCP 指定了多个 DNS 服务器?Snow Leopard 引入了一种不同的行为(错误?),DNS 服务器的顺序会发生变化。这会对拆分 DNS(在内部使用一个 IP,但在外部使用不同的 IP)造成严重破坏,因为有时它会先停止询问内部 DNS 服务器,然后再询问第二台服务器(这次是外部服务器)。据说这是一种联系最快 DNS 服务器以避免 DNS 相关延迟的方法。10.6.3 之前最简单的修复方法是仅通过 DHCP 为内部 DNS 服务器提供服务,并确保 DNS 服务器上的转发设置已正确设置。

从 10.6.3 开始,可以告诉 mDNSResponder 始终使用正确的顺序,而不是尝试优化 DNS 请求时间。您可以通过在StrictUnicastOrderingmDNSResponder 的 Launch Daemon plist 中添加密钥并将其设置为 true(并根据需要重新加载)来实现此目的。

在 Mac OS X v10.6 中,默认的 DNS 服务器搜索行为是,当某个服务器未返回结果(查询返回 SERV_FAIL)且有其他服务器可供查询时,该服务器将在搜索顺序中暂时禁用约三十秒。如果查询有多个服务器,并且所有服务器都返回了 SERV_FAIL,则将按照服务器被禁用的顺序进行查询(即,将首先使用被禁用时间最长的服务器)。

(来源:support.apple.com并感谢 Yar 在我之前把这个贴出来。)

您可以通过运行以下命令来自动执行此操作(比 Apple 的命令更快、更容易):

sudo /usr/libexec/PlistBuddy -c "Add :StrictUnicastOrdering bool true" /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

并通过运行来逆转它:

sudo /usr/libexec/PlistBuddy -c "Delete :StrictUnicastOrdering" com.apple.mDNSResponder.plist

完成上述操作后,您需要在 launchd 中重新加载作业,以通过运行以下命令重新启动 mDNSResponder:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
进而
sudo launchctl load /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

答案2

最后,感谢 10.6.3 和有点摆弄。基本上你修改com.apple.mDNSResponder.plist然后重新启动 dnsresponder。

我可能是错的,但我认为说明不对,应该按照开头sudo cp说的去做。sudo mv

答案3

查看其中的内容,/etc/resolv.conf了解您的 Mac 正在使用哪些名称服务器。您还可以在网络偏好设置中添加名称服务器 - 选择您正在使用的适配器,单击“高级...”按钮,然后单击“DNS”选项卡。

在 Mac 上,刷新 DNS 缓存的命令行工具是:

dscacheutil -flushcache

更新

我发现了很多好东西Discussions.apple.com 上的这个主题。 例如:

dig(1)(以及 host(1) 和 nslookup(1))都直接使用 DNS 解析器,因此 DNS 服务器排序存在于 /etc/resolv.conf 中。

但是,ping(8) 使用内部 Mac OS X 名称解析系统,该系统使用“超级 DNS 搜索客户端”,该客户端使用可通过 scutil --dns 列出的结果来排序查询。

sudo killall -INFO mDNSResponder您可以通过运行并查看来查看已缓存的内容/var/log/system.log

答案4

大多数应用程序都依赖于 DNS 客户端服务(好吧,它们依赖于使用该服务的操作系统……)——我会仔细检查它是否仍在运行。当您遇到问题时,甚至可以重新启动该服务。

您也可以尝试清除 DNS 缓存,但请注意,某些应用程序(尤其是 Web 浏览器)会在内部缓存 DNS 条目,因此您可能也需要重新启动它们。

ipconfig /flushdns

最后,恶意软件可能会导致事情变得混乱。许多恶意软件会劫持 DNS 或某些主机。可能也值得检查一下。

相关内容