我有一个运行 Bind 9.2 的旧主名称服务器和一个运行 9.8 的新从属服务器。现在我们有一个项目正在进行,我们基本上将云一分为二,我们使用子区域和 CNAME 来保持我们的服务顺利运行。但是,老旧的 9.2 服务器似乎不想将 CNAME 解析为子区域并返回REFUSED: recursion requested but not available
. 另一方面,9.8 服务器可以很好地处理请求。
免责声明:我知道这些域名服务器已经过时了,更糟糕的是,运行 9.2 操作系统的服务器也失去了支持,所以我不太可能找到一个有信誉的软件包来升级它。云拆分后的项目正在从头开始重建我们的 DNS 服务器/服务。
如何让旧服务器正确解析这些 CNAME?
dig
结果
挖@NS1 [绑定9.2]
# dig foo.domain.com @ns1.domain.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> foo.domain.com @ns1.domain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 5937
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;foo.domain.com. IN A
;; Query time: 116 msec
;; SERVER: 4.3.2.1#53(4.3.2.1)
;; WHEN: Fri Jul 31 16:18:36 2015
;; MSG SIZE rcvd: 48
挖@NS2 [绑定9.8]
# dig foo.domain.com @ns2.domain.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> foo.domain.com @ns2.domain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59986
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;foo.domain.com. IN A
;; ANSWER SECTION:
foo.domain.com. 300 IN CNAME foo.sub.domain.com.
foo.sub.domain.com. 300 IN A 5.6.7.8
;; AUTHORITY SECTION:
sub.domain.com. 300 IN NS ns1.domain.com.
sub.domain.com. 300 IN NS ns2.domain.com.
;; ADDITIONAL SECTION:
ns1.domain.com. 30 IN A 4.3.2.1
ns2.domain.com. 30 IN A 1.2.3.4
;; Query time: 80 msec
;; SERVER: 1.2.3.4#53(1.2.3.4)
;; WHEN: Fri Jul 31 16:22:29 2015
;; MSG SIZE rcvd: 161
配置
下面是服务器的配置文件,精简到最基本的部分。
NS1 [绑定 9.2]
options {
recursion no;
additional-from-auth no;
additional-from-cache no;
blackhole { bogon; };
directory "/var/named";
notify yes;
};
zone "domain.com" {
type master;
file "/var/named/domain.com.hosts";
also-notify { 1.2.3.4; };
notify yes;
};
zone "sub.domain.com" {
type master;
file "/var/named/sub.domain.com.hosts";
also-notify { 1.2.3.4; };
notify yes;
};
NS2 [绑定 9.8]
options {
directory "/var/named";
recursion no;
blackhole{ bogon; };
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
};
zone "domain.com" {
type slave;
masters { 4.3.2.1; };
allow-transfer { 4.3.2.1; };
file "/var/named/slaves/domain.com.hosts";
};
zone "sub.domain.com" {
type slave;
masters { 4.3.2.1; };
allow-transfer { 4.3.2.1; };
file "/var/named/slaves/sub.domain.com.hosts";
};
domain.com.hosts
$ORIGIN .
$TTL 300 ; 5 minutes
domain.com IN SOA ns1.domain.com. servers.domain.com. ( ... )
NS ns1.domain.com.
NS ns2.domain.com.
$ORIGIN domain.com.
sub NS ns1.domain.com.
sub NS ns2.domain.com.
foo CNAME foo.sub
sub.domain.com.hosts
$ORIGIN .
$TTL 300 ; 5 minutes
sub.domain.com IN SOA ns1.domain.com. servers.domain.com. ( ... )
NS ns1.domain.com.
NS ns2.domain.com.
$ORIGIN sub.domain.com.
foo A 5.6.7.8
我在 IRC 上向一些聪明的家伙提出了这个问题并得到了答案:
no
两者都在我的配置中明确设置。http://www.zytrax.com/books/dns/ch7/queries.html#additional-from-auth
然后表格基本上归结为:
使用混淆示例解决 DNS 问题非常困难,我们经常这样说。(正如 MadHatter 已经指出的那样)当我们遇到不合逻辑的情况时,我们基本上必须假设您没有向我们展示某些内容,或者由于翻译错误而污染了示例。您的评论似乎表明您的答案的上下文对于阅读您的问答的任何人都应该是“显而易见的”,但这显然是假的。
这应该是
domain.com
两台服务器上区域的内容:然而,您告诉我们请求
foo.domain.com
正在您的一台服务器上返回REFUSED
?抱歉,没有。如果您准确地呈现它,这是一个错误配置,因为当这是加载到内存中的实际区域文件时,服务器应该不可能返回该答案。
SOA
(假设它确实加载了——由于显而易见的原因,我们无法通过查询进行验证)REFUSED
意味着服务器完全拒绝查询,因为它将查询解释为对区域外信息的请求。CNAME
在这种情况下,记录的目标(右侧)是什么并不重要;左侧是唯一重要的事情。即使目标不在区域内也没关系,这只是意味着您的服务器将提供答案CNAME
而不提供相应的A
记录。(除非其他区域位于同一服务器上,这里应该是这种情况)但仍然如此NOERROR
,不是REFUSED
. recursion desired (rd
) 标志的存在也不会影响权威上下文中的此行为。我了解您希望我们相信您的回答解决了您向我们提出的问题,但事实并非如此。我无法谈论可能为您解决问题的其他更改,但您的示例配置清楚地表明该数据应该在区域内。您调整的选项应该对此没有影响。我们可以相信您的更改已经解决了问题的某个地方,但这确实是 1 + 1 = 西葫芦的情况。
为了您自己,请确保
aa
标志存在于 NS1 的响应中。