dnsmasq:如何增加 TTL?

dnsmasq:如何增加 TTL?

有没有办法覆盖并增加从上游 DNS 服务器接收的 TTL?

dnsmasq 中是否有这个配置参数?

答案1

根据您对 Gareth 的评论(这确实应该纳入您的问题中),我会说导致您出现问题的最可能原因是:

  1. 你实际上并没有使用你认为的缓存,或者
  2. 您所访问网站的 TTL 设置得相当低,通常是有原因的,而且您对此没有合理的办法(除非找出频繁 DNS 查找失败的根本原因并自行修复(例如,如果原因是本地 Internet 连接拥塞)或请求负责的实体修复它们(例如,如果问题在于该区域被委托给不稳定的权威 DNS 服务器))

答案2

Dnsmasq 有一个--min-cache-ttl=[seconds]参数,其中seconds≤3600(1小时)。

答案3

实际上,您可以通过利用 dnsmasq C 源代码中的整数溢出错误来绕过 3600 秒的 --min-cache-ttl 检查,而无需重新编译。以下是一个有效的值:

通过 CLI:--min-cache-ttl=6442450943

通过 dnsmasq.conf:min-cache-ttl=6442450943

为什么这样做有效?因为 dnsmasq C 代码指定了一个有符号整数值常量,即 3600 秒,并将其与用户指定的覆盖值进行比较和检查。如果该值大于 3600,则将忽略用户输入,而改用常数 3600。此覆盖值也是一个有符号整数,但在代码中几行之后,在初始化守护进程时,输入的 ttl 值被转换为无符号长整数。

乍一看,您可能想知道我们为什么不直接在输入或配置文件中将值设置为 -20 亿。好吧,有一个初始 dnsmasq 输入检查,它将提前中止并终止。但是,如果我们将整数包装在 +40 亿上,我们将从零开始。再添加 +20 亿 + 1,我们就可以包装回有效负数,同时仍然绕过初始检查。

那么,为什么这样做有效呢?因为有符号整数的范围大约从 -20 亿到 +20 亿,而无符号整数的范围从 0 到 +40 亿。我们需要让值在输入解析后被 dnsmasq 检查解释为负值,从而绕过大约 +20 亿的标记。实际上,ttl > 3600 的检查将通过,因为该值被解释为负值 -20 亿。-20 亿肯定小于 3600。但是当代码的第二部分转换 -20 亿时,它最终会将我们的输入 ttl 转换为大约 2^31 + 1(无符号)的等价值,而不是 -2^31 + 1(有符号)。

当然,您只能通过这种方式指定非常大的 ttl 值,而且这可能对任何人都没有用,因为这样的 ttl 值根本不合理。但这是一个很好的技巧(dnsmasq 错误)。希望这能对某些人有所帮助,即使它仅用于调试或作为临时解决方案。如果这对您的情况有用或没用,请随时发表评论。尽情享受吧!:)

答案4

你是指来自上游服务器的负面响应的 TTL 吗?这是由 --neg-ttl 参数控制的:

--neg-ttl= 来自上游服务器的否定回复通常包含 SOA 记录中的生存时间信息,dnsmasq 会使用该信息进行缓存。如果来自上游服务器的回复省略了此信息,dnsmasq 不会缓存该回复。此选项为生存时间(以秒为单位)提供了一个默认值,dnsmasq 即使在没有 SOA 记录的情况下也会使用该默认值来缓存否定回复。

相关内容