配置 bind9 以按原样转发查询并按原样回复答案,或搜索完美的转发器

配置 bind9 以按原样转发查询并按原样回复答案,或搜索完美的转发器

我仅使用bind9服务器 ( A.A.A.A) 作为转发器:查询被转发到其他 DNS 服务器 ( B.B.B.B)。我手动请求B.B.B.B解析域名并得到正确结果:

$ dig a downloadcenter.intel.com @B.B.B.B
;; ANSWER SECTION:
downloadcenter.intel.com. 182   IN      CNAME   downloadcenter.intel.com.edgekey.net.
downloadcenter.intel.com.edgekey.net. 17879 IN CNAME e11.b.akamaiedge.net.
e11.b.akamaiedge.net.   19      IN      A       172.231.112.37

我期望bind9服务器A.A.A.A将对服务器执行相同的单个查询B.B.B.B并返回地址172.231.112.37。但实际上它执行了两个查询:首先它请求A downloadcenter.intel.com,其次它请求A e11.b.akamaiedge.net。有没有办法信任第一个答案并只对执行一次查询B.B.B.B

我需要这个,因为我需要在 AAAA 和 BBBB 上拥有相同的解析 IP 但如果进行了两次查询,那么有时服务器可能会缓存不同的 IP。这种情况通常发生在 TTL 记录较低的情况下,就像这个一样。

我查阅了相关文献,其中最接近的部分是关于内容过滤,但我找不到直接的答案。我也试过未绑定,但它有同样的问题;这里是源代码的相关部分

B.B.B.B解释该问题的服务器日志:

Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: query[A] downloadcenter.intel.com from 192.168.0.175 ← first query
Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: forwarded downloadcenter.intel.com to 8.8.8.8
Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: reply downloadcenter.intel.com is <CNAME>
Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: reply downloadcenter.intel.com.edgekey.net is <CNAME>
Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: reply e11.b.akamaiedge.net is 172.231.112.37
Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: query[A] e11.b.akamaiedge.net from 192.168.0.175 ← extra query
Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: forwarded e11.b.akamaiedge.net to 8.8.8.8
Mon Feb  1 06:56:34 2016 daemon.info dnsmasq[9664]: reply e11.b.akamaiedge.net is 2.21.192.37

另一个问题是,如果客户端要求再次A.A.A.A解析downloadcenter.intel.comCNAME尚未过期,但A已过期,因此仅bind9要求B.B.B.BA:

Mon Feb  1 07:08:02 2016 daemon.info dnsmasq[9664]: query[A] e11.b.akamaiedge.net from 192.168.0.175
Mon Feb  1 07:08:02 2016 daemon.info dnsmasq[9664]: forwarded e11.b.akamaiedge.net to 8.8.8.8
Mon Feb  1 07:08:02 2016 daemon.info dnsmasq[9664]: reply e11.b.akamaiedge.net is 23.53.35.18

我需要一种方法来准确转发查询,就像要求的那样。Bind9 在这里太聪明了。有没有办法禁用bind9缓存?

downloadcenter.intel.com这是我的设置中所必需的,因为我希望服务器 BBBB每次都能看到原始客户端的请求。

用更愚蠢的东西代替bind9dnsmasq是完美的答案,除非那A.A.A.A是 Windows 主机,所以替代方案有限。

Bind9 的配置(A.A.A.A):

options {
    dnssec-validation no;
    auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { any; };
    forwarders {
        B.B.B.B;
    };
    forward only;
};

BBBB 服务器是一个dnsmasq

答案1

您的起始假设是错误的:

我预计服务器 AAAA 将对服务器 BBBB 执行相同的单一查询并返回地址 172.231.112.37。

让我们详细分析一下。

  • 客户端正在请求一个A名为类型的记录downloadcenter.intel.com.
  • 没有此A記錄。
  • 递归服务器不能撒谎说A该记录的记录值是 IP 地址。它必须报告遇到的别名。

剩下的就是递归了。通俗地说,如果一个递归服务器收到一个递归查询(RD设置了 flag),它必须假设客户端是完全愚蠢并且它不能执行任何自己的递归查找。没有空间进行吹毛求疵,因为在大多数情况下,这是 100% 准确的。这迫使递归服务器追踪别名,直到找到最终答案(如果存在)。标准对此有明确的规定。

相关内容