优胜美地本地主机解析器和dnsmasq离线失效

10

按照这篇文章设置本地开发环境,一切都正常工作,但最近离线时无法访问我的本地开发域。连接到互联网时它能正常工作。我在想是否在Yosemite中使用解析器的方式发生了变化。如果我离线,似乎解析器规则会被忽略。

dnsmasq.conf:

address=/.dev/127.0.0.1
listen-address=127.0.0.1

/etc/resolver/dev

 nameserver 127.0.0.1

在线状态:

ping -c 1 mydomain.dev
PING mydomain.dev (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.038 ms

--- mydomain.dev ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.038/0.038/0.038/0.000 ms

scutil --dns
resolver #1
search domain[0] : nomadix.com
nameserver[0] : 203.124.230.12
nameserver[1] : 202.54.157.36
if_index : 4 (en0)
flags    : Request A records
reach    : Reachable

resolver #2
domain   : dev
nameserver[0] : 127.0.0.1
flags    : Request A records, Request AAAA records
reach    : Reachable,Local Address

离线时:

ping -c 1 mydomain.dev
ping: cannot resolve mydomain.dev: Unknown host

scutil --dns
No DNS configuration available
3个回答

2
"OSX Yosemite + resolver + dnsmasq离线解决方案"
"当您处于离线状态时,电脑上除127.0.0.1以外的所有接口都会关闭。"
"因此,如果您想要进行DNS解析,则您的DNS服务器必须监听127.0.0.1。在我的情况下,我选择了dnsmasq,因为您不必是系统管理员就可以让它工作,并且它确实有用!"
"按照以下简单步骤,我让它工作:"
"1) brew install dnsmasq "
"2) cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf "
"如果像我一样,它没有正确安装在/usr/local/opt中,那么您应该能够在brew安装调试行中读到类似于以下内容:"
"make install PREFIX=/usr/local/Cellar/dnsmasq/2.72"
"在这种情况下,请运行以下命令: "
将以下命令从英语翻译成中文:

ln -s /usr/local/Cellar/dnsmasq/2.72 /usr/local/opt/dnsmasq

然后回到第2

3)vi /usr/local/etc/dnsmasq.conf

并按以下示例添加您的域:

address=/foo.dev/192.168.56.101

在这种情况下,以foo.dev结尾的每个URL(例如http://www.foo.dev, http://foo.dev, http://what.ever.you.want.foo.dev等)都将被解析为192.168.56.101(这是使用Virtualbox时拥有的IP地址,即192.168.56.*)。
4)sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
5)在将其放入解析器之前,请尝试一下:
nslookup foo.dev 127.0.0.1
并期望得到以下结果:
Server:  127.0.0.1
Address:     127.0.0.1#53
Name:    foo.dev
Address: 192.168.56.101

"6) mkdir -p /etc/resolver vi /etc/resolver/dev
添加以下两行内容:"
nameserver 127.0.0.1
search_order 1

7) 在浏览器地址栏中输入“ping foo.dev”,或者提示“http://foo.dev”或“http://so.cool.foo.dev”,然后就可以开始工作了!!!
8) 开心吧!!你又可以离线工作了!!!

我不再使用Yosemite,而是使用El Capitan,这个方法可以工作。我所做的唯一更改是在/etc/resolver/dev中将search_order 1进行了搜索。这对于仍然设置为响应地址127.0.0.1的dnsmasq非常有效,因此它适用于本地nginx、apache或任何您想运行的Web服务器,而不仅仅是vagrant/docker/virtualbox。 - jamesrward
显然我说/接受得太快了。在我的问题中,设置在El Capitan上“只是工作”,没有任何更改。我会看看是否可以找到一个Yosemite盒子进行测试,或者让其他人发表意见,如果这确实是Yosemite上的解决方案。 - jamesrward

0

非常有趣。这让我想知道,手动替换discoveryd为mDNSresponder的这篇 Ars 文章是否是目前唯一可用的解决方案。我会尝试一下并回报结果。 - jamesrward
我也想尝试,但我没有10.9文件的访问权限!我很想听听你的进展。 - Jacob Degeling
到目前为止,这对我来说是“解决方案”。El Capitan修复了问题,而不需要对我的设置进行任何更改。 - jamesrward

-4
问题在于当您离线时,应该为根域'.'指定解析器: 当我们搜索www.google.com时, 自动添加一个“。”(根域)在末尾,如:www.google.com.。
所以你要做的就是:
将所有网络接口DNS服务器设置为127.0.0.1:
networksetup -setdnsservers Ethernet 127.0.0.1

networksetup -setdnsservers Wi-Fi 127.0.0.1

...

创建一个文件/etc/resolver/whatever:
nameserver 127.0.0.1
domain .

查看此问题以获取更多详细信息


1
这在OS X 10.10上根本不起作用。不仅如此,当网络重新连接时,它还会破坏DNS解析。 - brianz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接