DNS查找失败,例如使用“ ping”,但可以使用“ host”


35

我正在使用pfSense 2.0rc3,并将其设置为DNS转发器并启用了“在DNS转发器中注册DHCP租约”,据我所知,所有这些设置都是获取DNS服务器进行本地查找的适当方法。

它可以在Linux上正常运行host abc,特别是我可以运行和ping abc(和其他应用程序),它们都可以正常运行。

但是,在Mac OS X Lion 10.7中,它无法按预期工作。特别是,只有使用该host命令的查找才起作用,即

$ ping abc
ping: cannot resolve abc: Unknown host

$ host abc
abc.local has address 192.168.1.128

$ ping abc.local
ping: cannot resolve abc.local: Unknown host

$ host abc.local
abc.local has address 192.168.1.128

为什么abc在使用host命令时查找工作正常,但对ping(和其他应用程序)却失败?

谢谢阅读。


我最终在新的优胜美地(10.10)MBP上遇到了同样的情况。经过大量搜索和配置后,下面的解决方案起作用:apple.stackexchange.com/a/152892对于没有任何--AlwaysAppendSearchDomains配置的记录
Stan Kurdziel

Answers:


26

我不知道为什么他们要做出这样的改变,但这使我发疯了一段时间。

我不知道为什么主机能正常运行,但无法ping通,但我认为这与这两个实用程序的性质有关。Ping是一个简单(尽管非常有用)的诊断实用程序,用于将应回送给您的数据包丢到网上。主机名查找功能只是这项工作的副作用,已移交给系统的递归解析器(我相信-我尚未通过检查链接库或任何此类的内容来进行验证)。主机的主要工作是进行DNS名称解析,因此它实现了自己的递归解析器。

苹果的递归解析器是mDNSResponder。出于某种原因,Lion中的mDNSResponder版本需要“ -AlwaysAppendSearchDomains”命令行选项才能像在Snow Leopard中一样运行(至少)。

这是修复它的快速方法:

sudo sed -i .orig '/ProgramArguments/,/<\/array>/ {
s/\(<string>-launchd<\/string>\)/\1\
                <string>-AlwaysAppendSearchDomains<\/string>/
}' /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

(上面倒数第二行的开头应该有两个制表符,但是我不知道如何让这个小小的编辑器插入制表符,所以我添加了16个空格。这两个都应该可以,但是制表符更适合原始文件的间距。)

这会将“ -AlwaysAppendSearchDomains”参数添加到mDNSResponder启动plist文件中(并保存备份副本),但是由于这是由启动控制的,因此需要告知该系统重新启动mDNSResponder。

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

现在,如果您检查正在运行的mDNSResponder进程,则应该看到它使用新参数运行:

ps auxww | grep mDNSResponder

(有关http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.htmlhttp://kavassalis.com/2011/07/wtf-bug的道具,-in-os-x-10-7 /,我找到了这个问题的答案。)


此修复程序也适用于Mountain Lion(10.8)。我只是将其应用于笔记本电脑。
Sigsegv 2012年

凉!很高兴我能帮上忙。
Sigsegv 2012年

1
仅供参考:这在优胜美地下不起作用。如果您需要在优胜美地上使用AlwaysAppendSearchDomains,请尝试:apple.stackexchange.com/a/157017/65787但这并不能解决我在优胜美地上的.local问题,但这确实=)apple.stackexchange.com/a/152892
Stan Kurdziel

在El Captain中不工作。而且似乎更容易做到sudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ProgramArguments -array-add "–AlwaysAppendSearchDomains"
Dmitry Verkhoturov

9

在host(1)手册页中:

Mac OS X通知

host命令不使用在Mac OS X上运行的其他进程使用的主机名和地址解析或DNS查询路由机制。主机打印的名称或地址查询的结果可能与使用Mac的其他进程发现的结果不同OS X本机名称和地址解析机制。DNS查询的结果也可能与使用Mac OS X DNS路由库的查询不同。

不幸的是,没有关于host命令如何精确解析主机名的信息。此行为使其在调试时有点无用,恕我直言。


6

基本历史记录... nslookup是命令,但是它具有所有解析程序例程的自己实现。开始发生的事情是,不同平台上的系统解析器与nslookup的工作方式不同。有时,这会产生一些完全不同的结果。

host和dig命令被创建为nslookup的“重写”。它们静态链接到系统解析器功能。系统解析器是UNIX或类似UNIX的系统的标准C库中的功能的集合(在Mac OS X上,这些功能是netdb库的一部分)。这样,host和dig命令始终可以与系统解析器针对其构建的任何操作系统使用的功能相同,但它们并不依赖于此。这样,它们是系统解析器出现故障时的出色诊断工具。

