Я использую 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-сервера не попал СНД кеш и не кэшируется.
Есть ли способ кэшировать запрос от 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, и роют делает.
@ Алнитак, да, я должен спросить администраторов о том, как работает libresolv? Stackoverflow стал очень нелепым местом, чтобы задавать вопросы. – Yaroslav
Возможно, я неправильно понял вопрос (трудно сказать, у меня есть 9 часов реактивного самолета и только 3 часа сна), но, как написано, я не могу сказать, что вы просите. Попробуйте посмотреть на tcpdump, чтобы увидеть разницу (если таковая имеется) между тем, что передает libresolv, чем то, что копает. Возможно, также покажите некоторый код, чтобы показать _how_, что вы используете libresolv. – Alnitak
@Alnitak Я поставил код в свой вопрос. Tnx за советом с tcpdump. Я уже пробовал. Кажется, что res_nquery по-прежнему отправляет пакеты для проверки dns, а dig ничего не посылает, просто проверяет кеш DNS. Кажется, что res_nquery может работать только с проливными запросами на dns – Yaroslav