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