Mac OSX Lion DNS查找顺序
升级到Mac OSX Lion之后,我发现/ etc / hosts不再是名字parsing的第一位。 这会导致一些副作用,如:
- / etc / hosts中的条目被parsing得很慢
- 您不能覆盖现有的域名,例如127.0.0.1 www.google.com
- 如果你从DHCP获得search域的条目,比如说.lan和一些有趣的家伙把localhost.lanconfiguration为127.0.0.1,那么本地DNS中的127.0.0.1就不能再连接到你的本地主机了。
这是行为的目的? 这有什么意义吗? 而最重要的是,我怎样才能回到以前的行为。
我认为他很重要的是,Lion处理.local TLD的方式不同,因为它保留了一些多点传送DNSfunction(由Bonjour使用)。 我发现解决这个问题的唯一方法是使用一个不同的顶级域用于开发主机(即:.dev)。 它适合我,希望它会对别人有帮助!
关于在主机文件中覆盖域,我发现,在某些情况下,如果Lion感觉到一个域在IPv4networking上是不可达的,Lion会查询该域的IPv6地址。
当我注意到一些在Snow Leopard上从未见过的广告时,我发现了这一点,因为我已将广告域redirect到127.0.0.1
。 我启动wireshark并注意到IPv4 A
查询(IPv4)之后的AAAA
(IPv6 DNSlogging)查询。 广告服务器确实具有IPv6地址,并能够为我提供内容。
解决这个问题有一个
::1 mydomain.com
每个入口
127.0.0.1 mydomain.com
input你的主机文件。
有趣的是,如果你碰巧有一个在127.0.0.1:80
运行的本地networking服务器,并且你的浏览器从networking服务器收到响应(错误或其他),则不会发出AAAA
查询,因为它似乎满足于TCP连接在尽可能less
在相关说明中,如果大量使用hosts文件(用于广告拦截,本地web开发等),则可能需要考虑运行自己的本地DNSparsing器。 每个请求都必须读取/etc/hosts
,因此存在相当大的磁盘/ CPU占用,因此保持该文件非常轻松是最有利的。
在本地运行dnsmasq
类的一个优点是(除了显着的性能提升),您可以将整个顶级域名redirect回您的本地机器。 这允许你有整个* .dev命名空间用于开发(例如),而不必单独input你想要在本地parsing到/etc/hosts
每个域
问题是我符号链接/ etc / hosts文件。 如果/ etc / hosts是一个普通的文件,一切正常。
更新(2):OSX mDNSResponder
带来了mDNSResponder
的返回。
更新:OSX 10.10优胜美地已经用“发现”取代了mDNSResponder。 我还没有升级,所以我不确定发现的行为w / r / t DNS查找和/etc/hosts
。
Lion上的系统DNSparsing器是mDNSResponder
进程。
你可能会想“但mDNSResponder是组播DNS响应者”。 你是对的; 这是它最初的目的,它仍然履行这个function。 但是,在较新的MacOS版本中,它也执行标准的主机查找。
在Lion中,当它改变时,似乎不会自动重新读取/etc/hosts
,至less并不总是如此。 杀mDNSResponder
(并允许它自动重新启动)似乎解决了这个问题。
sudo killall mDNSResponder
应该做的伎俩。
下面是我对于后代的原始答案。 我想这在某些情况下可能还是个问题。
确保你的/etc/hosts
文件是一个unix风格的文本文件,以linefeed作为结尾而不是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
ive有这个问题一段时间,因为即时通讯工作的一个开发团队,有必要实际使用.local而不是.dev或.localhost,我发现这篇文章是非常有用的。
iTand.me – Lion本地域名等主机
综上所述;
但是,如果您必须使用.local,我发现最优雅的解决scheme是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,但是这是一个更好的替代scheme,不得不重新命名我们所有的.local服务器。
在从Snow Leopard迁移到Lion之前,我在/etc/hosts
有几个特定于应用程序的条目,如下所示:
127.0.0.1 foo.bar.local
更新之后,加载我的本地应用程序非常缓慢。 我注意到,延迟发生在请求出现在日志文件之前,一旦它发生,应用程序本身就像往常一样快。
现在我每个应用程序有两行,如下所示:
127.0.0.1 foo.bar.local ::1 foo.bar.local
…一切都很快。
显然这增加了IPv6地址? 我真的不太明白,但是它是有效的。
我的情况很相似,但延迟时间恰好为5秒,只发生以“.local”结尾的url。 查看以“.dev”结尾的网站时,没有延迟。
我办公室的其他一些开发者有这个问题,而有些则没有。 我希望有一个简单的修复,我不想重命名该网站'。本地'由于其他依赖。
我在terminal中运行了以下命令,并将其输出与办公室中的其他几个用户区分开来。
scutil --dns
这部分是唯一的区别:
resolver #2 domain : 00000000.members.btmm.icloud.com options : pdns timeout : 5 order : 150000
我的Mac被链接到我的iCloud帐户,并启用了“回到我的Mac”。 一旦我禁用了“回到我的Mac”,附加的parsing器就消失了,5秒的延迟消失了。
哇,真是个噩梦 我已经读过关于这个主题的所有内容,到目前为止所提出的一切都与我所经历的一切接近,但没有一个解决scheme为我工作。
我想出了为什么。
不像其他人,我没有使用/ etc / hosts来设置本地域。 我的/ etc / hosts文件是stock,只包含loopback接口和广播主机所需的条目。 而且,它是一个正确编码的unix文件,因为我是那种只会使用emacs从命令行编辑这个文件的人。 而且,谢天谢地,我不必诉诸像DNSmasq那样运行我自己的DNS服务器来解决问题。
(要说清楚的是,这个问题带给我的症状是,emacs花了大约10秒钟才开始,但是只有当我使用wifi的时候,如果关掉了wifi,emacs会立即启动。
我的解决scheme:我的笔记本电脑有一个名字,“终结者”。 (是的,它shiny的铝制外观让我想起了阿诺德·施瓦辛格的angular色)。我只需要在/ etc / hosts中添加条目来指定机器的名称:
127.0.0.1 terminator ::1 terminator
我通过在terminal中运行一个简单的命令find了我的主机的名字:
hostname
…输出回来了:“终结者”。 在更改/ etc / hosts以包含这两个条目后,emacs现在可以快速parsing我的笔记本电脑的名称。
我希望这可以帮助别人。
我有使用OSX的狮子作为一个networking开发框速度问题…使用的build议,我采取了禁用ipv6networking和路由ipv6本地主机6 …事情加速了很多… …
sudo networksetup -setv6off Ethernet
/ etc / hosts …
127.0.0.1 localhost 127.0.0.1 dev.aliasdomain.com ... ::1 localhost6
我认为有一些错误修复。 我已经看到了很多提到的问题,而且这些问题似乎都不适用(例如,将多个别名放在一行上现在可以正常工作)。
不pipe怎么样,在Lion看来,苹果公司对mDNSResponder做了一些大的修改,它处理所有的DNS查询,并且(至less和Lion一起)也处理/ etc / hostscaching。 对于我来说,正向查找也是可行的。 但是反向查找(例如,查找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