将转发器DNS请求强制为TCP模式


9

我在多宿主服务器上的SLES10(当前绑定9.6)上设置了DNS服务器。可以从所有内部网络查询此服务器,并为所有内部网络提供答案。我们有两个单独的DNS“主”区域。每个区域都由许多权威的Windows-DNS服务器提供服务。

现在,我的linux服务器是这些区域之一(私有内部区域)的辅助DNS服务器,并充当另一个区域(公共内部区域)的转发器。

直到最近,该设置仍能正常工作。现在我得到了-在查询公共内部区域(例如,通过hostLinux客户端上的命令)时,错误消息

;; 截断,以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|
                  +------+   +------+

一个小的图表很有用-我正在努力从您的描述中找出哪个服务器。
Alnitak

稍好一些,尽管仍不清楚您正在运行该host命令的确切主机与发送什么查询之间。
Alnitak 2012年

客户通过SLES10请求来自区域public internal的条目。区域专用内部区域不会受到影响-因为那里只有2个NS条目。
Nils 2012年

而客户只是普通的存根解析器?
Alnitak

建议您将其添加minimal-responses: yes到SLES 10的BIND配置中-这可能会减小响应大小。无论如何,大多数普通查询不会超过512字节的限制。
Alnitak

Answers:


8

首先,我不会将其称为错误,而只是提供信息。

其次,DNS服务器将始终回答UDP查询(至少BIND,我找不到禁用UDP的选项),客户端将总是(?)尝试首先发送UDP查询(例如resolv.conf中没有用于更改该选项的选项)也不在JVM中)-如果它们适合UDP数据包(通常要求)

如果您有特定的用例,则可以指定使用TCP,例如在shell脚本中使用'dig + tcp'或'host -T'进行解析,并且可以使用系统调用'sethostent / gethostbyname / endhostent'(请参见man页)在其他情况下强制使用TCP。

如果您真的想尝试阻止UDP,我只能看到一个iptable规则,但是我不确定该设置是否可行。我希望DNS解析只会失败。


先验地知道UDP查询将失败,并首先尝试通过TCP,这在名义上可以带来性能上的好处。有关此内容的某些讨论,请参见RFC 5966。
Alnitak

@Alnitak,我想得到这个好处。
尼尔斯2012年

1
@Nils,所以我们需要弄清楚为什么EDNS显然无法正常工作……
Alnitak 2012年

我没有特殊的用例-客户将使用他们的解析器库-但是每个请求和每个答案都会在网络上传输两次-我不喜欢这样。
尼尔斯2012年

@Nils,问题是客户端决定UDP / TCP,但是服务器知道答案的大小。
Dan Andreatta 2012年

4

您的BIND服务器使用EDNS(请参阅RFC 2671)以允许UDP数据包长于512字节。

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

这应该允许您的大型NS集可以通过UDP检索,而对于其他较小的查询则不需要TCP连接的开销。

但是请注意,这些实际上是默认值。如果未使用EDNS,则可能是某种原因阻止了它,或者接收EDNS选项的服务器不支持它。

另外,请注意,host它不支持EDNS。您的转发器->服务器查询很可能已经在使用EDNS,并且在尝试使用本地客户端时完全看不到它。

尝试dig +bufsize=4096 @server hostname A使用而不是host


谁应该使用这个?可能是我的服务器还是来自“公共内部”区域的转发器?
尼尔斯2012年

无论如何,发送答案中的NS完整列表有什么意义?
尼尔斯2012年

@Nils DNS协议要求匹配相同(QNAME,QTYPE和QCLASS)元组的完整条目集是不可分割的(又名“ RRset”)
Alnitak 2012年

您能否指出我有关此RRset的RFC?
尼尔斯2012年

1
Actaully主机使用标准的解析程序库,在我的工作站上它支持EDNS0。要测试请求是否指定EDNS0,请运行“ tcpdump -x端口53”,并且十六进制转储应包含(在结尾处,在附加部分中)序列0029 1000 0000 8000 0000,这是OPT RR的二进制表示形式。
Dan Andreatta 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.