我正在设置一个简单的 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 服务器......但是客户端将该响应解释为“域不存在”,而不是可以通过尝试下一个服务器来修复的错误。
答案1
感谢 Alnitak、duffbeer703、John Gardeniers,大家的反馈都非常好。
我解决此问题所采用的解决方案是使用 launchd 来检测 /etc/resolv.conf 中的更改,然后更新转发器列表。
通过创建文件:
/Library/LaunchDaemons/myname.update.plist
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>myname.update</string>
<key>ProgramArguments</key>
<array>
<string>[PATH]/update.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/var/run/resolv.conf</string>
</array>
</dict>
</plist>
并加载:
launchctl load /Library/LaunchDaemons/myname.update.plist
launchctl start myname.update
脚本位于:
[PATH]/update.sh
可以运行如下命令:
DST="/var/named/forwarders.conf";
echo "forwarders {" > $DST
cat /etc/resolv.conf | \
grep -v -E "(127.0.0.1|localhost)" | \
awk '{ sub("^nameserver ", "\t"); sub("$", ";"); print }' >> $DST
echo "};" >> $DST
然后在命名的配置中,它可以与以下内容一起使用:
options {
directory "[PATH]/conf/";
listen-on { 127.0.0.1; [IP_ADDRESS_HOST]; };
include "/var/named/forwarders.conf";
forward only;
};
如果你想查看或使用完整的实现,请访问我的 BIND 设置页面并使用下载表单...它会创建一个带有单个安装脚本的 ZIP 包,因此希望它的设置和使用非常简单。
答案2
为什么不直接在 hosts 文件中添加一个条目,省去所有麻烦呢?
答案3
您可能需要更详细地说明您要做什么——这没有多大意义。我的建议是不要调整 DNS 基本原理——您正在破坏一些可以正常工作的东西。
主 DNS 服务器和辅助 DNS 服务器位于您的网络配置中,以确保可用性。如果 DNS 服务器无法提供答案,则客户端不会转到辅助服务器 - 发明 DNS 的人实施了“递归”概念来解决该问题。
如果您使用的是 Mac,您可能会发现使用 Bonjour/mDNS 是更高效的途径。
答案4
尝试使用unbound
反而。
虽然它主要是递归服务器,但我相信它能够提供您需要的通配符覆盖,并将其他所有内容转发到当前的自动从 中学习上游 DNS 服务器/etc/resolv.conf
。