Перейти к основному содержанию

Postfix и кэширование nscd

Linux

Почтовые сервера postfix стали нагружать сеть. Исследование логов Firewall показало большое количество запросов к DNS серверу по 53 порту. Нельзя сказать, чтобы потом DNS трафика был каким-то весьма значительным, однако, у меня возник вопрос: А как же nscd?

Nscd — демон, который предоставляет кэш для наиболее общих запросов службы имен. По умолчанию, поведение демона кэша определяет файл с настройками /etc/nscd.conf.

По идее DNS запросы должны кэшироваться, нужно разобраться. ОС Ubuntu.

Для начала проверим, что служба nscd на почтовых серверах установлена, с этим всё оказалось в порядке. Проверим настройки кэширования для hosts:

grep hosts /etc/nscd.conf
grep hosts /etc/nsswitch.conf

postfix

Кеширование hosts включено. Посмотрим статистику hosts:

nscd -g | grep 'Кэш hosts' -A 22
# or
nscd -g | grep 'hosts cache' -A 22

postfix

И видим, что:

0% cache hit rate
0% частота попадания на кэш

Как видим, кэш как-то плохо работает. Не работает, если быть честным. Но какие-то попадания на положительные записи есть. Очевидно, что nscd работает, но почему статистика нулевая? Объяснение есть, это настройка в /etc/nscd.conf:

shared hosts yes

Данная настройка позволяет приложениям напрямую обращаться к кэшу, минуя демон nscd. Это ускоряет работу, но статистика перестаёт считаться. Отключим эту настройку:

shared hosts no

postfix

nscd

И перезапустим nscd:

service nscd restart

postfix

Вот теперь статистика будет собираться верно. Однако, через некоторое время оказалось, что частота попаданий в кэш так и осталась на нуле.

Кэшированные значения хранятся в двоичном файле в /var/cache/nscd/hosts:

strings /var/cache/nscd/hosts | grep -P '[\w-]+\.\w+' | sort -u
# или
​
strings /var/db/nscd/hosts | grep -P '[\w-]+\.\w+' | sort -u

postfix

Что-то закэшировано. Проверить работу кэша легко с помощью инструментов ping или tcpdump, кэш будет пополняться, статистика тоже работает. Вот и проверим, пингую свой сайт и смотрю, появится ли он в кэше.

ping internet-lab.ru
strings /var/cache/nscd/hosts | grep -P '[\w-]+\.\w+' | grep internet

nscd

Домен закэшировался.

nscd -g | grep 'Кэш hosts' -A 22
# or
nscd -g | grep 'hosts cache' -A 22

nscd

Попадания на положительные записи увеличились, nscd прекрасно работает.

Команды nslookup, dig или host, всегда запрашивают DNS серверы напрямую и не используют nscd. Возможно, postfix тоже напрямую обращается к DNS серверам минуя кэш? И да, оказалось, что postfix действительно по умолчанию напрямую обращается к DNS.

postconf | grep host_lookup
lmtp_host_lookup = dns
smtp_host_lookup = dns

postfix

  • dns — хост ищется в DNS (записи /etc/hosts тоже игнорируются)
  • native — используется нативный механизм (nsswitch.conf или эквивалент)
  • dns, native — хост ищется в DNS, если не найден, то используется нативный механизм

Меняем настройки на native, и перезагружаем postfix:

postconf lmtp_host_lookup=native
postconf smtp_host_lookup=native
service postfix restart

postfix

nscd -g | grep 'Кэш hosts' -A 22
# or
nscd -g | grep 'hosts cache' -A 22

postfix

99% мне больше нравится. Теперь postfix использует nscd, при этом 99% запросов не отправляются на DNS сервера.

Не забываем вернуть на место:

shared hosts yes

Примечание, для удаления статистики кэша:

rm /var/cache/nscd/hosts
service nscd restart

P.S.

Всё равно мне не нравится как кэш работает, не вижу домены получателей. Нужно углубляться в проблему.

Теги

 

Похожие материалы