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

Nil*_*ils 10 domain-name-system bind tcp sles10

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

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

直到最近,这种设置都没有问题。现在我得到 - 在查询公共内部区域时(例如通过hostlinux 客户端上的命令)错误消息

;; 截断,在 TCP 模式下重试

一个wireshark-dump揭示了这个原因:第一个查询在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|
                  +------+   +------+
Run Code Online (Sandbox Code Playgroud)

Dan*_*tta 9

首先,我不会称其为错误,而只是一条信息性消息。

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

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

如果您真的想尝试阻止 UDP,我能看到的唯一选项是使用 iptable 规则,但我不确定该设置是否有效。我预计 DNS 解析只会失败。