Почтовые сервера postfix стали нагружать сеть. Исследование логов Firewall показало большое количество запросов к DNS серверу по 53 порту. Нельзя сказать, чтобы потом DNS трафика был каким-то весьма значительным, однако, у меня возник вопрос: А как же nscd?
Nscd — демон, который предоставляет кэш для наиболее общих запросов службы имен. По умолчанию, поведение демона кэша определяет файл с настройками /etc/nscd.conf.
По идее DNS запросы должны кэшироваться, нужно разобраться. ОС Ubuntu.
Для начала проверим, что служба nscd на почтовых серверах установлена, с этим всё оказалось в порядке. Проверим настройки кэширования для hosts:
grep hosts /etc/nscd.conf
grep hosts /etc/nsswitch.conf
Кеширование hosts включено. Посмотрим статистику hosts:
nscd -g | grep 'Кэш hosts' -A 22
# or
nscd -g | grep 'hosts cache' -A 22
И видим, что:
0% cache hit rate 0% частота попадания на кэш
Как видим, кэш как-то плохо работает. Не работает, если быть честным. Но какие-то попадания на положительные записи есть. Очевидно, что nscd работает, но почему статистика нулевая? Объяснение есть, это настройка в /etc/nscd.conf:
shared hosts yes
Данная настройка позволяет приложениям напрямую обращаться к кэшу, минуя демон nscd. Это ускоряет работу, но статистика перестаёт считаться. Отключим эту настройку:
shared hosts no
И перезапустим nscd:
service nscd restart
Вот теперь статистика будет собираться верно. Однако, через некоторое время оказалось, что частота попаданий в кэш так и осталась на нуле.
Кэшированные значения хранятся в двоичном файле в /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
Что-то закэшировано. Проверить работу кэша легко с помощью инструментов ping или tcpdump, кэш будет пополняться, статистика тоже работает. Вот и проверим, пингую свой сайт и смотрю, появится ли он в кэше.
ping internet-lab.ru
strings /var/cache/nscd/hosts | grep -P '[\w-]+\.\w+' | grep internet
Домен закэшировался.
nscd -g | grep 'Кэш hosts' -A 22
# or
nscd -g | grep 'hosts cache' -A 22
Попадания на положительные записи увеличились, nscd прекрасно работает.
Команды nslookup, dig или host, всегда запрашивают DNS серверы напрямую и не используют nscd. Возможно, postfix тоже напрямую обращается к DNS серверам минуя кэш? И да, оказалось, что postfix действительно по умолчанию напрямую обращается к DNS.
postconf | grep host_lookup
lmtp_host_lookup = dns smtp_host_lookup = dns
- 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
nscd -g | grep 'Кэш hosts' -A 22
# or
nscd -g | grep 'hosts cache' -A 22
99% мне больше нравится. Теперь postfix использует nscd, при этом 99% запросов не отправляются на DNS сервера.
Не забываем вернуть на место:
shared hosts yes
Примечание, для удаления статистики кэша:
rm /var/cache/nscd/hosts service nscd restart
P.S.
Всё равно мне не нравится как кэш работает, не вижу домены получателей. Нужно углубляться в проблему.