【问题标题】:Mac OSX Lion DNS lookup order [closed]Mac OSX Lion DNS 查找顺序 [关闭]
【发布时间】:2011-10-14 01:27:35
【问题描述】:

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

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

【问题讨论】:

  • 超级有用的问题 - 惊喜,令人惊讶的是它已关闭为题外话
  • 至少他们还没有删除线程.. 还没有。这救了我的培根。我将所有主机从 X.local 更改为 X.lhost 并且问题消失了。在旁注中,我是 xip.io 的忠实粉丝,例如foo.127.0.0.1.xip.io

标签: macos dns osx-lion hosts-file


【解决方案1】:

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

【讨论】:

  • 谢谢。确实很有帮助。
  • 我的第一个想法是“跛脚”。然而,后来我偶然发现了另一个堆栈帖子并改变了我的立场:serverfault.com/questions/17255/…
  • 请注意 - 如果您使用 chrome 进行开发,非标准顶级域将被解释为搜索。您可能需要执行类似 .dev.com 之类的操作,以使其进行实际的域查找。我不确定如何优雅地做到这一点。
  • @bbrame:您可以使用 url 方案输入您的本地域:http://foo.dev/;之后,Chrome 会意识到 foo.dev 是域而不是查询。
  • 您也可以use dscl tool 添加例外。
【解决方案2】:

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

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

解决方案是有一个

::1 mydomain.com

每个条目

127.0.0.1 mydomain.com

hosts 文件中的条目。

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


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

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

【讨论】:

  • 非常感谢。等待 10 到 30 秒来测试对我的代码所做的更改让我发疯了,您不必自己解决这个问题,为我节省了大量时间。
  • 我遇到了同样的问题,这立即解决了我的问题!不错。
  • +1 对于任何搜索“为什么我的主机文件不起作用”的人来说,这是一个很好的花絮。我可能会在这里问这个问题,这样您就可以在那里输入相同的答案,以便通过搜索引擎更容易找到!
  • 读取/etc/hosts不会明显增加磁盘I/O - 如果文件被频繁使用,操作系统会缓存文件。
  • LAN 支持 IPv6(毕竟快 2016 年了!)的用户从现在开始会遇到这个问题,直到 IPv4 完全消失......或者直到 Apple 发现问题并在内部解决它!还应考虑让-巴蒂斯特的回应(即,在您的开发环境中使用 .dev 而不是 .local)。
【解决方案3】:

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

【讨论】:

  • 我遇到了同样的问题。但是,我的 /etc/hosts 文件是一个普通文件。对此的任何帮助将不胜感激。
  • 这似乎也是我的问题。我的 Dropbox 文件夹中有一个文件的符号链接,它曾经可以工作并且我认为它非常聪明。苹果似乎不再觉得这很聪明。在将其从符号链接移动到真实文件后,我还使用 Option-restart 进行了完全真实的重新启动。现在一切似乎都很幸福。
  • 如果无法解析符号链接的主机文件中的条目,则它们是可以的,这表明仅当无法解析地址时才检查符号链接的主机文件。当 hosts 文件是普通文件时,它会在任何其他形式的解析之前进行检查。因此,如果您需要覆盖实际上具有有效 DNS 条目的域,您的 hosts 文件必须是文件而不是符号链接。
  • 郑重声明,小牛队 (10.9) 中的情况仍然如此,如果有人能确认优胜美地的所作所为会很有用……
  • Yosemite 也是这样做的,只是遇到了这个问题。这是非常奇怪的行为。
【解决方案4】:

更新(2):OSX 10.10.5 带来了mDNSResponder 的回归。

更新:OSX 10.10 Yosemite 已将 mDNSResponder 替换为“discoveryd”。我还没有升级,所以我不确定通过 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 的回复将是正确的解决方案;尽管 Jean-Baptiste-MONIN 也有一个有优点的答案。
  • 可以解决修改/etc/hosts不被注意到的问题。
  • 我正在使用 high sierra,这个答案解决了别名问题,谢谢
【解决方案5】:

我有这个问题有一段时间了,因为我在一个开发团队工作,所以有必要实际使用 .local 而不是 .dev 或 .localhost,我发现这篇文章非常有用。

iTand.me - Lion local domains and etc hosts..

总结;

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

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 服务器。

【讨论】:

  • 以这种方式添加主机名时,它似乎没有做任何事情。无法 ping 地址。示例:sudo dscl localhost -create /Local/Default/Hosts/test1 IPAddress 127.0.0.1 ping test1 ping: cannot resolve test1: Unknown host
【解决方案6】:

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

127.0.0.1 foo.bar.local

更新后,加载我的本地应用程序非常慢。我注意到延迟发生在请求出现在日志文件之前,一旦出现,应用程序本身就和往常一样快。

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

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

...一切又恢复了。

显然这增加了 IPv6 地址?我不太明白,真的,但它有效。

【讨论】:

  • 没有其他方法对我有用,但它立刻就奏效了 - 谢谢 Nathan!
【解决方案7】:

我的情况类似,但延迟正好 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 秒的延迟也消失了。

【讨论】:

    【解决方案8】:

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

    我知道为什么了。

    与其他人不同,我没有使用 /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 现在可以快速解析我的笔记本电脑的名称。

    我希望这对某人有所帮助。

    【讨论】:

    • 这似乎刚刚对我有用。我们将看看这是否成立。我很高兴你能想到这一点,因为我间歇性地看到这个问题突然出现而没有警告。
    • 射击。这对我来说不是一个永久的解决方案。问题回来了。请注意,当我重新阅读此内容时,我的问题不属于您...
    【解决方案9】:

    我在使用 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 
    

    【讨论】:

      【解决方案10】:

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

      无论如何,对于 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 alias.example.com 4.3.2.1.in-addr.arpa

      【讨论】:

        猜你喜欢
        • 2012-06-05
        • 2012-01-22
        • 2013-03-05
        • 2013-06-05
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2013-04-13
        相关资源
        最近更新 更多