查询多个 DNS 的 DNS 代理/缓存,忽略 NXDOMAIN

查询多个 DNS 的 DNS 代理/缓存,忽略 NXDOMAIN

问题如下:如何设置 DNS 代理/缓存,以严格的顺序查询一系列 DNS 服务器(其中一些可能不可用),并且不会在第一个 NXDOMAIN 答案上停止。

语境:

我工作的地方有一个主域名:company.com,以及 2 个 VPN:vpn1 和 vpn2。它们并不完全相同:vpn2 允许您连接到比 vpn1 更多的服务。连接到 vpn2 时基本上不需要 vpn1。

一些子域名可从互联网获得:open.company.com 一些子域名只能从 vpn1 和 vpn2 获得:internal.company.com 一些子域名只能从 vpn2 获得:private.company.com

现在,vpn1 有一个 DNS 服务器:dns1,而 vpn2 有一个不同的 DNS 服务器:dns2;每个服务器都有自己的配置。

问题是:一些可从 VPN1(因此也是 VPN2)访问的服务是在 dns1 中配置的,但没有在 dns2 中配置。

更大的问题是,当询问 dns2 时,它会使用 NXDOMAIN 来回答。

因此,我正在寻找一种按照以下特定顺序询问 DNS 的方法:dns2、dns1、8.8.8.8,但不会在第一个 NXDOMAIN 答案上停止。

我尝试使用 DNSMasq 和“all-servers”参数,但存在 2 个问题:

  1. 我认为(我还没有测试过)如果来自 dns2 的 NXDOMAIN 在来自 dns1 的答案之前到达,则查询将失败
  2. 某些子域名由 dns1 和 dns2 同时解析,但连接到 vpn2 时应使用 DNS2 中配置的 IP。

我研究过 dnsmasq、bind 和其他随机 DNS 代理,但到目前为止还没有任何运气。

注意:显然,我无法更新 DNS1/DNS2 的配置。我正在寻找可以在我的笔记本电脑(ubuntu)上运行的解决方案

有什么想法吗?谢谢

答案1

我认为您无法从任何 DNS 代理本机获得此行为,因为它违背了 DNS 的精神(DNS 服务器不应该使用 NXDOMAIN)。

因此,我的建议是主动过滤掉来自 DNS2 的错误答案,以便您的代理只能看到来自 DNS1 的答案并且不会产生歧义。

这可以通过在防火墙中添加规则来实现,仅过滤包含 NXDOMAIN 标志(来自 DNS1)的 DNS 应答包。然后使用 all-servers 参数保留您的 dnsmasq 配置。

iptables 丢弃负面 DNS 响应寻找一种过滤 DNS 答案的方法。

请注意,如果您遇到反向问题(DNS1 首先使用 NXDOMAIN 回答 DNS2 中存在的某个内容),您也可以过滤掉这些答案。但是,这意味着,如果存在真正不存在的域,您将不会从任何 DNS 获得任何答案,并且可能会超时。我猜从您的上下文来看这不是一个大问题,但如果是这样,您最好只延迟 NXDOMAIN 答案,就像在链接的帖子中所做的那样,尽管这是一个更复杂的设置。

祝你好运。

相关内容