Кеширование отрицательных ответов резолвера в nscd
В FreeBSD имеется хорошая программа, позволяющая прозрачно кешировать результаты
работы штатного резолвера - "name service caching daemon" aka (8) nscd.
На мой взгляд, это более простое и легковесное решение, нежели использование
named или unbound для этой цели.
К сожалению, в этой программе существует ошибка, из-за которой единожды от
резолвера отрицательный ответ кешируется "навсегда" (независимо от того, что
указано в конфигурационном файле.
По этому поводу в 2013 году был изготовлен патч и создан соотвествуюший PR.
Но, увы, PR так и не обработан, а жить как-то надо. Поэтому по сей день
приходится носить патч за собой и накладывать его руками.
Сам патч прост и многократно проверен на ряде систем:
--- usr.sbin/nscd/query.c.orig 2013-08-22 11:59:03.921956888 +0400
+++ usr.sbin/nscd/query.c 2013-08-22 12:00:01.515957178 +0400
@@ -743,9 +743,14 @@
&read_response->data_size);
if (read_response->error_code == -2) {
- read_response->error_code = 0;
- read_response->data = NULL;
- read_response->data_size = 0;
+ read_response->data = malloc(
+ read_response->data_size);
+ assert(read_response != NULL);
+ read_response->error_code = cache_read(neg_c_entry,
+ read_request->cache_key,
+ read_request->cache_key_size,
+ read_response->data,
+ &read_response->data_size);
}
}
configuration_unlock_entry(qstate->config_entry, CELT_NEGATIVE);
Применение тривиально:
cd /usr/src
patch < patch-nscd-negttl
cd usr.sbin/nscd
make && make install