我已经在SLES10上设置了一个DNS服务器(目前绑定9.6)在多主机服务器上。可以从所有内部网络查询此服务器,并为所有内部网络提供答案。我们有两个独立的DNS“主”区域。每个区域都由多个权威的Windows-DNS服务器提供服务。
现在,我的linux服务器是这些区域之一(私有内部区域)的辅助DNS服务器,并充当另一个区域(公共内部区域)的转发器。
直到最近,这种设置还没有出现问题。现在,我开始查询公共内部区域(例如,通过linux客户机上的host命令)来查询错误消息。
;;被截断,在TCP模式下重试。
wireshark转储揭示了原因:第一个查询在UDP模式下,答案不适合UDP (由于权威NS的长列表),然后在TCP模式下重新尝试,提供正确的答案。
现在的问题是:我是否可以将绑定配置为在TCP模式下查询转发器而不首先尝试UDP?
更新:试着用ASCII-艺术.
+--------------+ +--------------+ +-----------------+
| W2K8R2 DNS | | SLES 10 DNS | | W2K8R2 DNS |
| Zone private +---+ All internal +---+ Zone public |
| internal 2x | | Zones | | internal 30+ x |
+--------------+ +-+----------+-+ +-----------------+
| |
+--+---+ +--+---+
|Client| |Client|
+------+ +------+发布于 2012-01-10 11:11:12
首先,我不认为这是一个错误,仅仅是一条信息消息。
其次,DNS服务器将始终回答UDP查询(BIND,至少我找不到禁用UDP的选项),客户端总是(?)尝试首先发送UDP查询(例如,在resolv.conf中没有任何选项来更改该查询,也没有JVM中的选项)--如果它们适合于UDP数据包(请求通常是这样的)
如果您有特定的用例,您可以指定使用TCP,例如在shell脚本中使用'dig + TCP‘或'host -T’来解决问题,在其他情况下可以使用系统调用‘setho支架/gethostbyname/endhostent’(参见手册页)强制使用TCP。
如果您真的想阻止UDP,我看到的唯一选项是使用iptable规则,但我不确定该设置是否有效。我希望DNS解析会简单地失败。
发布于 2012-01-10 10:20:01
绑定服务器应该使用EDNS (参见RFC 6891)来允许UDP数据包超过512个字节。
options {
edns-udp-size 4096;
max-udp-size 4096;
};这应该允许通过UDP检索大型NS集,而无需为其他较小的查询设置TCP连接的开销。
但是,请注意,这些实际上是默认值。如果没有使用EDNS,那么要么是某些东西阻塞了它,要么是接收EDNS选项的服务器不支持它。
另外,请注意,host不支持EDNS。您的转发器->服务器查询已经在使用EDNS,这是完全可能的,您只是在尝试使用本地客户端时看不到它。
尝试使用dig +bufsize=4096 @server hostname A而不是使用host。
https://serverfault.com/questions/348399
复制相似问题