我有一个老的名字服务器运行绑定9.2和一个较新的奴隶运行9.8。 现在我们已经有了一个项目,我们将云分成两部分,我们使用子区域和CNAME来保持我们的服务平稳运行。 然而,古怪的旧9.2服务器似乎并不想将CNAMEparsing到子区域,并返回REFUSED: recursion requested but not available 。 另一方面9.8服务器服务的请求就好了。
免责声明:我知道这些名字服务器是可怕的过时,更糟糕的是运行9.2的操作系统是waaaaay支持以及,所以我不可能find一个有信誉的软件包升级它。 在这个云分割之后,立即重build我们的DNS服务器/服务。
如何让旧服务器正确parsing这些CNAME?
dig结果 # 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
# 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
下面是服务器的configuration文件,缩减到最基本的要领。
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; };
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"; };
$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
$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上的一些聪明的帅哥扔了这个问题,得到了答案:
options { additional-from-auth yes; additional-from-cache yes; }
哪里都明确地设置为no在我的configuration。
http://www.zytrax.com/books/dns/ch7/queries.html#additional-from-auth
当区域具有附加(区域外)数据或者跟随CNAME或DNAMElogging时,
additional-from-cacheadditional-from-auth和additional-from-cache控制行为。 这些选项用于configuration只有权威的(非caching)服务器,并且只有在全局选项子句或视图子句中指定了recursion no时才有效。 在这两种情况下的默认值是肯定的。 这些语句可用于全局选项或视图子句中。 行为由下表定义:
然后,表格基本归结为:
如果它们都不是都设置为
yes那么在这个问题中引用的查询types将会或多或less地被拒绝。
用混淆的例子来解决DNS问题是非常困难的 ,我们经常这样说。 (正如MadHatter已经指出的那样)当我们面对一个非限制性的问题时,我们基本上必须假设你没有向我们展示某些东西,或者你错误地翻译了这个例子。 您的评论似乎表明,对于任何阅读您问答内容的人来说,您的答案的内容应该是“显而易见的”,但这种说法显然是错误的。
这应该是两个服务器上的domain.com区域的内容:
$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
然而,你告诉我们, foo.domain.com的请求在你的一台服务器上返回foo.domain.com ?
# 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
抱歉,没有。 如果您准确地呈现它,那么这是错误的configuration ,因为当实际的区域文件加载到内存中时,服务器不应该返回该答案。 (假设它确实加载了 – 我们无法用一个SOA查询validation,原因很明显)
REFUSED意味着服务器直接拒绝查询,因为它将查询解释为区域信息不足的请求。 在这种情况下, CNAMElogging的目标(右侧)无关紧要; 左边是唯一重要的事情。 即使目标不在区域内,也没关系,这只是表示您的服务器将提供CNAME的答案,而不提供相应的Alogging。 (除了另一个区域位于同一台服务器上的情况,这应该是这里的情况)尽pipe如此,这仍然是NOERROR ,而不是REFUSED 。 recursion期望( rd )标志的存在不会影响权威性上下文中的这种行为。
我明白,你希望我们相信你的答案解决了你给我们提出的问题,但事实并非如此。 我不能说什么可能已经解决了你的问题,但你的示例configuration清楚地表明,这个数据应该是在区域内。 你调整的选项应该没有影响。 我们可以承认,你的改变已经解决了这个问题,但这确实是1 + 1 =西葫芦的案例。
为了你自己的利益,请确保NS1响应中出现aa标志。