Mac OSX Lion DNS查找顺序[关闭]


96

升级到Mac OSX Lion后,我发现不再首先查找/ etc / hosts进行名称解析。这会导致一些副作用,例如:

  1. / etc / hosts中的条目解析速度很慢
  2. 您不能覆盖现有域,例如127.0.0.1 www.google.com
  3. 如果您从DHCP获取搜索域条目,请说.lan,然后某个有趣的家伙将localhost.lan配置为其他名称,然后在本地DNS中将127.0.0.1配置为您无法再访问localhost。

这种行为是故意的吗?有什么意义吗?最重要的是,我该如何回到过去的行为。


12
超级有用的问题-惊喜,令人惊讶的话题关闭
Sebastian Patten 2013年

至少他们还没有删除线程。这节省了我的培根。我将所有主机从X.local更改为X.lhost,问题消失了。附带一提,我是xip.io的忠实
蒂姆

Answers:


78

我认为他很重要,因为Lion保留了某些组播DNS功能(由Bonjour使用),因此Lion处理.local TLD的方式有所不同。我发现解决此问题的唯一方法是对开发主机使用不同的TLD(即:.dev)。它对我来说很好,希望对其他人有帮助!


谢谢。确实非常有帮助。
Cade

5
我的第一个念头是“ lam”。然而,然后我无意中发现这个其他的叠后,改变了我的立场:serverfault.com/questions/17255/...
马特·贝克曼

注意事项-如果您使用chrome进行开发,则非标准顶级域名将被解释为搜索。您可能需要执行.dev.com之类的内容才能使其进行实际的域查找。我不确定如何优雅地做到这一点。
bbrame 2011年

5
@bbrame:您可以使用URL方案输入您的本地域名:http://foo.dev/; 之后,Chrome将意识到这foo.dev是一个域而不是查询。
枪支

另外,您可以使用dscl工具添加异常。
Artur Bodera

51

关于在hosts文件中覆盖域,我发现在某些情况下,Lion如果感觉到在IPv4网络上无法访问某个域,便查询该域的IPv6地址。

当我发现一些我以前从未在Snow Leopard上看到过的广告时发现了这一点,因为我将广告域重定向到127.0.0.1。我启动了Wireshark,并AAAA在IPv4 A查询(IPv4)之后注意到了(IPv6 DNS记录)查询。广告服务器确实具有IPv6地址,并且能够向我提供其内容。

解决方案是

::1 mydomain.com

每个条目

127.0.0.1 mydomain.com

主机文件中的条目。

有趣的是,如果您碰巧正在运行本地Web服务器,127.0.0.1:80并且您的浏览器收到来自Web服务器的响应(错误或其他),则不会AAAA发出查询,因为似乎可以满足至少可以进行TCP连接的要求。


与此相关的是,如果您大量使用hosts文件(用于adblocking,本地Web开发等),则可能需要考虑运行自己的本地DNS解析器。必须读取/etc/hosts每个请求会对磁盘/ CPU造成很大的影响,因此,使该文件非常轻便是您的最大利益。

dnsmasq在本地运行类似内容(除了可以显着提高性能)的一个优势是,您可以将整个顶级域重定向回本地计算机。这样,您就可以拥有整个* .dev命名空间进行开发(例如),而不必单独输入要本地解析的每个域。/etc/hosts


3
非常感谢。等待10到30秒来测试对我的代码的更改,这让我发疯了,而您不必自己弄清楚这一点,就节省了我很多时间。
Zack Angelo

1
我遇到了同样的问题,这立即解决了我的问题!真好
cstrat 2012年

1
+1对于任何搜索“为什么我的主机文件不起作用”的人来说,这都是一个好消息。我可能会在这里问这个问题,以便您可以在此处输入相同的答案,并使其更易于通过搜索引擎查找!
cape1232

读取时磁盘I / O不应有明显的增加/etc/hosts-如果频繁使用文件,操作系统将缓存该文件。
丹·普里兹

局域网支持IPv6的用户(毕竟将是2016年!)从现在开始会遇到此问题,直到IPv4完全消失...或直到Apple提出问题并内部解决为止!还应考虑让-巴蒂斯特(Jean-Baptiste)的响应(即,在您的开发环境中使用.dev而不是.local)。
无与伦比的

17

问题是我链接了/ etc / hosts文件。如果/ etc / hosts是一个普通文件,则一切正常。


