【问题标题】:How to make res_query work with dns caching?如何使 res_query 与 dns 缓存一起使用?
【发布时间】:2016-11-09 07:55:12
【问题描述】:

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

我也使用本地 dns 缓存。 (dnsmasq/未绑定)

当我使用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 会。

【问题讨论】:

  • @Alnitak 是的,所以我应该向管理员询问 libresolv 的工作原理? Stackoverflow 变成了非常可笑的提问场所。
  • 我可能误读了这个问题(现在很难说,我有 9 个小时的时差,只睡了 3 个小时)但正如所写的那样,我真的无法说出你在问什么。尝试查看 tcpdump 以查看 libresolv 发送的内容与 dig 发送的内容之间的差异(如果有)。也许还可以显示一些代码来显示如何您正在使用 libresolv。
  • @Alnitak 我在我的问题中添加了一些代码。 Tnx 获取有关 tcpdump 的建议。我已经试过了。似乎 res_nquery 仍然发送数据包来检查 dns,而 dig 什么也不发送,只是检查 dns 缓存。似乎 res_nquery 只能处理对 dns 的海峡请求
  • digres_nquery 都只会将查询发送到您的 resolv.conf 中的任何内容,即您的 dnsmasq 实例,并且默认情况下,两者还将设置 +RD 位以请求递归。然后 dnsmasq 将从缓存中提供答案,或者如果 TTL 已过期,则去获取,但据我所知 DNS 协议本身没有任何内容(因此在 res_nquery 设置中没有任何内容)客户端可以设置将影响该行为。
  • 附注也尝试发送 same 查询 - 您的 dig 示例请求 A 记录,但您的 res_nquery 请求 MX 记录 - 也许 dnsmasq 本身根据查询 RTYPE 表现不同?

标签: c++ c caching dns libresolv


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 2022-07-31
    • 2018-11-12
    • 1970-01-01
    • 2012-07-27
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多