我正在设置一个简单的 DNS 服务器(BIND/Named),它在 OSX 笔记本电脑上本地运行。
其目的是将“*.laptop.example.com”的所有请求解析为“192.168.2.2”——这是手动分配的虚拟网络接口的 IP 地址(不是 DHCP)。
我正在使用虚拟网络接口(由 Parallels 提供)以确保 IP 地址始终保持不变(eth0 在连接到不同网络时将更改其 IP 地址),并确保它始终可用(eth0 已禁用/不可用未插入网络电缆时)。
我一直在使用以下设置:
options {
...
forwarders {
192.168.1.1;
};
forward only;
};
但是,这需要每次笔记本电脑更改网络时更新配置(因为大多数网络使用不同的 DNS 地址)。
我想放弃这个要求,这样如果 BIND/Named 不能识别域名(即它不是“laptop.example.com”的子域),那么它会返回一个错误,以便笔记本电脑可以尝试第二个它记录在案的 DNS 地址(从 DHCP 获取的地址)。
一种可能性是使用:
options {
...
forwarders {
};
forward only;
recursion no;
};
这确实阻止了它花费 3 多秒来查询 ROOT 服务器......但是客户端将该响应解释为“域不存在”,而不是可以通过尝试下一个服务器来修复的错误。
感谢 Alnitak、duffbeer703、John Gardeniers,所有反馈都非常好。
我针对我的问题使用的解决方案是使用launchd 来检测/etc/resolv.conf 中的更改,然后更新转发器列表。
通过创建文件:
与内容:
并加载:
一个脚本在:
可以运行类似:
然后在命名配置中,它可以使用它:
如果您想查看或使用完整的实现,请转到我的 BIND 设置页面并使用下载表单...它会创建一个带有单个安装脚本的 ZIP 包,因此希望它的设置和使用非常简单。
为什么不直接在主机文件中添加一个条目并省去所有麻烦呢?
您可能想要更详细地了解您正在尝试做的事情——这没有多大意义。我的建议是不要调整 DNS 基础——你正在破坏一些正常工作的东西。
主要和辅助 DNS 服务器位于您的网络配置中以确保可用性。如果 DNS 服务器无法提供答案,则客户端不会转到辅助服务器——发明 DNS 的人实施了“递归”的概念来解决这个问题。
如果您使用的是 Mac,您可能会发现使用 Bonjour/mDNS 是一条更有成效的途径。
尝试
unbound
改用。虽然它主要是一个递归服务器,但我相信它能够提供您需要的通配符覆盖,以及将其他所有内容转发到当前的上游 DNS 服务器,如自动从
/etc/resolv.conf
.