Методы борьбы со спамом:
1. RBL (DNSBL)
Многие сталкивались со спам-базами типа sorbs, spamhaus и пр. В них содержатся IP-адреса спамеров, открытых релеев, динамических адресов. К сожалению ни одна из них существенно не уменьшит спам, а вот разбираться с жалобами на недошедшие письма будете часто. Кто хочет проверить, добавьте несколько команд reject_rbl_client с популярными базами (можно найти здесь http://dnsbl.info ). Можно использовать блок-листы в каком-либо контент-фильтре который, обращаясь к нескольким базам, будет учитывать наличие отправителей в списках.
2. проверки на основе DNS
Хороший результат даёт проверка существования и соответствия IP-адреса, имени хоста, PTR-записи.Так как RFC 1912 требует однозначного соответсветсвия А и PTR записей, то рекомендую использовать команду reject_unknown_client_hostname. Она делает проверку АДРЕС -> ИМЯ ->АДРЕС. На практике, администраторов почтовых серверов не способных рабораться с настройкой DNS, встречается мало. Если в вашем случае это не так, то используйте менее строгую проверку reject_unknown_reverse_client_hostname, которая проверит лишь наличие PTR-записи.
3. грейлистинг
На многих почтовых серверах используется этот метод ограничения спама. Временная задержка письма, от неизвестного отправителя, позволяет снизить объём входящего спама до приемлемого минимума. К сожалению данный способ подходит не всем. Если список, пишуших вам адресатов постоянно меняется, то постоянные задержки будут сильно раздражать. Если вы решили использовать грейлистинг, необходимо помнить о возможной ситуации, когда встречный сервер перед тем, как принять письмо от вас, захочет проверить существование вашего электроящика. Для этого он установит обратное соединение и в ходе SMTP-диалога получит ответ о существовании вашего ящика, дефолтный адрес Postfix для этого double-bounce@server_hostname. Чтобы решить проблему, необходимо использовать белые списки или не отдавать код 4ХХ до команды DATA.
4. запрет приема с динамических адресов
Все приличные, крупные операторы для своих динамических пулов адресов закрывают 25-й порт, и это правильно. Если принимать письма переданные с динамических адресов спама будет всегда больше чем достаточно. Регулярным выражением можно отфильтровать большую часть спама:
(ppp|(a|v|s|h|r|sh)dsl|dial[(in|up|er)]|wimax|gprs|cdma|wifi|broadband|cable|dhcp|dslam|dynamic|pool-|vpn|[ck]lient).*..*
5. контентные фильтры
Все знают о фильтрах на основе теоремы Байеса. С Postfix работают все открытые и коммерческие реализации данного алгоритма. Разница между ними только в том, что коммерческий фильтр обучать не надо. Для нагруженных серверов рекомендую использовать альтернативные реализации SpamAssassin типа DSPAM, RSPAMD переписанные на С.
6. запрет приема "чужих" отчетов о недоставке
Полученный NDR (Non-Delivery Report) от сервера письмо которому вы не посылали можно смело отправлять в /dev/null. Но как? По RFC мы обязаны принимать такие отчеты, чтобы сообщить пользователю о неудачной доставке его письма. Автор Postfix предлагает бороться с этим регулярными выражениями: http://www.postfix.org/BACKSCATTER_README.html
Но perl это зло для нагруженных серверов, как и в случае со SpamAssassin нагрузка может оказаться слишком большой. Из стороннего софта позволяющего отсечь такой спам это milter-null http://www.snertsoft.com/sendmail/milter-null/
7. ограничение потока писем от одного источника
Тут все очень просто, исходя из статистики вашего сервера ставим разумные ограничения. Это не даст какому-нибудь червяку завалить сервер и попасть во все блок листы. Команды Postfix регулирующие скорость:
anvil_rate_time_unit = 30m
anvil_status_update_time=60s
smtpd_client_connection_count_limit = 15
smtpd_client_connection_rate_limit = 50
smtpd_client_message_rate_limit = 50
in_flow_delay = 1s
Цифры в данном примере будут индивидуальны для каждого сервера.
8. замедление "плохих" клиентов
Если почтовый клиент в SMTP-диалоге делает ошибки, то это уже подозрительно. Почту принимаем для дальнейшего анализа, но с задержкой. Если шибок в командах слишком много, то обрываем соединение.
smtpd_error_sleep_time = 5ssmtpd_soft_error_limit = 1smtpd_hard_error_limit = 5
9. проверка существования доменов и почтовых адресов
Для проверки существования доменов отправителей и получателей добавляем команды reject_unknown_sender_domain, reject_unknown_recipient_domain. По моей статистике проверки не очень эффективные, наверно можно их и не использовать. Проверка адресов отсеивает гораздо больше спама, но проверять все адреса не стоит. Обязательно столкнетесь со случаем, когда не дойдёт важное информационное письмо от робота которому отвечать не надо. Почему то некоторые администраторы думают, что подставлять несуществующий адрес отправителя для сгенерированных автоматически писем это нормально. Чтобы этого избежать, делаем выборочную проверку ящиков почтовых служб типа aol, yahoo, yandex, gmail ...
check_sender_access hash:$config_directory/sender_access.hash
check_recipient_access hash:$config_directory/recipient_access.hash
Файлы sender_access.hash и recipient_access.hash содержат список проверяемых доменов.
10. отклонение писем не соответствующих RFC
То что может Postfix:
strict_rfc821_envelopes = yes
Сторонний софт типа milter-limit проверяет побольше:
# Strict RFC 2821 domain name length limit.
-rfc2821-domain-length
# Treat plus-sign as itself; not a sendmail plussed address.
-rfc2821-literal-plus
# Strict RFC 2821 local-part length limit.
-rfc2821-local-length
# Strict RFC 2821 grammar for mail addresses.
-rfc2821-syntax
# Reject RFC 2606 reserved domains.
-reject-rfc2606