Назад | Перейти на главную страницу

сообщить Postfix о закрытии соединения сразу после сообщения «Relay access denied»

Я видел на некоторых хороших почтовых серверах настройки, они прерывают соединение сразу после ошибки

454 4.7.1 <spammer@spamserver.com>: Relay access denied

что, вероятно, экономит много ресурсов и трафика. И мой Postfix по-прежнему сохраняет SMTP-сессию открытой для будущих команд, которые, вероятно, будут спамом.

Как я могу сказать Postfix о прекращении сеанса (как эти умные серверы) сразу после того, как эта ошибка была передана спамеру?

Информация

У меня для вас хорошие и плохие новости по этому вопросу.

Хорошие новости Это 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, чтобы сервер работал с легитимным клиентом. См. Документацию в Вот и Вот


Почему мой сервер показывает ошибку 4XX вместо 5XX?

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 =