Вопрос или проблема
У меня есть следующая конфигурация 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 нет. Однако можно настроить некоторые обходные пути для достижения подобного функционала.
-
Управление через
milter_default_action
и индивидуальные исключения. В вашем случае, можно установить общее поведение для всех фильтров черезmilter_default_action
, и использовать селективные исключения с помощью директивыmilter_mail_maps
, чтобы настраивать действия в зависимости от таких факторов, как адрес отправителя. -
Поддержка отдельными фильтрами. Некоторые фильтры, такие как 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
- Расширенные модули и политики. Если необходимо более сложное управление, возможно применение внешних скриптов или более мощных систем управления политиками, таких как Policy-Daemon, для тонкой настройки.
Проблема, с которой вы столкнулись, является хорошей демонстрацией ограничений конфигурационной системы Postfix. Чтобы разработать более точечные настройки, возможно, потребуется использование сторонних инструментов или более сложных скриптов для интеграции с фильтрами. Важно оставаться в курсе обновлений Postfix, так как в будущих версиях могут появиться новые возможности для решения подобных задач.