我有一个指向单个 IP 的 DNS 记录(例如:test.example.com):
test.example.com IN A 192.0.2.1
工作正常。现在我有 +30 个 IP 来回答它,例如:
teste.example.com IN A 192.0.2.1
teste.example.com IN A 192.0.2.2
(...)
teste.example.com IN A 192.0.2.31
现在它不稳定(“找不到主机”错误)。使用dig
我得到一个警告“截断,在 TCP 模式下重试”。经过一番谷歌搜索,我发现一个多IP查询必须不超过512字节才能保证使用UDP,并避免额外的查询(或no-tcp dns客户端或提供者的问题,旧的dns sw, ETC)。
那么,我如何知道在单个 dns 条目中可以拥有多少个 v4 IP 以保证最大 512 字节的 UDP 应答?
或者
是否可以将 ISC 绑定配置为在多 IP 查询中仅返回一个 IP?我知道IP可以循环使用rrset-order { order cyclic; };
。
喜欢:
> test.example.com
Server: x.x.x.x
Address: x.x.x.x:53
Name: test.example.com
Address: 192.0.2.6
所以,只有其中之一?谢谢。
从哪里/如何?
正如您所注意到的,所有正确设置的解析器都会在他们第一次通过 UDP 查询时获得一个截断标志,然后将切换到 TCP,一切都会好起来的。
当然,您记得 DNS 是基于 UDP和TCP(与流行的神话相反),因此您需要确保可以通过 TCP 查询您的权威名称服务器,一切都会好起来的。
这取决于。有时你可以超过 1000。但最重要的是,事情回退到 TCP,所以应该不是问题(也许只是性能上的轻微损失)。
“无 tcp dns 客户端或提供者”不应该存在,因为它没有任何意义,并且违反了 40 多年前编写的 DNS 规范!或者你有这些案例的具体证据吗?
不要试图绕过这样的事情。如果存在这些软件,它们就会被破坏,并且会出现大量其他问题,例如 DNSSEC 安全域。
这通常无法回答(因为取决于名称),但最重要的是,尝试以这种方式优化事物是徒劳的。
无论如何,您可以轻松地进行计算:
所以我们已经在 512-8-12 = 492 字节的 DNS 问题 + 答案。
作为回答,一条
A
记录将是名称(可变长度)+ 类型(2 个字节)+ 类(2 个字节)+ TTL(4 个字节)+ 长度(2 个字节),然后是数据。因为A
数据是 4 个字节(一个 IPv4 地址)。问题是名称(可变长度)+ 类型(2 个字节)+ 类(2 个字节)。
DNS 数据包中的名称具有以下两个属性:
因此,例如
example.com
在 DNS 中编码为 7,e,x,a,m,p,l,e,3,c,o,m,0 ,其中每个长度为一个字节,但如果以后需要名称,它将是替换为仅使用 2 个字节的指针。如果我们取这个名字:
因此,完整的 DNS 数据包的大小为 12(标头)+ 17(问题)+ x 乘以 16,其中 x 是
A
记录数。所以我们必须解决:
512 = 8 + 12 + 17 + 16x
对于x,它产生x=29
了左右。请记住,这是在最好的情况下(没有附加/授权记录,并且完全使用名称压缩)和特定名称(但如果使用压缩,则名称仅在有问题的情况下完整出现一次,因此只有大小发生变化)。【另外,对了,别被上世纪遗留的互联网所困;现在 IPv6 应该是标准;
AAAA
当然,与 IPv4 相比,您在固定大小的 DNS 数据包中放置的记录类型更少:-)]我不这么认为,如果它存在,bind 将如何选择返回哪个 IP?如果您在这里,您可以在区域文件中仅列出一个 IP。或者如果你真的很喜欢这个想法(但你一直在这不会阻止其他问题,因为客户端是越野车,所以你无论如何都试图与无限的山丘作斗争),你可以尝试
dnsdist
这是一种瑞士军刀,并允许微调。PS:还要记住,DNS 有一个扩展,允许一方指定它可以接收的 (UDP) 缓冲区大小。请参阅 RFC 6891。最近
dig
使用1232
的默认设置。您可能有兴趣查看https://kb.isc.org/docs/aa-01219或https://dnsflagday.net/2020/上的 2020 年 DNS 标志日,这正是关于此的。