Macos Mac OSX狮子DNS查找顺序
升级到Mac OSX Lion后,我发现/etc/hosts不再是查找名称解析的首选。这会导致一些副作用,如: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
这种行为是故意的吗?这有什么意义吗?最重要的是,我如何回到以前的行为。问题是我将/etc/hosts文件进行了符号链接。如果/etc/hosts是一个普通文件,那么一切都没问题。我认为他关心的是Lion handles.local TLD,因为它是为一些多播DNS功能保留的(由Bonjour使用)。我发现解决此问题的唯一方法是为开发主机(即:.dev)使用不同的TLD。这对我来说很好,希望对其他人有帮助 关于主机文件中的覆盖域,我发现在某些情况下,如果Lion检测到某个域无法通过IPv4网络访问,它会查询该域的IPv6地址 当我注意到一些我以前从未在雪豹上看到过的广告时,我发现了这一点,因为我将广告域重定向到了
127.0.0.1
。我启动了wireshark,注意到IPv4A
查询(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