我已经在多宿主服务器上的SLES10上build立了DNS服务器(当前绑定9.6)。 该服务器可以从所有内部networking查询,并为所有内部networking提供答案。 我们有两个独立的DNS“主”区域。 每个区域都由许多权威的Windows-DNS服务器提供服务。
现在我的linux服务器是这些区域之一(私有内部区域)的辅助DNS服务器,并充当其他区域(公共内部区域)的转发器。
直到最近这个设置工作没有问题。 现在我开始查询公共内部区域(例如,通过Linux客户机上的host命令)查看错误消息
;; 截断,在TCP模式下重试
一个wireshark转储揭示了这个原因:第一个查询以UDP模式出去,答案不适合UDP(由于权威NS的列表很长),然后在TCP模式下重试,提供正确的答案。
现在的问题是:我可以configuration我的绑定查询转发器在TCP模式下,而不先尝试UDP?
更新:尝试我的手在ASCII艺术…
+--------------+ +--------------+ +-----------------+ | W2K8R2 DNS | | SLES 10 DNS | | W2K8R2 DNS | | Zone private +---+ All internal +---+ Zone public | | internal 2x | | Zones | | internal 30+ x | +--------------+ +-+----------+-+ +-----------------+ | | +--+---+ +--+---+ |Client| |Client| +------+ +------+
首先,我不会说这个错误,只是一个信息性的消息。
其次,DNS服务器将总是回答UDP查询(至less是BIND,我找不到禁用UDP的选项),客户端将始终(?)尝试首先发送UDP查询(例如,resolv.conf中没有选项可以更改也不在JVM中) – 如果它们适合UDP数据包(通常请求)
如果你有一个特定的用例,你可以指定使用TCP,例如在shell脚本中使用'dig + tcp'或'host -T'来parsing,你可以使用系统调用'sethostent / gethostbyname / endhostent'(见man页面)在其他情况下强制执行TCP。
如果你真的想尝试和阻止UDP,我可以看到唯一的select是使用iptable规则,但是我不确定这个设置是否可行。 我预计DNSparsing会失败。
您的BIND服务器应使用EDNS(请参阅RFC 2671)允许长度超过512字节的UDP数据包。
options { edns-udp-size 4096; max-udp-size 4096; };
这应该允许通过UDP检索大的NS集,而不需要为其他较小的查询开销TCP连接。
但请注意,这些实际上是默认值。 如果EDNS没有被使用,或者有东西阻塞了它,或者接收EDNS选项的服务器不支持它。
另外请注意, host不支持EDNS。 您的转发器 – >服务器查询完全有可能已经在使用EDNS,并且当您尝试使用本地客户端时,您将看不到它。
试试dig +bufsize=4096 @server hostname A而不是使用host 。