Почтовые системы · 4 min read · Nov 12, 2025

Как бороться со спамом с помощью конфигурации Postfix

Как бороться со спамом с помощью конфигурации Postfix

В этом руководстве вы узнаете, как настроить стандартное руководство Falko по почте для Postfix (+Auth SMTP + Quota), https://www.howtoforge.com/virtual_postfix_mysql_quota_courier, чтобы лучше бороться со СПАМом и обеспечить некоторую обратную совместимость со старыми системами Qmail.

Итак, давайте начнем…

Руководство HowtoForge отлично подходит для всего, однако если у вас очень загруженный почтовый сервер, работающий с Spam Assasin на 1000 сообщений в минуту, это убивает процессор. Лучший ответ — остановить почту до того, как она попадет в Spam Assasin с помощью ряда RBL (Realtime Blacklists) и RHBL (то же самое, но другое), серой листинга и проверок Helo.

Прежде всего, мы хотим изменить существующие ограничения smtpd и добавить целый ряд новых проверок, чтобы помочь уменьшить количество почты, которую система принимает в /etc/postfix/main.cf

### Проверки для удаления неправильно сформированных электронных писем  
smtpd_helo_required     = yes  
strict_rfc821_envelopes = yes  
disable_vrfy_command = yes  
  
unknown_address_reject_code  = 554  
  
unknown_hostname_reject_code = 554  
  
unknown_client_reject_code   = 554  
  
  

smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, regexp:/etc/postfix/helo.regexp, permit  
  
  
  
### При изменении sender_checks этот файл должен быть сгенерирован с помощью postmap , чтобы создать базу данных Berkeley  
  
smtpd_recipient_restrictions =   
   check_client_access hash:/etc/postfix/helo_client_exceptions  
   check_sender_access    hash:/etc/postfix/sender_checks,  
   reject_invalid_hostname,  
### Может вызвать проблемы с Auth SMTP, будьте осторожны!  
   reject_non_fqdn_hostname,  
##################################  
   reject_non_fqdn_sender,  
  
   reject_non_fqdn_recipient,  
  
   reject_unknown_sender_domain,  
  
   reject_unknown_recipient_domain,  
  
   permit_mynetworks,  
  
   reject_unauth_destination,  
  
  
# Добавьте исключения RBL здесь, при изменении rbl_client_exceptions этот  
файл должен быть сгенерирован с помощью postmap , чтобы создать  
базу данных Berkeley  
  
          check_client_access hash:/etc/postfix/rbl_client_exceptions,  
          reject_rbl_client cbl.abuseat.org,  
          reject_rbl_client sbl-xbl.spamhaus.org,  
          reject_rbl_client bl.spamcop.net,   
  
          reject_rhsbl_sender    dsn.rfc-ignorant.org,  
  
          check_policy_service inet:127.0.0.1:60000  
          permit 

Теперь объясним, но сначала нам нужно создать несколько файлов:

Первый файл, который мы хотим создать, это /etc/postfix/helo.regexp, и он будет содержать:

/^subdomain\.host\.com$/           550 Не используйте мое собственное имя хоста  
/^xxx\.yyy\.zzz\.xxx$/             550 Не используйте мой собственный IP-адрес  
/^\[xxx\.yyy\.zzz\.xxx\]$/         550 Не используйте мой собственный IP-адрес  
/^[0-9.]+$/                          550 Ваше программное обеспечение не соответствует RFC 2821  
/^[0-9]+(\.[0-9]+){3}$/              550 Ваше программное обеспечение не соответствует RFC 2821

Это само по себе оттолкнет спамеров, пытающихся отправить команду helo и выдавать себя за сервер, принимающий почту по IP или имени хоста, а также оттолкнет некоторую почту, которая не соответствует требованиям RFC 2821.

Далее нам нужно создать /etc/postfix/helo_client_exceptions:

# Эти IP-адреса клиентов могут обходить проверки fqdn  
# Некоторые комментарии для идентификации IP-адреса ниже  
www.xxx.yyy.zzz OK  

Этот файл нужен на случай, если плохо себя ведущий почтовый сервер не может отправить правильный helo, и вам нужно разрешить прием почты из этого источника. На моем опыте такие устройства, как автономные устройства, камеры видеонаблюдения, плохо соблюдают стандарты, поэтому вам может понадобиться сделать исключение для этого.

Перед тем как изменения в этом файле станут действительными, вам нужно выполнить

postmap /etc/postfix/helo_client_exceptions

Это создаст файл под названием /etc/postfix/helo_client_exceptions.db

