Mac OSX Lion DNS查找顺序

Mei*_*eik 96 dns macos hosts-file osx-lion

在升级到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,您将无法再访问本地主机.

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

小智 78

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

  • 我的第一个想法是"跛脚".然而,然后我偶然发现了另一个堆栈帖子并改变了我的立场:http://serverfault.com/questions/17255/top-level-domain-for-private-networks (5认同)
  • @bbrame:您可以使用url方案输入本地域:`http:// foo.dev /`; 之后,Chrome会意识到`foo.dev`是一个域而不是查询. (5认同)

gun*_*uns 50

关于覆盖hosts文件中的域,我发现在某些情况下,Lion会在感知到域名无法通过IPv4网络访问时查询域的IPv6地址.

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

对此的解决方案有一个

::1 mydomain.com
Run Code Online (Sandbox Code Playgroud)

每个人的入场券

127.0.0.1 mydomain.com
Run Code Online (Sandbox Code Playgroud)

您的主机文件中的条目.

有趣的是,如果您碰巧运行了本地Web服务器127.0.0.1:80并且您的浏览器收到来自Web服务器的响应(错误或其他),则不会AAAA发出任何查询,因为它似乎认为TCP连接至少是可能的.


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

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

  • 非常感谢你.等待10-30秒来测试我的代码的变化让我发疯,你为我节省了很多时间,而不必自己解决这个问题. (3认同)

小智 17

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

  • 这似乎也是我的问题.我有一个符号链接到我的Dropbox文件夹中的文件,它曾经工作过,而且我觉得它很聪明.看起来苹果不再觉得这个聪明了.在将符号链接移动到真实文件后,我还使用Option-restart进行了完全真正的重启.现在一切似乎都很开心. (4认同)
  • 如果无法以其他方式解析符号链接的主机文件中的条目,则表示只有在无法解析地址时才会检查符号链接的主机文件.当hosts文件是普通文件时,在任何其他形式的解析之前检查它.因此,如果您需要覆盖实际具有有效DNS条目的域,则您的hosts文件必须是文件而不是符号链接. (2认同)

Dan*_*tts 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
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.

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

确保您的/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
Run Code Online (Sandbox Code Playgroud)

此修复的功劳:

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