如何让 res_query 使用 dns 缓存?

How to make res_query work with dns caching?

我正在使用 libresolv 执行对 DNS 服务器的请求。

我也使用本地 dns 缓存。 (dnsmasq/unbound)

当我使用 dig 时,例如 dig google.com,请求被缓存,下一个请求使用缓存值。

我们可以在 dnsmasq 日志中看到:

Nov  9 10:46:46 y dnsmasq[24003]: query[A] google.com from 127.0.0.1
Nov  9 10:46:46 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:46:46 y dnsmasq[24003]: reply google.com is 173.194.32.165
Nov  9 10:46:46 y dnsmasq[24003]: reply google.com is 173.194.32.160
Nov  9 10:46:49 y dnsmasq[24003]: query[A] google.com from 127.0.0.1
Nov  9 10:46:49 y dnsmasq[24003]: cached google.com is 173.194.32.165
Nov  9 10:46:49 y dnsmasq[24003]: cached google.com is 173.194.32.168

然后我使用 res_query 我得到这个:

Nov  9 10:50:29 y dnsmasq[24003]: query[MX] google.com from 127.0.0.1
Nov  9 10:50:29 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:50:29 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:51:13 y dnsmasq[24003]: query[MX] google.com from 127.0.0.1
Nov  9 10:51:13 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:51:13 y dnsmasq[24003]: forwarded google.com to **.**.**.**

看来 dns 服务器的响应没有命中 dns 缓存,也没有被缓存。

有什么方法可以缓存来自 res_query 的请求吗?

这就是我向 DNS 解析器发出请求的方式:

 struct __res_state dnsstate;
 int rc = res_ninit(&dnsstate);
 if (rc < 0) {
     return result;
 }
 dnsstate.retrans = timeout;

 int len = res_nquery(&dnsstate, domain.c_str(), ns_c_in, ns_t_mx, nsbuf, sizeof(nsbuf));

我想 res_nquery 不会检查本地 DNS 缓存,而 dig 会。

dig 和 res_nquery() 都会将查询发送到您的 /etc/resolv.conf 文件中的任何内容,即您的 dnsmasq 实例。两者还将默认设置 RD 位以请求递归。

dnsmasq 然后将从缓存中提供答案,或者如果 TTL 已过期则去获取它们。然而,据我所知,客户端可以设置的 DNS 协议本身(因此 res_nquery 设置中也没有任何内容)会影响该行为