Фильтрация спама средствами Postfix

 Настройка postfix для фильтрации спама на отдельный адрес на сервере.

Идея - мне на сервер приходит спам, причем большинство русскоязычного спама, чего не скажешь об англоязычном, имеет адрес получателя ( не путать с получателем конверта - envelop recipient ), не совпадающий с адресом на этом мейл сервере. Настроил фильтрацию такого спама в почтовой программе пользователя. Ниже конфигурация для postfix, выполняющая эту же функцию.
Почта проверяется на соответствие получателя сообщения существующим получателям на сервере. Учитывая возможное большое количество почтовых аккаунтов проверка производится на соответствие имени домена в адресе получателя с обслуживаемыми сервером доменами. В случае несоответствия сообщение перенаправляется в специально созданный почтовый аккаунт чтобы в дальнейшем можно было посмотреть почту и восстановить сообщение в случае ложного срабатывания или удалить если это действительно спам. Например, настроить удаление сообщений по крону в случае если они старше 30 дней, т.е. если за 30 дней никто не пожаловался или не было предпринято никаких действий. Можно делать удаление сообщения ( REJECT или DISCARD ) или помещать в отложенные сообщения ( HOLD ), но если окажется что по ошибке будет удалено не спам сообщение, то почтовая система не справится со своей главной задачей, поэтому в случае относительно небольшого почтового трафика делаю так.

Для осуществления создаем header.to.check следующего содержания или аналогичного

if !/^To:.*(from\slocal|@mydomain1\.com|@mydomain2\.com|@mydomain3\.com|@mydomain4\.com|@mydomain5\.com)($|>$| >$|>,$| >,$|[^a-zA-Z0-9_].*)/
/^To:.*/ REDIRECT spam@mydomain.com
endif

Где конструкция
if !/pattern/
/.../
endif

вызывает совпадение входной строки с шаблоном между if и endif тогда и только тогда, когда та же самая входная строка не совпадает с pattern
В нашем случае проверяем строку, содержащую To: и не содержащую имена обслуживаемых доменов или указание на использование local (pattern не должен содержать пробелы)

см http://www.postfix.org/regexp_table.5.html
http://www.opennet.ru/base/dev/pcre_perl_intro.txt.html

Для проверки шаблона создается тестовый файл test.header.messages, содержащий тестовые строки, и проверка осуществляется командой
postmap -q - pcre:/path_to/header.to.check < /path_to/test.header.messages с той разницей что вместо
REDIRECT spam@mydomain.com
делаем запись
WARN The messages send to another domains
что дает при совпадении запись в лог файл для тестирования.

Далее, если поместить инструкцию header_checks = pcre:/usr/local/etc/postfix/header.to.check в main.cf , то процесс cleanup будет проверять header у всей почты, как входящей, так и исходящей, а нам нужно только у входящей, поэтому изменяем в master.cf

см. http://comments.gmane.org/gmane.mail.postfix.user/229632

http://mail.python.org/pipermail/mailman-users/2012-December/074453.html

http://linuxforum.ru/viewtopic.php?id=24436

smtp inet n - n - - smtpd
 -o cleanup_service_name=cleanup_in
cleanup_in unix n - n - 0 cleanup
 -o header_checks=pcre:/usr/local/etc/postfix/header.to.check
666 inet n - n - - smtpd  # порт 666 взят для примера, вся почта, приходящая через этот порт не подвергается проверке на соответствие, используется клиентами, имеющими почтовые аккаунты на сервере.

По окончании следим за лог файлом и за почтой в ящике spam@mydomain.com на соответсвие этой проверке для устранения ошибок.

Такой вариант фильтрации для входящей почты работоспособен, но мне лично не нравится. Буду эксперементировать дальше.

Отправить комментарий

CAPTCHA
Чтобы убедиться в том что Вы не робот, ответьте, пожалуйста, на вопрос
Fill in the blank