在我的云环境中,我有一个 bind9 服务器,它充当环境中生成的所有传出 DNS 查询的代理。我目前正在尝试配置 Bind 以在其名称解析流程中执行以下过滤 -
- 允许对某些区域进行递归解析(比如说
aws.com
和gcp.com
) - 不允许对任何其他区域进行查询,包括那些持有前面提到的域的 CNAME 的区域(例如,如果
A.aws.com
有 CNAME 到custom.service.digitalocean.com
,则允许递归解析,但不允许任何客户端请求到*.service.digitalocean.com
据我所知,实现此目的的方法是使用 RPZ(可能允许带有标志的区域recursive-only
,并拒绝对同一区域的所有其他解析)。但是,我无法获得有效的配置或找到任何示例。
编辑:我还没有设法让 RPZ 在转发区域上工作(它似乎仅在主/从区域上工作)。
有什么想法吗?对我来说,实现相同功能(没有 RPZ)的其他方法同样可以接受...
答案1
事实并非如此。
递归通常允许按观看次数计算,进而匹配特定的客户。递归是将 DNS 名称最终完整地解析为 IP 地址的过程,它被称为递归因为组成名称的所有层级都会发生相同的过程(例如,foo.barname 解析名称需要 3 个步骤:一个用于尾随 TLD .,我省略了,一个用于酒吧部分和一个富部分)。
你似乎还混淆了递归解析器与权威国家安全局。后者服务于特定的 DNS 区域,为了正常工作,它应该为所有外部世界提供这些区域(让我们先不考虑当你让你的 NS 模仿一些它不具有权威性的区域时的情况)。DNS 服务器实例当然可以包含这两个实体,但它们的功能完全不同。因此,当你的 NS 托管/服务一些 DNS 区域时,它实际上并不关心传入的请求是否是递归的。最后部分:当你的权威 NS 使用 CNAME-RR 回答时(资源记录) 指向某人的另一个区域,表明所请求的主机没有 A-RR,因此请求者需要进一步解决此问题:当您对某个内容进行 CNAME 时,您实际上不需要处理与目标区域记录有关的任何内容。例如:foo.bar是一个指向富巴尔。现在,解析器的负担就落在了请求者的身上富巴尔对于位于适当区域的客户端,从一开始就启动回退,而不是您的 NS。
因此,最后,您要求的是任何已知 DNS 服务器实现都会运行的开箱即用逻辑:仅为允许查询的区域提供服务,并且仅为允许请求递归的客户端(例如,密钥)执行递归。
答案2
设置起来很简单,但你可能需要另一台服务器,或者只是使用公共解析器。我将使用公共解析器 (cloudflare) 的示例
首先,在 DNS 服务器中设置转发区域
绑定配置格式如下
zone "somedomain.com" {
type forward;
forwarders { 1.1.1.1; };
};
zone "anotherdomain.org" {
type forward;
forwarders { 1.1.1.1; };
};
其次,通过将所有其他 DNS 查询转发到黑洞来阻止它们
绑定配置顶部有类似这样的内容
options {
directory "/var/cache/bind";
recursion yes;
forwarders {
192.168.255.254;
};
会发生什么
对 somedomain.com 和 anotherdomain.org 的查询将被转发到 Cloudflare 并在上游得到完全解析(包括可能是其他域的 CNAME 目标)。
对任何其他域的查询都将被转发到无响应的服务器或 IP,并且永远不会得到解决。