2016-11-09 5 views
1

libresolvを使用して、DNSサーバへの要求を実行しています。dnsキャッシュでres_queryを動作させるには?

また、私はローカル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を使用して、私はこれを取得:DNSサーバーからの応答がDNSに当たらないように

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 **.**.**.** 

だからそれが見えますキャッシュされ、キャッシュされません。

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が行うこととします。

+0

@Alnitakええと、私は管理者にlibresolvの仕組みについて尋ねるべきですか? Stackoverflowは非常にばかげた質問をする場所になった。 – Yaroslav

+0

私は質問を誤解している可能性があります(今は分かりませんが、私は暴動の9時間があり、睡眠は3時間しかありませんでした)が、書かれているとおり、あなたが何を求めているのかは分かりません。 tcpdumpを見て、libresolvが送信しているものと送信しているものとの違いを(もしあれば)調べてみてください。また、libresolvを使用している_how_を表示するコードを表示することもできます。 – Alnitak

+0

@Alnitak私は質問にいくつかのコードを入れました。 tcpdumpを使ってアドバイスしてください。私はすでにそれを試した。 res_nqueryのようなものはまだdnsをチェックするためのパケットを送信しますが、digは何も送信せず、dnsキャッシュをチェックします。 res_nqueryはDNSへのストレートリクエストでしか動作しないようです – Yaroslav

答えて

1

digとres_nquery()の両方は、あなたの/etc/resolv.confファイル(つまり、あなたのdnsmasqインスタンス)にあるものだけにクエリを送信します。どちらもデフォルトでRDビットを再帰を要求するように設定します。

dnsmasqは、キャッシュからの応答を提供するか、TTLが期限切れになった場合に取得します。しかし、私の知る限り、DNSプロトコル自体には何もないので(res_nqueryの設定には何もありません)、クライアントはその動作に影響を与えることができます。

関連する問題