我偶然发现 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
答案1
我认为您已经达到了允许的最大 UDP DNS 数据包大小 512 字节。在发出预期AXFR
请求(以 TCP 模式运行;没有大小限制)之前,从属服务器还将进行查询,SOA
以确认主服务器认为自己对该区域具有权威性。
您在这里遇到的问题是,响应SOA
将包含的不仅仅是问题和答案部分:
- AUTHORITY 部分将包含您配置的所有名称服务器。
- ADDITIONAL 部分将包含这些名称服务器的所有已知信息
A
和AAAA
记录。
这就是为什么调整您的NS
记录或与其关联的A
/AAAA
记录会对整个区域传输的成功产生影响,而添加其他记录类型则不会产生影响。您的组合权限数据对于可以通过 UDP 传输的数据来说太大了。
不幸的是,我不知道有任何解决方法。BIND 管理员参考手册确实提到了一个try-tcp-refresh
选项,但默认为是,并且它没有在您的选项中禁用。不过,我不确定区域传输是否能解决您的问题。即使它成功了,这也会给任何客户端带来问题,这些客户端反过来会发出任何包含您的 AUTHORITY 和 ADDITIONAL 部分的请求。EDNS0 旨在解决此类问题,但我思考AUTHORITY 膨胀在功能上处于太低的水平,无法发挥作用。
希望我的分析在某种程度上是错误的。我认为你的问题非常有趣,我希望有人能提供更好的答案,因为我也能从中学到东西。