我正在尝试配置一个“说谎的” DNS 服务器,或者以某种方式称之为“说谎的” DNS 服务器。
我的意思是:一个 DNS 服务器充当现有服务器的 DNS 缓存(从属服务器),但拥有自己的几个域名注册子集。
期望的行为例如是:
当查询“host.domain.com”时。如果它在自己的数据库中有对应的条目,则用该条目进行回答。
如果它不在其数据库中,则向主服务器询问(并可选择缓存该答案)。
我知道我可以将 bind9 用作从属服务器,但是这样,所有查询都会得到与真实服务器相同的答案。
当然,我知道这是一个棘手的设置,但它有一个有用的目的:
假设您拥有复杂的服务(例如我的情况中的 Bacula 备份配置和脚本),并且您想在将其投入实际生产之前针对实际生产服务器对其进行测试。
如果我可以将 DNS 临时重定向到那个“说谎的”DNS,这样除了少数“伪装”主机子集之外,所有名称都会照常解析,它就会表现得像一个“真实”设置,但实际上并不会使真实备份服务器存储与测试备份混淆。
当然,我可以使用/etc/hosts,但是它需要更多的设置并且更容易出错(我使用 Vagrant 完全自动化了测试环境,但 IP 有时会改变)。
克隆服务器并使用它来进行测试,也需要更多的工作和资源,并且更容易出错,因为测试结束后,我需要手动重新配置真实服务器,而使用“说谎的 DNS”方法,我只需要恢复原始 resolv.conf 文件。
我成功为我们的域配置了一个主 DNS 服务器,它可以正确解析其自己的条目并查询其他域,但不知道真实域服务器的数据。
我认为应该可以使用绑定来解决,但我不知道在哪里搜索...
答案1
Bind 和其他一些 DNS 服务器实现都支持一种称为响应政策区。此区域可让您覆盖特定记录。
以下是如何使用此功能强制启用 Google 安全搜索的示例。这将覆盖记录 google.com、www.google.com 和 google.ca。
命名配置文件
options {
...
response-policy { zone "rpz"; };
};
zone "rpz" IN {
type master;
file "rpdb.zone";
allow-query {none;};
};
rpdb.zone
$TTL 10800
@ IN SOA localhost. hostmaster.example.org. (
2014110500;
10800;
3600;
604800;
10800 )
IN NS localhost.
; Google forced Safe Search
google.com IN CNAME forcesafesearch.google.com.
www.google.com IN CNAME forcesafesearch.google.com.
google.ca IN CNAME forcesafesearch.google.com.
答案2
部分答案(它适用于我的设置,但它不像我最初的问题那么通用):
就我而言,我只需要覆盖特定子域的地址,具体来说bacula.ourDomain.com。
正如我所说的,我成功地将 bind 配置为 masterbacula.ourDomain.com,但我无法解决任何其他主机ourDomain.com。
现在我刚刚添加了这个:
options {
[...]
forwarders {<real_ns_ip>;};
[...]
}
这样,我的服务器就可以解析bacula.ourDomain.com,但对于其余的ourDomain.com要求<真实 ns_ip>。
正如我所说,这不是一个通用的解决方案,因为它不允许只选择域中的特定地址,但目前它已经足够满足我的目的了。
@Zoredache 可能是一个更好的解决方案,但我还没有成功付诸实践。