我正在尝试使用 dnsmasq 的配置来解析某些已知域,但让其余请求通过 DHCP 分配的普通 DNS 服务器。我无法让它工作。当我通过网络面板将 DNS 设置为 127.0.0.1 时,我必须将 DHCP 分配的 DNS 服务器硬编码到 dnsmasq 的配置中。但是,当我在不同的网络上时,例如在工作时,在客户端,这些地址是不同的。每次我更换网络时,我都必须重新配置。
如何配置 OS X 以使用 127.0.0.1 和通过 DHCP 分配的任何 DNS 服务器?
如果不可能,那么我如何告诉 dnsmasq 通过 DHCP 获取上游 DNS 服务器?
这是我目前所知道的情况。
OS X 上的 /etc/resolv.conf 是动态的,它会根据您在网络偏好设置中设置的内容或使用 DHCP 而变化。它会在您重新连接时更改。甚至在您离线时也会被删除。因此,只要我使用 127.0.0.1,这就会反映在 /etc/resolv.conf 中,我不知道是否有任何地方可以找到以前由 DHCP 分配的 DNS 地址。
OS X 不使用 /etc/resolv.conf.head。
OS X 不使用 /etc/dhclient.conf,您可以在其中将 DNS 服务器添加到 DHCP 提供的列表中。
/etc/resolver/tld.conf 不是一个解决方案,因为它尝试使用基于匹配 tld 的 DNS 服务器(如果您使用 .dev 或其他东西,那就很好了)。
编辑:这里有一张网络 DNS 设置的截图这里这看起来就是我想要的,但我不知道那篇文章的作者是如何实现的。
答案1
首先,使用 127.0.0.1 和 DHCP 分配的 DNS 服务器将不起作用。如果 OS X 配置了多个 DNS 服务器,它不会按顺序尝试它们,而是执行更像循环的操作 - 或多或少随机地向不同的服务器发送不同的请求。最终结果:您希望由 dnsmasq 处理的一些查找将转到常规服务器(并得到错误的结果),而您希望发送到常规服务器的一些查找将转到 dnsmasq(并失败)。不好。
告诉 dnsmasq 使用 DHCP 提供的 DNS 服务器可能是可行的,但我没有找到一种干净的方法。相反,我建议使用 DNS 配置来覆盖您想要特别处理的域的常规 DNS 配置。有两种选择:
- 跳过 dnsmasq,将你想要特殊处理的主机放入 /etc/hosts 中(参见本文, 例如)。
- 使用 /etc/resolver/ 文件将特定域的查询定向到 127.0.0.1,覆盖常规(DHCP 提供的)DNS 服务器(请参阅/etc/resolver 的手册页和这篇 Mac OS X 提示文章。本质上,您创建 /etc/resolver 文件夹,并在其中为每个要覆盖的域放置一个文件。例如,/etc/resolver/somedomain.com 将包含“nameserver 127.0.0.1”。
答案2
使用 Gordon 的答案作为起点,我能够解决这个问题,以便为 Web 开发项目创建主机名。这在 OS X 10.9 (Mavericks) 上进行了测试。
我.dev
为测试站点使用后缀(例如project1.dev
,project2.dev
)。这种方法允许我创建任意多个.dev
域,但不必为每个域创建一个文件/etc/resolver
。这是对 Gordon 的答案的小改进;您只需为每个后缀创建一个文件。
无论我在工作网络、家庭网络还是 VPN 上,这都可以起作用。
- 在“网络偏好设置”窗格中,转到“高级”、“DNS”并删除添加的任何自定义 DNS 服务器,这样您只需使用 DHCP 分配的值。
sudo mkdir /etc/resolver/
sudo sh -c 'echo nameserver 127.0.0.1 > /etc/resolver/dev'
如果您还没有,请添加以下内容
/usr/local/etc/dnsmasq.conf
(假设您使用 homebrew 安装了 dnsmasq;否则其位置可能不同):address=/dev/127.0.0.1
如果您使用其他后缀(例如),只需重复步骤 3 和 4,在两个步骤中用project1.loc
替换后缀。dev
dig
尝试使用、host
或解析主机名nslookup
将会失败,但主机名将在 Web 浏览器中解析,或者例如curl
。curl http://project1.dev
按预期工作。