当将 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 请求时间。您可以通过在StrictUnicastOrdering
mDNSResponder 的 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 或某些主机。可能也值得检查一下。