将转发器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.