是否可以规定已解析条目的 TTL?换句话说,是否可以覆盖已解析条目的接收 TTL 并使其更高?
原因:我发现 dnsmasq 尝试解析 www.google.com 的频率太高,不符合我的口味。
答案1
我认为你做不到,这不容易。TTL 由 Google 的名称服务器设置,出于负载平衡的目的,他们喜欢将其设置为低。
增加缓存大小可能会有帮助,但对于像 Google 这样的超短 TTL 来说可能无济于事。
非正式地,有几个补丁可以提供 TTL 覆盖功能。我在dnsmasq-讨论邮件列表,因此,如果您想自己动手,请尝试一下(您可以检查邮件列表档案以获取针对较新版本的补丁):
- 补丁v2.22,增加“min-ttl”选项(这是您所描述的,尽管它可能并不完全适用于当前版本)
- 补丁v2.41,增加“pos-ttl”选项(不能确定这是否会产生同样的作用)
答案2
实际上,您可以通过利用 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 错误)。希望这能对某些人有所帮助,即使它仅用于调试或作为临时解决方案。如果这对您的情况有用或没用,请随时发表评论。尽情享受吧!:)