1
我有同样的问题。但是,我的/ etc / hosts文件是普通文件。任何帮助,将不胜感激。
马特

4
这似乎也是我的问题。我在我的保管箱文件夹中有一个文件的符号链接,该文件曾经可以工作,但我认为它非常聪明。苹果似乎不再觉得这很聪明。从符号链接移动到真实文件后,我还使用Option-restart进行了完全真实的重启。现在一切似乎都快乐。
汤姆·S.

2
如果无法通过其他方式解析符号链接的主机文件中的条目,则可以,这表明仅在无法通过其他方式解析地址时才检查通过符号链接的主机文件。当主机文件是普通文件时,将在进行任何其他形式的解析之前对其进行检查。因此,如果您需要覆盖实际上具有有效DNS条目的域,则您的主机文件必须是文件,而不是符号链接。
cerberos 2012年

1
记录下来,小牛(10.9)仍​​然是这种情况,如果有人可以确认优胜美地的所作所为将会很有用……
William Turrell 2015年

1
优胜美地也这样做,只是遇到了这个问题。这是极其奇怪的行为。
Vytautas Gimbutas 2015年

14

更新(2):OSX 10.10.5带来了返回mDNSResponder

更新:OSX 10.10 Yosemite已将mDNSResponder替换为“ discoveryd”。我尚未升级,因此不确定所发现的带有w / r / t DNS查找行为/etc/hosts

Lion上的系统DNS解析器就是该mDNSResponder过程。

您可能会想“但是mDNSResponder是多播dns响应器。” 你是对的; 这就是原来的目的,并且仍然可以实现此功能。但是,在较新的MacOS版本上,它也会执行标准主机查找。

在Lion中,它似乎不会/etc/hosts在更改时自动重新读取,至少并非总是如此。杀死mDNSResponder(并允许它自动重新启动)似乎可以解决问题。

sudo killall mDNSResponder

应该可以。

以下是我后代的原始答案。我想在某些情况下可能仍然是一个问题。

确保您的/etc/hosts文件是unix样式的文本文件,以换行作为结尾而不是cr。

使用TextWrangler或UNIX文本编辑器进行编辑应保留该文件。

如果您的文件已被弄乱,请尝试此修复

tr '\015' '\012' < /etc/hosts > /tmp/hosts.$$
mv /etc/hosts /etc/hosts.bad
mv /tmp/hosts.$$ /etc/hosts
# fix up permissions while we are at it
chown root:wheel /etc/hosts
chmod 644 /etc/hosts

将此修复归功于:

http://techpatio.com/2011/guides-how-to/fixed-mac-osx-lion-etc-hosts-bugs-dns


这可能会解决DNS解析器守护程序崩溃的问题,但不能解决将主机解析为开发环境中经常遇到的LAN IP地址的问题。对于大多数在搜索中发现此问题的人来说,下面的@guns回答将是正确的解决方案;尽管让·巴蒂斯特·莫宁也有应得的回答。
无与伦比的

它可以解决/ etc / hosts更改未引起注意的问题。
Dan Pritts 2015年

我使用的是高山脉,并且此答案解决了别名问题,谢谢
Absolutkarlos

4

香港专业教育学院有这个问题一段时间,因为在工作一个开发团队时,有必要实际使用.local而不是.dev或.localhost,我发现本文非常有用。

iTand.me-Lion本地域等主机。

综上所述;

但是,如果必须使用.local,我发现的最优雅的解决方案是dscl实用程序。使用它非常简单。要添加名为mydev.local的主机并将其指向localhost,只需执行以下操作:

sudo dscl localhost -create /Local/Default/Hosts/mydev.local IPAddress 127.0.0.1

查看所有当前定义的主机及其IP

sudo dscl localhost -list /Local/Default/Hosts IPAddress

并删除主机:

sudo dscl localhost -delete /Local/Default/Hosts/mydev.local

总体而言,非常简单明了,效果很好。我仍然更希望能够编辑/ etc / hosts,但是这比重命名我们所有的.local服务器更好。


3
以这种方式添加主机名时,它似乎没有任何作用。无法ping地址。示例:sudo dscl localhost -create / Local / Default / Hosts / test1 IPAddress 127.0.0.1 ping test1 ping:无法解析test1:未知主机
oligofren 2013年

3

