如何让 DIG 尊重 TTL/使用本地操作系统缓存?

如何让 DIG 尊重 TTL/使用本地操作系统缓存?

当我运行时,dig example.com响应返回SERVER: 192.168.0.1,即使在后续运行中也是如此。这意味着 DIG 始终在进行网络调用以解析 DNS 记录。

我(相当无知地)假设我的操作系统将根据其 TTL 缓存 DNS 记录,并且 DIG 将使用该缓存。

DIG 是否默认忽略 TTL/不使用缓存?如果是,我该如何让 DIG 使用缓存并遵守 TTL?

背景/XY问题:

我想要一种方法迅速地解析我正在编写的 nginx 脚本的 DNS TXT 记录。该脚本将根据这些 TXT 记录的内容路由请求,因此我希望无论使用哪种方法都能遵守 TTL 并在适当的情况下使用本地缓存的记录。

答案1

dig (域信息搜索器)正如手册所解释的那样,是一个灵活的工具用于询问 DNS 名称服务器,它不会查询或使用您的本地 DNS 缓存(和/或hosts文件),而是直接查询您指向的名称服务器。默认情况下,该名称服务器是来自 的名称服务器/etc/resolv.conf

要从命令行使用系统 DNS 缓存,请使用getent hosts [ip-address | hostname]或在脚本/代码中使用系统调用的本机版本man 3 gethostbyname

A AAAA不可否认,这对您除记录之外的任何其他事情都没有任何帮助PTR


dig输出中,SERVER 标签是名称的 ip 地址服务器 dig用途,永远不会有 TTL......

dig ANY www.google.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27695
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;www.google.com.                IN      A

;; ANSWER SECTION:
www.google.com.     173     IN      A       216.58.212.132


;; AUTHORITY SECTION:
google.com.         146915  IN      NS      ns2.google.com.
google.com.         146915  IN      NS      ns3.google.com.
google.com.         146915  IN      NS      ns1.google.com.
google.com.         146915  IN      NS      ns4.google.com.

;; ADDITIONAL SECTION:
ns2.google.com.     145115  IN      A       216.239.34.10
ns1.google.com.     145115  IN      A       216.239.32.10
ns3.google.com.     145115  IN      A       216.239.36.10
ns4.google.com.     145115  IN      A       216.239.38.10

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)    <========== My Name SERVER is localhost
;; WHEN: Tue Aug 30 22:51:26 2016
;; MSG SIZE  rcvd: 184

我在本地运行自己的缓存 DNS 服务器,而不是使用 ISP 或 Google 的公共解析器 (8.8.8.8)(主要用于 spamassassin),它具有本地化的优势,但缓存也不会被其他用户预先播种/填充。

答案2

这实际上是一个操作系统解析器问题,但您没有指定操作系统。既然dig提到了,我将假设我们在这里使用的是某种 UNIX。

基于 UNIX 的操作系统并未在内核本身内实现 DNS 缓存。在讨论其实际实现方式之前,需要总结几个主题。

国家安全战略

对解析器库的调用通常使用名称服务开关 (NSS) 来实现查找,NSS 是一个模块化系统,用于指定要使用的数据源及其查找顺序。您可以在 中找到这些模块堆栈的列表/etc/nsswitch.conf。作为参考,我们在这里关注的是hosts

除非您真的知道自己在做什么,否则不建议您玩弄hosts条目。重新排序这些模块可能会导致一些奇怪的事情,例如在文件之前咨询 DNS!/etc/nsswitch.conf/etc/hosts

神经胶质细胞

在查询模块堆栈之前,NSS 会检查是否存在正在运行的nscd套接字并尝试查询它。如果nscd配置为维护相关 NSS 数据库的缓存,则可能会返回缓存的条目nscd而无需查询 NSS 模块。据我所知,大多数 Linux 发行版不要默认启用数据库缓存hosts/etc/nscd.conf必须自定义。

尽管如此,应该注意的是,许多管理员认为“库存”nscd守护进程不可靠,至少在 Linux 下是这样。至少有一个替代实现。您的情况可能会有所不同。

综合起来

了解上述情况后,主机数据库的查找顺序如下:

  • nscd(如果正在运行,则其套接字存在,并且主机缓存已启用)
  • NSS 模块,按以下顺序列出/etc/nsswitch.conf
  • 如果在 NSS 模块中找不到,则它不存在。

这让我们知道了dig该方程式的落点。您几乎可以参考 HBrujin 的整个答案(不使用 NSS,仅通过 TCP/IP 进行通信),但问题是,除非 1)正在运行,并且 2) 它配置为缓存数据库dig,否则根本没有 NSS 缓存。nscdhosts

总结

让 DNS 缓存在 NSS 中良好运行的复杂性通常是大多数管理员选择运行自己的递归 DNS 服务器的“更简单”解决方案的原因。您不需要对 NSS 有任何了解。只需指向/etc/resolv.conf您崭新的 DNS 缓存,让它隐藏 NSS 的弊端即可。(至少在您需要了解 LDAP 集成的工作原理之前)

相关内容