我有一个充当 DNS 管理器的 Web 应用程序,将所有区域写入“/var/named”。我希望能够配置命名以加载该文件夹中的所有区域,而无需明确告诉它哪个区域属于哪个文件。
这可能吗?
原因是我将添加/删除很多区域,每个区域都有很多记录。我原本想使用数据库来实现这一点,但插入 500 条记录的想法让我感到害怕(需要快速完成)。写入文件更容易。
有什么建议么?
答案1
正如问题所述,bind9 无法做到这一点。然而,问题实际上在于如何对所服务的区域进行重大更改,而不会影响性能。
可能的建议是:
使用 bind9 动态加载区域
bind10(但它还不成熟,你可能不想在关键生产环境中依赖它)
另一个 DNS 服务器,例如 powerdns。如果您使用的是默认推荐架构对于 powerdns 的 SQL 后端,它将为域表中的所有区域提供服务,因此如果您可以让“dns 管理器”更新该表,那么您就可以开始工作了。至少,一个立即、笨拙的解决方法是让 powerdns 的 zone2sql 工具获取您的 dns 管理器应用程序创建的区域文件并将其插入到数据库中。
答案2
我认为这不可能。BIND 喜欢为每个区域单独配置自己的zone
块,其中包含区域文件的名称和其中的域名。
答案3
正如其他人所说,这并非直接可能的。
但是,您仍然可以自动化它!
设置一个脚本(makefile、bash 等等)生成包含所有区域块的正确的 bind9 配置文件:
AUTOZONEFILE=/var/lib/named/etc/named.conf.autozone
cp -a $AUTOZONEFILE $AUTOZONEFILE.old
> $AUTOZONEFILE.new
for zonefile in /var/lib/named/master/autozones/*; do
CURZONE="$(basename "$zonefile")"
cat <<EOF >> $AUTOZONEFILE.new
zone "$CURZONE" {
type master;
file "master/autozones/$CURZONE";
};
EOF
done
cat $AUTOZONEFILE.new > $AUTOZONEFILE
rm $AUTOZONEFILE.new
rndc reload
尝试一下这样的事情。