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

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.

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

Теги

 

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

Postfix — ограничить поток исходящих писем

Почтовый сервер postfix ориентирован на максимальную производительность. Если у него есть письмо, то он постарается его как можно быстрее отправить. Но иногда требуется ограничить поток исходящих писем. При этом желательно, чтобы postfix продолжал принимать письма без ограничений, но отправлял их постепенно. Бывает, что провайдер ограничивает ваш сервер и разрешает отправлять, например, не более 300 писем в минуту. 

Теги

Автоматически чистить почтовый ящик из Ubuntu

Понадобилось мне как-то автоматически стирать все письма из почтового ящика. Ящик был на Exchange, автоматически там можно удалять письма, но только в папку "Удалённые", что не совсем то что нужно. Не найдя нормального функционала автоматической очистки папки плюнул и решил с соседнего сервера Ubuntu кроном удалять письма из ящика. Итак, на сервере Ubuntu ставим пакет fetchmail:

Теги