我在 Bind 的主从配置中偶然发现了一个奇怪的错误。
该区域在主服务器上工作正常,但在从服务器上我遇到了这些错误:
21-May-2014 19:06:07.573 general: info: zone example.com/IN: refresh: failure trying master 1.2.3.4#53 (source 0.0.0.0#0): unexpected end of input
这是我的绑定文件的样子:
@ IN SOA ns1.example.com. admin.example.com. (
2014052116 ; Serial
28800 ; Refresh
180 ; Retry
604800 ; Expire
21600 ) ; Minimum
86400 IN A 1.2.3.4
86400 IN MX 10 mail.example.com.
86400 IN MX 20 mail2.example.com.
86400 IN NS ns1.example.com.
86400 IN NS ns2.example.com.
86400 IN NS ns3.example.com.
86400 IN NS ns1.example.net.
86400 IN NS ns2.example.net.
86400 IN NS ns3.example.net.
86400 IN NS ns1.example.org.
; until here it works -- if I uncomment the below here, I'll get "end of input" failures.
; 86400 IN NS ns2.example.org.
; 86400 IN NS ns3.example.org.
* 86400 IN A 1.2.3.4
[...]
如果我取消注释已注释的两条 NS 行 - 我将收到“输入结束”错误。如果我让他们评论,一切正常。
是否有最大数量的 NS 或文件大小导致它崩溃?
谢谢。
编辑:
命名检查区:
master # named-checkzone example.com example.com.
zone example.com/IN: example.com/MX 'mail.example.com' is a CNAME (illegal)
zone example.com/IN: example.com/MX 'mail2.example.com' is a CNAME (illegal)
zone example.com/IN: loaded serial 2014052105
OK
全局选项:
options {
directory "/var/cache/bind";
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
listen-on { any; };
dnssec-enable yes;
recursion no;
statistics-file "/var/log/named.stats";
try-tcp-refresh yes;
};
版本(在所有三台服务器上相同):
# named -v
BIND 9.8.4-rpz2+rl005.12-P1
我认为您遇到了最大允许的 UDP DNS 数据包大小 512 字节。在发出预期
AXFR
请求(以 TCP 模式运行;无大小限制)之前,从属服务器还将进行SOA
查询以确认主服务器认为自己对该区域具有权威性。您在这里遇到的问题是,
SOA
响应将不仅仅包含 QUESTION 和 ANSWER 部分:A
和AAAA
记录。这就是为什么调整您的
NS
记录或其关联的A
/AAAA
记录会影响整个区域传输的成功,但添加其他记录类型没有影响。您的组合权限数据对于通过 UDP 传输的数据来说太大了。不幸的是,我不知道有任何解决方法。BIND 管理员参考手册确实提到了一个
try-tcp-refresh
选项,但默认为 yes 并且在您的选项中没有禁用它。不过,我不确定区域转移是否会结束您的问题。即使它成功了,这也会给任何客户带来问题,这些客户反过来会提出任何包括您的 AUTHORITY 和 ADDITIONAL 部分的请求。EDNS0 旨在解决此类问题,但我认为AUTHORITY 膨胀在功能上的级别太低,无法启动。希望我的分析在某种程度上是错误的。我认为您有一个非常有趣的问题,我希望看到有人对此提供更好的答案,因为我也愿意从中学习。