Использование per-milter action clause заставляет Postfix smtpd завершаться с ошибкой.

Вопрос или проблема

У меня есть следующая конфигурация milter в Postfix:

smtpd_milters = inet:localhost:8891,
    unix:/var/run/opendmarc/opendmarc.sock,
    unix:/var/run/openarc/openarc.sock,
    unix:/var/run/clamav-milter/clamav-milter.socket,
    unix:/run/spamass-milter/spamass-milter.sock

non_smtpd_milters = inet:localhost:8891,
    unix:/var/run/clamav-milter/clamav-milter.socket

milter_mail_maps = pcre:/etc/postfix/milter-mail-maps
milter_default_action = accept

Я пытаюсь реализовать действие для каждого milter отдельно, таким образом:

smtpd_milters = {inet:localhost:8891,action = accept},
    {unix:/var/run/opendmarc/opendmarc.sock, action = accept},
    {unix:/var/run/openarc/openarc.sock, action = accept},
    {unix:/var/run/clamav-milter/clamav-milter.socket, action = tempfail},
    {unix:/run/spamass-milter/spamass-milter.sock, action = tempfail}

non_smtpd_milters = {inet:localhost:8891, action = tempfail},
    {unix:/var/run/clamav-milter/clamav-milter.socket, action = tempfail}

milter_mail_maps = pcre:/etc/postfix/milter-mail-maps
milter_default_action = accept

Однако, когда я добавляю эту конфигурацию, smtpd падает для любых входящих писем с такой ошибкой:

postfix/smtpd[76913]: fatal: malformed option: missing '=' after attribute name: "...action..."

Насколько я знаю, я правильно отформатировал код milter. Кто-нибудь еще сталкивался с этой проблемой и как ее исправить?

Ответ или решение

Ошибка, с которой вы столкнулись при попытке реализовать управление действиями на уровне отдельных фильтров (per-milter action), связана с тем, что конфигурационная запись в Postfix не соответствует ожидаемому синтаксису. Позвольте подробно объяснить эту проблему, предложить примеры и рассказать, как можно исправить ситуацию.

Теория

Postfix — это популярный почтовый сервер с открытым исходным кодом, который широко используется для пересылки и доставки почты. Milter (Mail Filter) — это интерфейс для фильтрации электронной почты, который позволяет отправлять сообщения через внешние фильтры, такие как ClamAV для антивирусной фильтрации или SpamAssassin для борьбы со спамом.

Конфигурация самих фильтров в Postfix осуществляется через параметры smtpd_milters и non_smtpd_milters, которые указывают, какие фильтры следует использовать для обработки входящих и исходящих сообщений соответственно. Формат этих переменных предполагает, что они представляют собой список фильтров без дополнительных управляющих структур вроде "action".

Пример

Рассмотрим пример вашего конфигурационного файла:

smtpd_milters = {inet:localhost:8891,action = accept},
    {unix:/var/run/opendmarc/opendmarc.sock, action = accept},
    {unix:/var/run/openarc/openarc.sock, action = accept},
    {unix:/var/run/clamav-milter/clamav-milter.socket, action = tempfail},
    {unix:/run/spamass-milter/spamass-milter.sock, action = tempfail}

non_smtpd_milters = {inet:localhost:8891, action = tempfail},
    {unix:/var/run/clamav-milter/clamav-milter.socket, action = tempfail}

Это синтаксис выдает ошибку:

postfix/smtpd[76913]: fatal: malformed option: missing '=' after attribute name: "...action..."

Проблема в том, что Postfix ожидает простого списка фильтров, в то время как вы используете синтаксис, который предполагает обработку дополнительной логики, которая не поддерживается в непосредственной записи smtpd_milters.

Применение

К сожалению, в текущей версии Postfix (на момент 2023 года) прямой интеграции для управления действиями per-milter нет. Однако можно настроить некоторые обходные пути для достижения подобного функционала.

  1. Управление через milter_default_action и индивидуальные исключения. В вашем случае, можно установить общее поведение для всех фильтров через milter_default_action, и использовать селективные исключения с помощью директивы milter_mail_maps, чтобы настраивать действия в зависимости от таких факторов, как адрес отправителя.

  2. Поддержка отдельными фильтрами. Некоторые фильтры, такие как SpamAssassin, могут иметь свои собственные специфические конфигурационные файлы, в которых можно настроить специфичные действия.

Вот пример того, как использование milter_mail_maps может быть полезным:

milter_mail_maps = pcre:/etc/postfix/milter-mail-maps
milter_default_action = tempfail

Файл /etc/postfix/milter-mail-maps может содержать что-то подобное:

/^some.sender@example\.com$/ FILTER_ACCEPT
/^VIP\.recipient@example\.com$/ FILTER_ACCEPT
  1. Расширенные модули и политики. Если необходимо более сложное управление, возможно применение внешних скриптов или более мощных систем управления политиками, таких как Policy-Daemon, для тонкой настройки.

Проблема, с которой вы столкнулись, является хорошей демонстрацией ограничений конфигурационной системы Postfix. Чтобы разработать более точечные настройки, возможно, потребуется использование сторонних инструментов или более сложных скриптов для интеграции с фильтрами. Важно оставаться в курсе обновлений Postfix, так как в будущих версиях могут появиться новые возможности для решения подобных задач.

Оцените материал
Добавить комментарий

Капча загружается...