Macos Mac OSX狮子DNS查找顺序

Macos Mac OSX狮子DNS查找顺序,macos,dns,osx-lion,hosts-file,Macos,Dns,Osx Lion,Hosts File,升级到Mac OSX Lion后,我发现/etc/hosts不再是查找名称解析的首选。这会导致一些副作用,如: /etc/hosts中的条目解析速度非常慢 您不能覆盖现有域,例如127.0.0.1 www.google.com 如果您从DHCP(比方说.lan)中获得搜索域条目,并且某个有趣的家伙将localhost.lan配置为本地DNS中的127.0.0.1,那么您将无法再访问您的localhost 这种行为是故意的吗?这有什么意义吗?最重要的是,我如何回到以前的行为。问题是我将/etc/h

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

  • /etc/hosts中的条目解析速度非常慢
  • 您不能覆盖现有域,例如127.0.0.1 www.google.com
  • 如果您从DHCP(比方说.lan)中获得搜索域条目,并且某个有趣的家伙将localhost.lan配置为本地DNS中的127.0.0.1,那么您将无法再访问您的localhost

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

    问题是我将/etc/hosts文件进行了符号链接。如果/etc/hosts是一个普通文件,那么一切都没问题。

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

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

    当我注意到一些我以前从未在雪豹上看到过的广告时,我发现了这一点,因为我将广告域重定向到了
    127.0.0.1
    。我启动了wireshark,注意到IPv4
    A
    查询(IPv4)之后的
    AAAA
    (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
    更新(2):OSX 10.10.5带来了
    mDNSResponder
    的返回

    更新:OSX 10.10约塞米蒂已将mDNSResponder替换为“discoveryd”。我还没有升级,所以我不确定通过DNS查找和
    /etc/hosts
    发现的行为

    Lion上的系统DNS解析程序是
    MDnsrresponder
    进程

    您可能会想,“但MDnsrresponder是多播dns响应程序。”您是对的;这就是它最初的用途,它仍然实现了这个功能。但是,在较新的MacOS版本上,它还执行标准主机查找

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

    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
    
    tr'\015'\012'/tmp/hosts$$
    mv/etc/hosts/etc/hosts.bad
    mv/tmp/hosts.$$/etc/hosts
    #在我们进行操作时修复权限
    chown根:控制盘/etc/hosts
    chmod 644/etc/hosts
    
    此修复的贷项为:


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

    总之,

    但是如果您必须使用.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服务器。

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

    我明白了原因

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

    sudo killall mDNSResponder
    
    (说得很清楚,让我想到这个问题的症状是emacs启动大约需要10秒,但只有在我使用wifi时才启动。如果我关闭wifi,emacs会像预期的那样立即启动。)

    我的解决方案:我的笔记本电脑有一个名字,“终结者”。(是的,它闪亮的铝合金外观让我想起了阿诺德·施瓦辛格的角色。)我只需要给它添加一些条目
    hostname
    
    127.0.0.1 foo.bar.local
    
    127.0.0.1 foo.bar.local
    ::1       foo.bar.local
    
    sudo networksetup -setv6off Ethernet
    
    127.0.0.1    localhost
    127.0.0.1    dev.aliasdomain.com
    ... 
    ::1          localhost6 
    
    scutil --dns
    
    resolver #2
      domain   : 00000000.members.btmm.icloud.com
      options  : pdns
      timeout  : 5
      order    : 150000