我仅使用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.com
,CNAME
尚未过期,但A
已过期,因此仅bind9
要求B.B.B.B
A:
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每次都能看到原始客户端的请求。
用更愚蠢的东西代替bind9
?dnsmasq
是完美的答案,除非那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% 准确的。这迫使递归服务器追踪别名,直到找到最终答案(如果存在)。标准对此有明确的规定。