Я видел на некоторых хороших почтовых серверах настройки, они прерывают соединение сразу после ошибки
454 4.7.1 <spammer@spamserver.com>: Relay access denied
что, вероятно, экономит много ресурсов и трафика. И мой Postfix по-прежнему сохраняет SMTP-сессию открытой для будущих команд, которые, вероятно, будут спамом.
Как я могу сказать Postfix о прекращении сеанса (как эти умные серверы) сразу после того, как эта ошибка была передана спамеру?
Postfix версии 2.10.1
Выход postconf -n
[root@mail ~]# postconf -n
config_directory = /etc/postfix
header_checks = pcre:/etc/postfix/header_check
inet_protocols = ipv4
local_recipient_maps =
mydestination = example.com, $myhostname, localhost.$myhostname, $mydomain, localhost.$mydomain
mydomain = example.com
myhostname = mail.example.com
mynetworks = 127.0.0.0/8 10.0.0.0/16
myorigin = example.com
relay_domains = example.com
smtpd_banner = $myhostname ESMTP
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_invalid_hostname,
reject_unauth_pipelining,
reject_non_fqdn_sender,
reject_unknown_recipient_domain,
reject_unknown_sender_domain,
check_sender_access hash:/etc/postfix/access
smtpd_sender_restrictions =
check_recipient_access hash:/etc/postfix/recipients,
reject_non_fqdn_sender,
reject_rhsbl_sender blackhole.securitysage.com,
reject_unknown_sender_domain
transport_maps = hash:/etc/postfix/transport
У меня для вас хорошие и плохие новости по этому вопросу.
Хорошие новости Это Postfix действительно имеет механизм отключения, когда клиент плохо себя ведет. Это задокументировано эта страница. Поведение контролируется тремя параметрами: smtpd_soft_error_limit, smtpd_hard_error_limit, smtpd_error_sleep_time. Этот псевдокод проиллюстрирует, как это работает.
While smtpd get connection from client
error_counter = 0
if there ERROR* in SMTP transaction
error_counter = error_counter + 1
if error_counter > $smtpd_soft_error_limit
show the error message with delay $smtpd_soft_error_delay
else if error_counter > $smtpd_hard_error_limit
DISCONNECT client
else
show the error message IMMEDIATELY
if one message transfered successfully
error_counter = 0 //reset the counter
Примечание. В терминах постфикса ERROR*
запускается, когда клиентский запрос не распознан или не реализован, когда клиентский запрос нарушает ограничения доступа или когда происходит какая-либо другая ошибка.
Смотрите, если мы установим smtpd_hard_error_limit
с 1 postfix с радостью отключит клиента при возникновении ошибки.
Плохие новости мы не можем отфильтровать, какая ошибка вызвала smtpd_hard_error_limit. Ваше намерение ограничить это поведение отключения до Relay Access Denied
ошибка не может быть реализована. После того, как вы установите smtpd_hard_error_limit
до 1, каждая ошибка вроде
Recipient access rejected, user not Found
или
Sender address rejected: Domain not found;
приведет к отключению клиента. Документация postfix заявляет некоторый эффект, когда smtpd_hard_error_limit = 1
.
В условиях стресса используйте smtpd_hard_error_limit, равное 1, вместо значения по умолчанию 20. Это помогает отключать клиентов после единственной ошибки, давая другим клиентам возможность подключиться. Однако это может вызвать значительные задержки с законной почтой, такой как список рассылки, содержащий несколько уже неактивных имен пользователей, которые не удосужились отказаться от подписки. Никакая почта не должна быть потеряна, пока эта мера используется только временно.
В качестве альтернативного решения для зомби-клиента вы можете включить постэкран в постфиксе. Postscreen добавит один уровень в процесс smtpd, чтобы сервер работал с легитимным клиентом. См. Документацию в Вот и Вот
Postfix 2.10 вводит один параметр, называемый smtpd_relay_restriction
. Вы можете прочитать документацию в postconf (5). По умолчанию этот параметр имеет значения
smtpd_relay_restrictions =
permit_mynetworks
permit_sasl_authenticated
defer_unauth_destination
Параметр defer_unauth_destination
выдаст ошибку 4xx вместо 5xx.
Лучший совет - разделить ограничение на два параметра smtpd_relay_restriction и smtpd_recipient_restriction. Однако, если вы настаиваете на сохранении старой конфигурации (например, только в smtpd_recipient_restriction), вы можете установить smtpd_relay_restriction пустым в main.cf
smtpd_relay_restriction =