Как блокировать спам до попадания на сервер — Postfix
Версия 1.0
Автор: Falko Timme
Введение
За последние недели наблюдается резкий рост объёма спама. По оценкам, спам занимает около 80–90% всей почты, и многие почтовые серверы испытывают повышенную нагрузку. Фильтры уровня контента (например, SpamAssassin) перестали распознавать часть рассылок так же эффективно, как раньше. Хорошая новость: большую долю спама можно отсекать ещё на уровне MTA (Postfix), используя чёрные списки, проверки доменов отправителя/получателя и другие механизмы. Это уменьшит количество писем, попадающих на ресурсоёмкие анализаторы.
Важно: после применения изменений проверьте почтовые логи и убедитесь, что легитимные сообщения не блокируются.
Внимание: инструкции относятся к Postfix 1.x и 2.x. Перед внесением правок сделайте резервную копию конфигурации.
Ключевые понятия (одной строкой)
- DNSBL / RHSBL — списки IP/доменов, доступные через DNS-запросы; используются для быстрой проверки репутации.
- smtpd_recipient_restrictions — параметр Postfix, определяющий порядок проверок при приёме сообщения.
Постановка задачи
Цель — уменьшить объём нежелательной почты ещё до её доставки в систему, снизив нагрузку на спам-фильтры и почтовые ящики. Подход — комбинировать базовые RFC-проверки, отказ по несоответствию HELO/hostname, а также DNSBL/RHSBL-запросы.
1 Предварительная заметка
Этот краткий гид показывает, как настроить Postfix (версии 2.x и 1.x) для блокировки спама до входа на сервер. Руководство даёт набор конфигурационных опций и примеров; после применения изменений внимательно мониторьте логи на предмет ложных срабатываний.
Полезные ссылки для дальнейшего изучения:
2 Postfix 2.x — пример конфигурации
Откройте /etc/postfix/main.cf и добавьте/замените соответствующие строки.
vi /etc/postfix/main.cfПример блока конфигурации (оставлено как в оригинале; вставьте в main.cf):
[...]
smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
invalid_hostname_reject_code = 554
multi_recipient_bounce_reject_code = 554
non_fqdn_reject_code = 554
relay_domains_reject_code = 554
unknown_address_reject_code = 554
unknown_client_reject_code = 554
unknown_hostname_reject_code = 554
unknown_local_recipient_reject_code = 554
unknown_relay_recipient_reject_code = 554
unknown_sender_reject_code = 554
unknown_virtual_alias_reject_code = 554
unknown_virtual_mailbox_reject_code = 554
unverified_recipient_reject_code = 554
unverified_sender_reject_code = 554
smtpd_recipient_restrictions =
reject_invalid_hostname,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client multi.uribl.com,
reject_rbl_client dsn.rfc-ignorant.org,
reject_rbl_client dul.dnsbl.sorbs.net,
reject_rbl_client list.dsbl.org,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client dnsbl.sorbs.net,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client ix.dnsbl.manitu.net,
reject_rbl_client combined.rbl.msrbl.net,
reject_rbl_client rabl.nuclearelephant.com,
permit
[...]Перезапустите Postfix:
/etc/init.d/postfix restart3 Postfix 1.x — пример конфигурации
Для старых версий Postfix (1.x) добавьте похожие опции. Откройте /etc/postfix/main.cf:
vi /etc/postfix/main.cfВставьте/отредактируйте блок:
[...]
smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
invalid_hostname_reject_code = 554
multi_recipient_bounce_reject_code = 554
non_fqdn_reject_code = 554
relay_domains_reject_code = 554
unknown_address_reject_code = 554
unknown_client_reject_code = 554
unknown_hostname_reject_code = 554
unknown_local_recipient_reject_code = 554
unknown_relay_recipient_reject_code = 554
unknown_sender_reject_code = 554
unknown_virtual_alias_reject_code = 554
unknown_virtual_mailbox_reject_code = 554
unverified_recipient_reject_code = 554
unverified_sender_reject_code = 554
maps_rbl_domains =
multi.uribl.com,
dsn.rfc-ignorant.org,
dul.dnsbl.sorbs.net,
list.dsbl.org,
sbl-xbl.spamhaus.org,
bl.spamcop.net,
dnsbl.sorbs.net,
cbl.abuseat.org,
ix.dnsbl.manitu.net,
combined.rbl.msrbl.net,
rabl.nuclearelephant.com
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_maps_rbl,
check_relay_domains
[...]Перезапустите Postfix:
/ etc/init.d/postfix restart4 Дополнительные списки (DNSBL / RHSBL)
Больше списков и их описания можно найти здесь: http://spamlinks.net/filter-dnsbl-lists.htm
Использование дополнительных DNSBL полезно, но помните: некоторые списки могут давать ложные срабатывания. Ведите мониторинг и, при необходимости, исключайте критичные отправители.
5 Практическая методология (мини-шаги для внедрения)
- Резервная копия: скопируйте current main.cf в safe location.
- Внесите минимальные изменения и перезапустите Postfix.
- Мониторинг: наблюдайте /var/log/mail.log (или syslog) в течение 24–72 часов.
- Откат: если наблюдаете массовые отказы легитимной почты — верните резервную копию и исследуйте конкретные правила.
- Итерация: добавляйте очередной список/правило и повторяйте мониторинг.
6 Чек-лист для ролей
- Системный администратор:
- Сделать резервную копию main.cf и master.cf.
- Применить изменения в тестовой среде, если возможно.
- Настроить логирование и алерты на рост отказов.
- Почтовый администратор:
- Проверить SPF/DKIM/DMARC на своем домене.
- Проверять отчёты о доставке от пользователей.
- Оператор службы поддержки:
- Иметь готовый план отката и шаблон ответа для пользователей, чья почта могла быть заблокирована.
7 Когда предложенные меры могут не сработать
- Если отправитель использует легитимные сервисы с динамическими IP или общими почтовыми реле, они могут быть в DNSBL и блокироваться.
- Современные ботнеты часто используют распределённые IP с «чистой» репутацией, тогда базовые DNSBL-правила окажутся недостаточны.
- Некорректная последовательность smtpd_recipient_restrictions может пропустить проверки — порядок имеет значение.
8 План отката и реагирование на инциденты
- Если замечены ложные отказы — моментальный откат main.cf из резервной копии.
- Включите детальное логирование (debug) для селективных соединений, чтобы найти причину блокировки.
- Добавьте белые списки (smtpd_recipient_restrictions: check_client_access или check_sender_access) для доверенных отправителей.
- Проведите пост-инцидентный анализ и скорректируйте набор RBL/порядок правил.
9 Модель принятия решения (диаграмма)
graph TD
A[Входящее соединение] --> B{HELO/hostname корректен?}
B -- Нет --> R1[Отклонить]
B -- Да --> C{IP в DNSBL?}
C -- Да --> R1
C -- Нет --> D{Авторизация или mynetworks?}
D -- Да --> Accept[Принять]
D -- Нет --> E{Домен отправителя валиден?}
E -- Да --> Accept
E -- Нет --> R1
R1 --> Z[Отправить код 554]10 Итог и рекомендации
- Начните с базовых проверок (HELO, hostname, strict envelopes).
- Подключите проверку через проверенные DNSBL/RHSBL, но по одному списку за раз и с мониторингом.
- Держите план отката и белые списки для критичных отправителей.
- Регулярно просматривайте логи и корректируйте конфигурацию.
Полезные ссылки
- Postfix: http://www.postfix.org
Критерии приёмки
- После развёртывания объём отклонённых соединений увеличился без роста жалоб от пользователей.
- Логирование показывает снижение нагрузки на спам-фильтры (меньше писем на входе).
- Наличие процедур отката и белых списков для быстрого реагирования.
Краткое резюме
- Блокировка на уровне MTA эффективна и снижает нагрузку на фильтры.
- Применяйте изменения поэтапно и мониторьте логи.
- Имейте план отката и механизм белых списков.
Important: перед изменением производственной конфигурации убедитесь в наличии резервной копии main.cf и мониторинга почтовых логов.