BIND/Named:禁用递归,客户端使用备用服务器

BIND/Named:禁用递归,客户端使用备用服务器

我正在设置一个简单的 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

相关内容