2016-11-09 54 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設置中沒有任何內容)客戶端可以設置,這將影響該行爲

​​