当我运行时,即使在随后dig example.com
的运行中,响应也会返回。SERVER: 192.168.0.1
这意味着 DIG 总是通过网络调用来解析 DNS 记录。
我(相当无知)假设我的操作系统将根据其 TTL 缓存 DNS 记录,并且 DIG 将使用该缓存。
DIG 是否默认忽略 TTL/不使用缓存?如果是这样,我怎样才能让 DIG 使用缓存并尊重 TTL?
背景/XY问题:
我想要一种方法来快速解析我正在编写的 nginx 脚本的 DNS TXT 记录。该脚本将根据这些 TXT 记录的内容路由请求,因此我想要使用哪种方法来尊重 TTL 并在适当的情况下使用本地缓存的记录。
dig
(域信息探索器)如手册所述,是一种用于询问 DNS 名称服务器的灵活工具,它不会查询或使用您的本地 DNS 缓存(和/或hosts
文件),而是直接查询您指向的名称服务器。默认情况下,这将是来自/etc/resolv.conf
.要从命令行使用系统 DNS 缓存,
getent hosts [ip-address | hostname]
或者在脚本/代码中使用man 3 gethostbyname
系统调用的本机版本。A
AAAA
诚然,这对您以外的任何其他事情或PTR
记录没有帮助。在
dig
输出中,SERVER 标签是名称服务器dig
使用的 IP 地址,它永远不会有 TTL...我在本地运行自己的缓存 DNS 服务器,而不是使用主要用于 spamassassin 的 ISP 或 Google 的公共解析器(8.8.8.8),它具有本地优势,但缓存不会被其他用户预先播种/填充.
这实际上是一个操作系统解析器问题,但您没有指定操作系统。既然
dig
提到了,我将假设我们在这里使用某种 UNIX 风格。基于 UNIX 的操作系统不在内核本身内实现 DNS 缓存。在我们了解它的实际实施方式之前,需要总结一些主题。
NSS
对解析器库的调用通常使用名称服务开关 (NSS) 来实现它们的查找,这是一个用于指定要使用的数据源和查找顺序的模块化系统。您可以在 中找到这些模块堆栈的列表
/etc/nsswitch.conf
。作为参考,我们在这里关注的是hosts
.除非您真的知道自己在做什么,否则不建议使用该
hosts
条目。/etc/nsswitch.conf
重新排序这些模块可能会导致在/etc/hosts
文件之前咨询 DNS 等时髦的东西!nscd
在咨询模块堆栈之前,NSS 检查是否存在正在运行的
nscd
套接字并尝试查询它。如果nscd
配置为维护相关 NSS 数据库的缓存,则可能nscd
会返回缓存的条目而无需咨询 NSS 模块。我知道的大多数 Linux 发行版默认不启用数据库缓存,必须自定义。hosts
/etc/nscd.conf
也就是说,应该注意的是,许多管理员认为“stock”
nscd
守护进程是不可靠的,至少在 Linux 下是这样。那里至少有一种替代实现。你的旅费可能会改变。把它们放在一起
了解上述内容后,hosts 数据库的查找顺序按以下顺序工作:
nscd
(如果正在运行,它的套接字存在,并且启用了主机缓存)/etc/nsswitch.conf
这将我们带到
dig
了这个等式的位置。您几乎可以参考 HBrujin 的整个答案(dig
不使用 NSS,仅通过 TCP/IP 进行对话),但问题是根本没有 NSS 缓存,除非 1)nscd
正在运行,并且 2)它被配置为缓存hosts
数据库。tl;博士
让 DNS 缓存在 NSS 中很好地发挥作用的复杂性通常是大多数管理员使用运行自己的递归 DNS 服务器的“更简单”的解决方案的原因。你不需要知道关于 NSS 的任何事情。只需指向
/etc/resolv.conf
您闪亮的新 DNS 缓存,让它向您隐藏 NSS 的邪恶。(至少在您需要了解 LDAP 集成的工作原理之前)