Postgrey – это policy демон для postfix, который реализует технологию серых списков (greylist). На сегодняшний день практически весь спам рассылается из так называемых бот-нетов. Ботнет представляет собой набор компьютеров, зараженных вирусами (так называемые компьютеры-”зомби“), которые позволяют хозяину вируса управлять зараженным хостом, в том числе использовать его для рассылки спама. Грейлистинг призван помочь отличить зомби от честного сервера. Алгоритм работы грейлистинга основан на том факте, что зомби в по ряду причин не умеют хранить очередь почтовых сообщений, в связи с чем поведение зомби отличается от поведения честного почтового сервера с очередью сообщений. Что случится если сервер попытается передать почтовое сообщение, но во время передачи сервер получателя вернет ему временную ошибку (код SMTP ошибки: 4хх)? Правильно. Сервер отложит это письмо в очередь и через некоторое время снова попытается отправить сообщение. Зомби же не будет предпринимать попыток повторной отправки, поскольку не умеет обрабатывать очередь сообщений.

Принцип работы грейлиста следующий. Грейлист в момент приема сообщения “запоминает” так называемый триплет – набор из трех характеристик сообщения:
– Адрес отправителя сообщения
- Адрес получателя сообщения
- IP-адрес хоста, который передает сообщение

Затем хосту-отправителю возвращается временная ошибка. Через некоторое время хост-отправитель предпринимает вторую попытку передать сообщение, грейлист проверяет наличие триплета в базе, находит его, разрешает сообщение к приему. Зомби повторных попыток не предпринимают, сообщения остаются не принятыми.

Единственный минус грейлиста в том, что честные сообщения задерживаются на какое-то время (обычно 15-30 минут), но радует хотя бы тот факт, что задерживается только по одному письму (первому) от каждого отправителя. Если от некоего отправителя сообщение успешно прошло грейлист, то все последующие сообщения от этого отправителя будут приниматься с первого раза и без задержек.

Ну а теперь попробуем разобраться с установкой postgrey. Она, к счастью, предельно простая:

# cd /usr/ports/mail/postgrey/
# make install clean

Теперь займемся настройкой postgrey. Нам нужно указать postfix’у каким образом общаться с postgrey. По умолчанию postgrey будет слушать на порту 10023. Открываем /usr/local/etc/postfix/main.cf, внимательно изучаем опцию “smtpd_recipient_restrictions” и в конце всех проверок добавляем наш грейлист (check_policy_service inet:127.0.0.1:10023). В итоге это будет выглядеть примерно так:

smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_pipelining,
reject_invalid_hostname,
check_policy_service inet:127.0.0.1:10023

В файле /etc/rc.conf разрешаем запуск postgrey:

postgrey_enable="YES"

Запускаем postgrey, рестартим postfix:

# /usr/local/etc/rc.d/postgrey start
# postfix reload

Всё. Мы имеем полностью настроенный и работающий грейлист.

Стоит отметить, что иногда администратору может потребоваться определить список исключений, чтобы определенные сообщения не грейлистились вообще никогда. Для этого в postgrey есть белые списки. Определяются списки в файлах:
- postgrey_whitelist_clients – список хостов отправителей (не грейлистить сообщения от указанных хостов)
- postgrey_whitelist_recipients – список ящиков локальных получателей (не грейлистить сообщения для указанных получателей)