注意:Host和dig都从/etc/resolv.conf中读取名称服务器列表,除非为其指定了要交谈的特定名称服务器。只有host命令使用/etc/resolv.conf文件中的搜索列表。dig没有,这就是为什么必须始终给dig FQDN解决任何问题的原因。否则,这两个命令都是完全自给自足的。例如,/etc/resolv.conf文件是唯一不在他们使用的二进制文件中的文件。

mDNSresponder是Bonjour。我没有深入研究它,但是我怀疑此配置设置不能解决这个问题,或者至少不能直接解决这个问题。我刚刚在Mac OS X 10.9.1上遇到了同样的问题,只需重新启动mDNSresponder即可为我解决。在任何其他系统上的10.5-> 10.8 / 10.9之前,我从未见过此问题。此外,GUI应用程序也不受它的影响,只有命令行工具(如ping和ssh)损坏了。

如果我有时间再深入研究一下图书馆,我将看看是否能找到更完整的解释。



4

.local保留用于多播。使用.local的同一网络上的mDNS和DNS服务器可能会出现问题。


1
我希望在此提供更多解释或一些文档的链接。感谢您的花絮!
bmike

3

主机将附加.local dns后缀。平安不是。如果发现此不安全之处,则可以在网络系统首选项中添加.local作为默认后缀,并且系统在尝试解析主机名时会添加该默认后缀。


这是一个很好的观点,很抱歉,我没有在问题中这么说,但ping abc.local也没有用(尽管host abc.local可以)。我已经解决了这个问题。pfSense在发送DHCP租约时会自动将本地域添加为搜索域,所以这不会成为问题。
Brian M. Hunt

哇-奇怪 如果您完全拥有落后的本地资格,会发生什么情况。?ping abc.local.
bmike

1
结果相同。显然,Mac中有两种查找机制。它们为何不同,很难想象。
布莱恩·亨特

我不太确定这个答案是否适用于优胜美地和其他较新的操作系统。也许我们可以获得更好的答案
bmike

有文档警告说文件/ etc / hosts仅在单用户模式下使用。不对。我通过将坏人的名字放在/ etc / hosts中,路由到127.0.0.1来防止无意中访问许多坏人,尽管这个问题确实表明苹果公司有一些怪异之处,但我认为这对这个问题并不重要。我还注意到OS X经常更改我的resolv.conf,因此我设置了一个cron作业以将其恢复到每十分钟一次所需的时间。
WGroleau '18年

2

如果您尝试了上述所有方法,但没有任何效果,则可以将名称服务器搜索路径添加到System Preferences>Network>Advance(bottom right of the window)>DNS tab 在此处输入图片说明

此更新/etc/resolv.conf和ping现在应该可以工作了。通过编辑/etc/resolv.conf来更新搜索路径实际上是行不通的,但是由于某些原因,这样做确实可以。

更新:

无法编辑/etc/resolv.conf,因为操作系统会根据“系统偏好设置”窗格设置重写文件。


1
“编辑/etc/resolv.conf确实不起作用”,因为操作系统基于首选项窗格对其进行了重新编写。
WGroleau '18年

1
与公认的答案相比,这确实对我有用。
Artem Pyanykh '18

1

我缺乏足够的声誉来评论拉蒙特·彼得森(Lamont Peterson)的职位。在Mac OS X 10.7(Lion)上,重新启动mDNSresponder对我有用。与Lamont Peterson不同,此问题为我带来了一个GUI应用程序的问题-Safari无法解析公共或私有主机名。以下是我执行的具体步骤,并且我怀疑Lamont Peterson也执行过以下步骤:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist

unload降mDNSresponder关上了,在load再次启动。

这立即解决了问题;无需重新启动。

您可以使用以下list命令检查它是否已成功重新启动:

$ sudo launchctl list | grep '^PID\|mDNSResponder'
PID     Status  Label
708     -       com.apple.mDNSResponder
-       0       com.apple.mDNSResponderHelper

进程ID(PID)的存在表示它正在运行。708会因操作系统分配的不同而有所不同。如果状态显示连字符或零以外的其他内容,则表示出现了问题。

我不知道如何mDNSResponderHelper与之互动mDNSResponder; 我只需要重启即可mDNSResponder



0

请注意关于OSX名称的注释可以是非标准的,因此出于完整性考虑:

  • FQDN是可ping通的
  • “主机”文件中的名称是可ping通的

Mac名称不是一般的名称:必须完成两个修复:a)将空格更改为“-” b)添加.local

例如我的Mac:ingconti的MacBook Pro

将在以下位置可ping通:ingcontis-MacBook-Pro.local

打开首选项,您可以看到:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.