从Snow Leopard迁移到Lion之前,我在中有几个特定于应用程序的条目/etc/hosts,如下所示:

127.0.0.1 foo.bar.local

更新后,加载我的本地应用程序非常慢。我注意到延迟是在请求出现在日志文件中之前发生的,并且一旦发生,应用程序本身的运行速度便与往常一样。

现在,每个应用程序有两行,如下所示:

127.0.0.1 foo.bar.local
::1       foo.bar.local

...一切又很快了。

显然这会添加IPv6地址吗?确实,我不太了解它,但是它有效。


没什么对我有用,但这很快就完成了-谢谢内森!
foiseworth

3

我的情况与此类似,但是延迟仅5秒,只发生在以'.local'结尾的URL上。当查看以“ .dev”结尾的网站时,没有延迟。

我办公室中的其他一些开发人员存在此问题,而另一些则没有。我希望有一个简单的修复程序,由于其他依赖性,我不想将站点重命名为“ .local”。

我在终端中运行以下命令,并将输出与办公室中的其他一些用户进行比较。

scutil --dns

本节是唯一的区别:

resolver #2
  domain   : 00000000.members.btmm.icloud.com
  options  : pdns
  timeout  : 5
  order    : 150000

我的Mac已链接到我的iCloud帐户,并且启用了“返回我的Mac”。一旦禁用“回到我的Mac”,其他解析器就会消失,5秒的延迟也消失了。


1

哇,真是一场噩梦。我已经阅读了关于该主题的所有内容,到目前为止,所有建议都非常接近我所经历的内容,但是没有一种解决方案适合我。

我想出了原因。

与其他人不同,我没有使用/ etc / hosts来设置本地域。我的/ etc / hosts文件很普通,仅包含回送接口和广播主机所需的条目。而且,这是一个正确编码的unix文件,因为我是那种只能使用emacs从命令行对其进行编辑的人。而且,谢天谢地,我不必借助自己的DNS服务器(例如DNSmasq)来解决此问题。

(很明显,导致我遇到此问题的症状是emacs大约需要10秒钟才能启动,但仅在使用wifi时才启动。如果关闭wifi,emacs会立即按预期方式启动。)

我的解决方案:我的笔记本电脑有一个名字“终结者”。(是的,它有光泽的铝制外观使我想到了Arnold Schwarzenegger角色。)我只需要在/ etc / hosts中添加机器本身名称的条目:

127.0.0.1   terminator
::1         terminator

我通过在终端中运行一个简单的命令来找到主机的名称:

hostname

...返回的输出是:“ terminator”。将/ etc / hosts更改为包含这两个条目后,emacs现在可以快速解析我的笔记本电脑的名称。

我希望这可以帮助别人。


1
这似乎对我来说只是工作。我们将看看是否成立。我很想知道您的想法,因为我断断续续地看到这个问题没有警告。
杰里米·卡尔森

射击。这对我来说不是永久性的解决方案。问题回来了。提醒您,当我重新阅读这篇文章时,我的问题不是您的……
杰里米·卡尔森

0

使用OSX Lion作为Web开发工具时,我遇到了速度问题。结合使用建议的方法,我禁用了ipv6网络并将ipv6路由到localhost6……事情加速了很多……

sudo networksetup -setv6off Ethernet

/ etc / hosts ...

127.0.0.1    localhost
127.0.0.1    dev.aliasdomain.com
... 
::1          localhost6 

0

我认为已修复了一些错误。我已经看到很多提到的问题,而且这些问题目前似乎都不适用(例如,现在将多个别名放在一行上对我来说很好)。

无论如何,Apple似乎对Lion进行了大幅度更改,使mDNSResponder可以处理所有DNS查找,并且(至少与Lion一起)还可以处理/ etc / hosts缓存。对我来说,正向查找现在也有效。但是反向查找(例如,查找1.2.3.4而不是google.com)无效。

经过许多痛苦之后,看起来mDNSResponder将此查找转换为4.3.2.1.in-addr.arpa并进行了名称查找。这很可能是DNS首选的操作方式,但对于/ etc / hosts根本不起作用。

除非您当然为每个主机添加一个别名4.3.2.1.in-addr.arpa,其中4.3.2.1是与您看到它相反的IP地址。这为我解决了所有问题。这是/ etc / hosts条目的示例:

1.2.3.4 foo foo.example.com alias.example.com 4.3.2.1.in-addr.arpa

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.