各个进程如何使用 DNS?

atr*_*oon 6 networking mac dns macos

将 FQDN 或机器名称解析为本地网络 (mycompany.internal) 上的 IP 地址时,我可以在命令行 (linux/mac) 或 nslookup (windows) 上使用 dig 来查询配置的服务器并获得响应。但是尝试在 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
Run Code Online (Sandbox Code Playgroud)

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

我在这里发帖 vs. serverfault 是因为我认为这是一个本地问题而不是服务器问题……但是如果有人能指点我在服务器上,我想我们会在街上走一两个域。

Che*_*ion 12

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

本质上,Mac OS X 中有两种 DNS 解析机制。标准的 UNIX 方法 ( /etc/resolv.conf) 被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 -flushcachesudo killall -HUP mDNSResponder(第一个命令现在应该为你执行第二个命令,但在 10.6 的早期版本中似乎没有)

ping如果我记得使用系统查找 - 那么不同的解决机制。/etc/resolv.conf将始终按顺序使用 DNS 服务器,而mDNSResponder尝试变得“聪明”,这可能会根据您的设置在后面咬您。

此外,您是否在 Mac 上和/或通过 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