2016-11-09 2 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-сервера не попал СНД кеш и не кэшируется.

Есть ли способ кэшировать запрос от 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

@ Алнитак, да, я должен спросить администраторов о том, как работает libresolv? Stackoverflow стал очень нелепым местом, чтобы задавать вопросы. – Yaroslav

+0

Возможно, я неправильно понял вопрос (трудно сказать, у меня есть 9 часов реактивного самолета и только 3 часа сна), но, как написано, я не могу сказать, что вы просите. Попробуйте посмотреть на tcpdump, чтобы увидеть разницу (если таковая имеется) между тем, что передает libresolv, чем то, что копает. Возможно, также покажите некоторый код, чтобы показать _how_, что вы используете libresolv. – Alnitak

+0

@Alnitak Я поставил код в свой вопрос. Tnx за советом с tcpdump. Я уже пробовал. Кажется, что res_nquery по-прежнему отправляет пакеты для проверки dns, а dig ничего не посылает, просто проверяет кеш DNS. Кажется, что res_nquery может работать только с проливными запросами на dns – Yaroslav

ответ

1

Оба dig и res_nquery() просто отправят запросы на все, что находится в вашем файле /etc/resolv.conf, то есть на ваш экземпляр dnsmasq. Оба по умолчанию также устанавливают бит RD для запроса рекурсии.

dnsmasq будет либо отвечать на запросы из кеша, либо использовать их, если срок действия TTL истек. Однако, насколько мне известно, в самом DNS-протоколе нет ничего (и, следовательно, ничего в настройках res_nquery), который может установить клиент, который повлияет на это поведение.

 Смежные вопросы

  • Нет связанных вопросов^_^