Двигаясь дальше, у нас есть /etc/postfix/sender_checks, который позволяет вам обойти различные проверки FQDN и разрешить определенному отправителю пройти. Это особенно полезно, если компания управляет внутренней почтовой сетью, такой как domain.com, но почта работает на int.domain.com, и DNS не настроен для int.domain.com, это отлично для безопасности, но не очень хорошо, потому что внешний DNS не знает о внутренней структуре, и поэтому postfix отклонит int.domain.com.

[email protected]      REJECT   
[email protected]   OK 

Еще раз, этот файл после изменения должен иметь созданный файл Berkeley DB, и поэтому мы создаем его с помощью:

postmap /etc/postfix/sender_checks

Далее у нас есть наши проверки RBL. Существует множество веб-сайтов, посвященных RBL, но чтобы сократить длину статьи, просто скажем, что эти списки постоянно обновляются и предоставляют IP-адреса и имена хостов, которые спамеры используют для пересылки почты. Каждый IP, который пытается отправить почту на ваш почтовый сервер, будет проверяться по этим спискам (4 использованных выше), и если IP не указан в RBL, почтовый сервер примет почту. Конечно, серверы часто оказываются в этих списках случайно, или списки требуют 24 часа для удаления черного IP после вспышки спама, поэтому всегда лучше иметь способ обхода этих проверок.

Чтобы сделать это, мы создаем файл под названием /etc/postfix/rbl_client_exceptions:

## Некоторые случайные комментарии  
www.xxx.yyy.zzz OK   

Еще раз, вы должны выполнить postmap, чтобы сгенерировать файл Berkeley DB

postmap /etc/postfix/rbl_client_exceptions

Последняя строка ограничений smtpd — это фильтр серой листинга. Я не буду вдаваться в детали, так как уже существует руководство на howtoforge, https://www.howtoforge.com/greylisting_postfix_postgrey, но если вы не хотите использовать серую листинг, просто опустите строку

check_policy_service inet:127.0.0.1:60000

Ограничения smtpd очень легко следовать, пока одна из проверок не даст зеленый свет для сообщения, чтобы пройти в очередь Postfix, большинство ответов не уверены, если не дано явное НЕТ, сообщение будет двигаться вниз по списку проверок.

НАСЛЕДИЕ QMAIL

DJB (Дэн Бернштейн) разработал альтернативу SMTP под названием QMQP. Говорят, что она быстрее и требует меньше ресурсов. Если вы заменяете свои старые Qmail MTA на Postfix, вам может понадобиться включить поддержку QMQP.

Мы делаем это, добавив следующее в /etc/postfix/main.cf

qmqpd_authorized_clients = $mynetworks   
qmqpd_error_delay = 5s  
qmqpd_timeout = 300s   

Реалистично вы можете аутентифицироваться против чего угодно, но я решил аутентифицироваться против mynetworks. После того как вы добавили вышеуказанное в main.cf, вам нужно дополнительно изменить /etc/postfix/master.cf и убедиться, что он содержит следующее:

628      inet  n       -       -       -       100       qmqpd    

Теперь все, что вам нужно сделать, это перезапустить Postfix

/etc/init.d/postfix restart

Вы можете проверить ваш новый Postfix, осведомленный о QMQP, набрав:

telnet localhost 628

Аутентификация по IP (Идеально для ретрансляции Smarthost в серверах MS Exchange)

Теперь мы немного изменим руководство, чтобы сделать настройку mynetworks немного проще, чем через плоские файлы, а именно /etc/postfix/main.cf

Создайте следующий файл /etc/postfix/mysql-mynetworks.cf

user = mail_admin  
password = password  
dbname = mail  
table = allowed_hosts  
select_field = 'IP'  
where_field = IP  
hosts = 127.0.0.1  
additional_conditions = and active='yes'   

Вам понадобится следующий SQL на этом этапе

CREATE TABLE allowed_hosts (
active enum(‘yes’,’no’) NOT NULL default ‘1’,
IP varchar(15) NOT NULL default ‘’,
Client varchar(128) NOT NULL default ‘’,
Comments text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

В конце концов, давайте активируем это, изменив строку mynetworks в main.cf Postfix на:

mynetworks = 127.0.0.0/8, proxy:mysql:/etc/postfix/mysql-mynetworks.cf    

Наконец, перезапустите Postfix, чтобы изменения вступили в силу:

chmod o= /etc/postfix/mysql-mynetworks.cf
chgrp postfix /etc/postfix/mysql-mynetworks.cf

/etc/init.d/postfix restart

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.