2016-11-09 43 views
1

我正在使用libresolv来执行对DNS服务器的请求。如何使res_query工作与DNS缓存?

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

当我使用时,例如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缓存,并挖呢。

+0

@Alnitak是啊所以我应该问管理员关于libresolv的工作方式? Stackoverflow变得非常荒谬的地方提问。 – Yaroslav

+0

我可能误读了这个问题(很难说现在,我有9个小时的时差,只有3个小时的睡眠),但根据书面记载,我无法确切地告诉你在问什么。试着看一下tcpdump,看看libresolv发送的内容与dig发送的内容之间的区别(如果有的话)。也许还会显示一些代码来显示您正在使用libresolv的_how_。 – Alnitak

+0

@Alnitak我已经在我的问题中提出了一些代码。 Tnx的建议与tcpdump。我已经试过了。看起来像res_nquery仍然发送数据包来检查DNS,而挖掘什么都不发送,只是检查DNS缓存。 似乎res_nquery只能用dns的strait请求 – Yaroslav

回答

1

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

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

​​