97

升级到 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。

这种行为是有意的吗?这有什么意义吗?最重要的是,我怎样才能回到旧的行为。

4

10 回答 10

78

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

于 2011-07-28T06:32:01.877 回答
51

关于覆盖主机文件中的域,我发现在某些情况下,如果 Lion 感知到域无法通过 IPv4 网络访问,它会查询域的 IPv6 地址。

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

解决方案是有一个

::1 mydomain.com

每个条目

127.0.0.1 mydomain.com

在您的主机文件中输入。

有趣的是,如果您碰巧有一个本地网络服务器正在运行,127.0.0.1:80并且您的浏览器从网络服务器收到响应(错误或其他),AAAA则不会发出任何查询,因为它似乎对 TCP 连接至少是可能的感到满意。


在相关说明中,如果您大量使用主机文件(用于广告拦截、本地 Web 开发等),您可能需要考虑运行自己的本地 DNS 解析器。必须读取/etc/hosts每个请求都会对磁盘/CPU 造成相当大的影响,因此保持该文件非常轻巧符合您的最大利益。

在本地运行类似的东西dnsmasq(除了显着的性能提升之外)的一个优点是您可以将整个顶级域重定向回本地计算机。这允许您拥有整个 *.dev 命名空间用于开发(例如),而无需单独输入您想要在本地解析的每个域/etc/hosts

于 2011-08-09T06:56:58.617 回答
17

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

于 2011-07-27T13:07:19.620 回答
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

于 2012-02-13T19:28:42.380 回答
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 服务器。

于 2012-02-16T11:16:39.193 回答
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 秒的延迟也消失了。

于 2013-02-14T01:52:57.700 回答
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 地址?我不太明白,真的,但它有效。

于 2012-05-31T15:30:35.613 回答
1

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

我想通了为什么。

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

(需要明确的是,将我带到此问题的症状是 emacs 需要大约 10 秒才能启动,但仅在我使用 wifi 时才启动。如果我关闭 wifi,emacs 会按预期立即启动。)

我的解决方案:我的笔记本电脑有一个名字,“终结者”。(是的,它闪亮的铝制外壳让我想起了阿诺德·施瓦辛格的角色。)我只需要在 /etc/hosts 中添加机器本身的名称即可:

127.0.0.1   terminator
::1         terminator

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

hostname

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

我希望这可以帮助别人。

于 2012-03-04T18:19:59.937 回答
0

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

sudo networksetup -setv6off Ethernet

/etc/主机...

127.0.0.1    localhost
127.0.0.1    dev.aliasdomain.com
... 
::1          localhost6 
于 2012-07-27T18:29:14.423 回答
0

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

无论如何,对于 Lion,Apple 似乎对处理所有 DNS 查找的 mDNSResponder 进行了一些重大更改,并且(至少使用 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 别名.example.com 4.3.2.1.in-addr.arpa

于 2013-03-06T00:55:16.907 回答