Саморазоблачение - рандом, хитрости и чужой опыт

Postfix - фильтрация после очереди

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

ВАЖНО! Эта страница является частью списка заметок о настройке почтовой системы (Postfix+Dovecot и пр.).
Родительская страница - обязательна к просмотру: Установка и настройка почтового сервера

Подробнее о конфигурации к которой относятся примеры в этой статье - см. ссылку выше.
Тем же - коротко об основных терминах (MTA, MDA, MUA и т.п.).

Эта заметка имеет характер исследования. Все упомянутые в заметке эксперименты проводились на ОС Debian. Пожалуйста не используйте слепое копирование примеров. Автор не гарантирует, что применение изложенной здесь информации не приведет к потере данных.



Это скорее конспект-шпаргалка, чем достоверный справочник. Кроме ответов здесь могут присутствовать вопросы.

Содержание

  1. Принцип работы
  2. Пример упрощенной фильтрации
  3. Производительность в упрощенной фильтрации
  4. Ограничения для упрощенной фильтрации
  5. Отключение упрощенной фильтрации
  6. Пример расширенной фильтрации
  7. Фильтрация всей почты в расширенном фильтре
  8. Отправка не отфильтрованной почты в расширенном фильтре
  9. Запуск контент-фильтра для расширенной фильтрации
  10. Расширенный фильтр: возвращение почты в Postfix
  11. Производительность в расширенном фильтре
  12. Отключение расширенного фильтра
  13. Фильтрация только почты извне
  14. Разные фильтры для разных доменов
  15. Динамическая фильтрация, в access или header/body
  16. Источники
Это вольный перевод, без предупреждений разбавленный отсебятиной!

Вся информация здесь достоверна в отношение Postfix версии 2.1 или выше.

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

Цепочка событий выглядит следующим образом:
Сеть или локальные пользователи -> Очередь -> Фильтр -> Очередь -> Сеть или локальный ящик

Работу контент-фильтра не следует путать с SMTP-Proxy или Milter, которые обрабатывают почту до попадания в очередь Postfix.

Контент-фильтр может обрабатывать всю почту, а может производить избирательную фильтрацию.

Принцип работы

Контент-фильтр получает не отфильтрованную почту от Postfix, и может выполнить одно из следующих действий:

  1. Вернуть почту Postfix, возможно, после изменения содержания и/или назначения
  2. Отменить или поместить почту на карантин
  3. Отсечь (reject) почту, путем отправки соответствующего кода состояния в Postfix. Postfix отправит почту обратно отправителю

* Отправлять почту обратно отправителю - плохая идея, т.к. адрес может быть несуществующим. Лучшим решением будет уничтожить известные вирусы и поместить письмо на карантин, после чего самостоятельно решить, - что делать с письмом.

Пример упрощенной фильтрации

Первый пример прост в настройке, но имеет серьезные ограничения, которые будут рассмотрены во втором примере. Postfix получает не отфильтрованную почту пришедшую из сети через smtpd-сервер, а также не отфильтрованную почту доставленную через через pipe.
Отфильтровав ее, контент-фильтр вводит ее обратно используя sendmail-команды, после чего она может быть окончательно доставлена.

Из вышесказанного очевидно следует, что почта, введенная с использованием команд "Postfix-sendmail", вообще не подлежит фильтрации.

На схеме, приведенной ниже, показано взаимодействие демонов Postfix в описываемой ситуации.
См. также статью Postfix - описание настроек, в контексте рассматриваемой конфигурации

Не фильтрованная

->

smtpd

pickup

>-

cleanup

->

qmgr
Postfix
очередь

-<

local
smtp
pipe

->
->
Фильтрованная
Фильтрованная

^
|
|
v

maildrop
queue

<- Postfix
postdrop
<- Postfix
sendmail
<- Контент
фильтр

Скрипт упрощенного контент-фильтра может быть, например, таким:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/sh
 
# Simple shell-based filter. It is meant to be invoked as follows:
#       /path/to/script -f sender recipients...
 
# Localize these. The -G option does nothing before Postfix 2.3.
INSPECT_DIR=/var/spool/filter
SENDMAIL="/usr/sbin/sendmail -G -i" # NEVER NEVER NEVER use "-t" here.
 
# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
 
# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15
 
# Start processing.
cd $INSPECT_DIR || {
    echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }
 
cat >in.$$ || { 
    echo Cannot save mail to file; exit $EX_TEMPFAIL; }
 
# Specify your content filter here.
# filter <in.$$ || {
#   echo Message content rejected; exit $EX_UNAVAILABLE; }
 
$SENDMAIL "$@" <in.$$
 
exit $?

Примечания:

Строка 8: -G опция указывает, что выход фильтра не является локальным представлением почты: не стоит добавлять имя локального домена к адресу в заголовках сообщений. Эта опция не работает до Postfix версии 2.3.

Строка 8: -i опция указывает, не прекращать чтение ввода, когда строка содержит только ".".

Строка 8: Никогда не используйте здесь параметр "-t" командной строки. Это будет приводить к ошибочной доставке почты, отправляя сообщения из списка рассылки обратно в список рассылки.

Строка 21: Идея заключается том, чтобы сначала захватить файл сообщения, а затем запустить контент-фильтр через сторонние программы.

Строка 22: Если сообщение не может быть захвачено из файла, доставка почты отменяется со статусом выхода 75 (EX_TEMPFAIL). Postfix помещает сообщение в очередь отложенных, и сделает еще одну попытку позже.

Строка 25: Здесь нужно будет указать реальную программу фильтрации содержимого, которая получит контент на стандартный ввод.

Строка 26: Если программа Контент-фильтр обнаружит неисправность, почта будет отброшена со статусом выхода 69 (EX_UNAVAILABLE). Postfix пошлет назад отправителю сообщение о невозможности доставки почты.

* Примечание: Отправлять почту обратно отправителю - плохая идея, т.к. адрес может быть несуществующим. Лучшим решением будет уничтожить известные вирусы и поместить письмо на карантин, после чего самостоятельно решить - что делать с письмом.

Строка 28: Если содержимое "OK", то это передается как команда ввода Postfix Sendmail, и приводит к команде статуса выхода для фильтра, независимо от команды статуса выхода Postfix Sendmail. Postfix доставит сообщение, в стандартном порядке.

Строка 30: Postfix возвращает статус команды выхода Postfix Sendmail.


Лучше будет сначала запустить этот скрипт вручную, пока не будет получен удовлетворительный результат. Запустите его с реальным сообщением (заголовки + тело) в качестве входных данных:

% /path/to/script -f sender -- recipient...

Как только будет получен удовлетворительный результат:

  • Создайте локальную учетную запись пользователя с именем "filter". Этот пользователь оперирует потенциально опасным почтовым контентом, поэтому должен быть создан отдельный аккаунт. Не используйте "nobody", и конечно же не используйте "root" или "postfix".
  • Создайте каталог /var/spool/filte и сделайте его доступным для пользователя "filter". В этом каталоге будут храниться временные файлы контент-фильтра.
  • Настройте Posfix для доставки почты контент-фильтром через pipe
  • /etc/postfix/master.cf :

    # =============================================================
      # service type  private unpriv  chroot  wakeup  maxproc command
      #               (yes)   (yes)   (yes)   (never) (100)
      # =============================================================
      filter    unix  -       n       n       -       10      pipe
        flags=Rq user=filter null_sender=
        argv=/path/to/script -f ${sender} -- ${recipient}

    * Пробелы (в т.ч. в начале строки) - обязательны!.

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

  • Чтобы включить фильтрацию содержимого только для SMTPd нужно добавить опцию "-o content_filter=filter:dummy" в файл "master.cf", для Postfix SMTP сервера (smtpd).
  • /etc/postfix/master.cf :

    # =============================================================
      # service type  private unpriv  chroot  wakeup  maxproc command
      #               (yes)   (yes)   (yes)   (never) (100)
      # =============================================================
      smtp      inet  ...other stuff here, do not change...   smtpd
            -o content_filter=filter:dummy

    * Пробелы (в т.ч. в начале строки) - обязательны!.

    -o content_filter - заставляет Postfix добавлять один фильтр filter:dummy на каждое почтовое сообщение. Эта запись отменяет нормальную маршрутизацию почты и вместо этого направляет почту контент-фильтру.

    content_filter должен содержать значение в виде "транспорт:пункт_назначения". Транспорт - это имя агента доставки почты, определяемое первым полем, указанным в соотв. строке, в /etc/postfix/master.cf (см. предыдущий блок кода).

    Смысл, указанного выше пустым, значения "пункт_назначения" {The meaning of an empty next-hop filter destination...} зависит от версии. Версия Postfix 2.7 и выше будет использовать домен получателя, а более ранние версии будут использовать "$myhostname". Укажите default_filter_nexthop = $myhostname для совместимости с версией Postfix 2.6 и более ранними, или укажите не пустой "пункт_назначения" {or specify a non-empty next-hop filter destination}.

    Параметр content_filter имеет более низкий приоритет, чем действие "FILTER", указанное в access, header_checks или body_checks.

  • Выполните service postfix reload , для применения изменений

Производительность в упрощенной фильтрации

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

Ограничения для упрощенной фильтрации

Проблема контент-фильтров, таких как представленный ваше, в том, что они не являются достаточно надежными. Причина в том, что здесь не используется четко оговоренный протокол. Поэтому в случае прерывания скрипта из за каких-нибудь проблем с памятью, не будет произведен правильный выход, - такой как например описан в файле /usr/include/sysexits.h . Вместо того, чтобы попасть в отложенную очередь (deferred queue) почта будет контролироваться bounce. Такое же неустойчивое состояние может наступить, когда сам контент-фильтр столкнется с проблемами нехватки ресурсов.

Использование упрощенного контент-фильтра не подходит для случаев, когда задействованы паттерны фильтрации через header_checks или body_checks. Эти паттерны будут задействованы после окончания цикла фильтрации с помощью команд Posfix Sendmail... Метод расширенной фильтрации контента (см. ниже) позволяет отключить header_checks и body_checks.

Отключение упрощенной фильтрации

Чтобы отключить упрощенную фильтрацию контента:

  • Отредактируйте файл "master.cf", удалив опцию -o content_filter=filter:dummy из описания smtpd
  • Выполните postsuper -r ALL , чтобы удалить фильтр из файлов очереди
  • Выполните еще раз service postfix reload

Пример расширенной фильтрации

Второй пример более сложный, но может дать более высокую производительность, и меньшую вероятность проблем с ресурсами при доставке почты. Этот фильтр принимает не отфильтрованную почту, используя SMTP на порту :10025 localhost, и отправляет отфильтрованную почту обратно в Postfix, через SMTP на локальном порту 10026.

Для фильтрации не-smtp, можно использовать программное обеспечение Тодда Беннета (см. ссылку на источники внизу главной страницы темы: Установка и настройка почтового сервера)

На схеме, приведенной ниже, показано взаимодействие демонов Postfix в описываемой ситуации.
См. также статью Postfix - описание настроек, в контексте рассматриваемой конфигурации

Не фильтрованная

Не фильтрованная
->

->

smtpd

pickup

>-

cleanup

->

qmgr
Postfix
очередь

-<

smtp

local

->

->
Фильтрованная

Фильтрованная

^
|
|
v
smtpd
:10026
smtp
^
|
|
v
Контент-фильтр :10025

Приведенный пример фильтрует всю почту, в том числе сообщения, поступающие через SMTP, и почту, переданную локально через команду Postfix Sendmail (для локальной передачи Postfix использует pickup-сервер; но для сохранения простоты этой схемы, подробности локальной доставки здесь не показаны). См. примеры в конце этого документа, как исключить локальных пользователей из фильтрации или как настроить контент-фильтр на зависимость от пункта назначения.

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

Фильтрация всей почты в расширенном фильтре

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

content_filter = scan:localhost:10025
receive_override_options = no_address_mappings
  • receive_override_options - отключает манипуляции со строкой адреса перед фильтрацией контента, поэтому фильтр видит оригинальные почтовые адреса, а не результат преобразования к виртуальному алиасу, каноническое отображение, автоматические BCC-копии, адрес-максарадинг и т.п.
  • content_filter - заставляет Postfix добавить один фильтр с содержанием "scan:localhost:10025" на каждое входящее почтовое сообщение. Контент-фильтр добавляется для smtpd и pickupqmqpd, если этот сервис подключен).
  • Запрос контент-фильтрации хранится в файловой очереди, - Postfix отслеживает, какое письмо в ней нуждается. Если файловая очередь содержит запрос фильтрации контента, то менеджер очереди будет доставлять почту на указанный фильтр, независимо от конечного пункта назначения.
  • Значение content_filter ожидается в виде "транспорт:пункт_назначения". Транспорт - это имя агента доставки почты, определяемое первым полем, указанным в соотв. строке, в /etc/postfix/master.cf . См. настройку аналогичных значений в описании упрощенного фильтра выше.
  • Параметр content_filter имеет более низкий приоритет, чем действие "FILTER", указанное в access, header_checks или body_checks.
  • Выполните service postfix reload , для применения изменений

Отправка не отфильтрованной почты в расширенном фильтре

В этом примере scan является экземпляром клиента Postfix с несколько другими параметрами конфигурации. Можно создать сервис в Postfix настроив его в файле
/etc/postfix/master.cf :

# =============================================================
# service type  private unpriv  chroot  wakeup  maxproc command
#               (yes)   (yes)   (yes)   (never) (100)
# =============================================================
  scan      unix  -       -       n       -       10      smtp
    -o smtp_send_xforward_command=yes
    -o disable_mime_output_conversion=yes
    -o smtp_generic_maps=

* Пробелы перед строками с опциями - обязательны.

  • В этом примере настроена возможность работы 10 контент-фильтров одновременно. Вместо ограничения в 10 процессов, используйте число, допустимое для Вашей машины. Программа может потреблять много системных ресурсов, поэтому указывайте разумную величину.
  • -o smtp_send_xforward_command=yes
    Попытка определить первоначальное имя клиента и IP-адрес, и сохранить его после фильтрации
  • -o disable_mime_output_conversion=yes
    Предотвращает нарушение цифровых подписей и ключей, которое может произойти потому, что некоторые фильтры контента не объявляют 8BITMIME-поддержку, даже если они могут обрабатывать 8-битные сообщения
  • -o smtp_generic_maps=
    Предотвращает перезапись локального адреса через generic. Такая перезапись должна произойти только, когда почта отправляется наружу.

Запуск контент-фильтра для расширенной фильтрации

Контент-фильтр может быть настроен с использованием сервиса spawn, который обеспечивает экземпляр Postfix inetd. Можно создать сервис Postfix с использованием 10 процессов на порту :10025 localhost, настроив его в файле
/etc/postfix/master.cf :

# ===================================================================
# service       type  private unpriv  chroot  wakeup  maxproc command
#                     (yes)   (yes)   (yes)   (never) (100)
# ===================================================================
localhost:10025 inet  n       n       n       -       10      spawn
    user=filter argv=/path/to/filter localhost 10026

* Пробелы перед строками с опциями - обязательны.

  • filter - имя системной учетной записи локального пользователя. Пользователь не может осуществить вход, не имеет домашнего каталога, оболочки, и для него установлен пароль "*". Пользователь управляет потенциально опасным почтовым контентом - именно поэтому должен быть отдельный аккаунт.
  • По умолчанию Postfix отменяет команду, выполнение которой продолжается более, чем command_time_limit секунд (по умолчанию 1000). Это предотвращает зависание фильтра.

Если нужно, чтобы локальный порт :10025 прослушивал другой фильтр (вместо Postfix), то необходимо запустить его в качестве автономной программы и не использовать Postfix spawn.

Расширенный фильтр: возвращение почты в Postfix

Принцип работы контент-фильтра в том, что либо снабдить почту соответствующим диагностическим сообщением использовав bounce, либо вернуть ее обратно, через выделенный сервис, слушающий на локальном порту :10026.

Простейший фильтр содержимого просто копирует SMTP команды и данные между вводом и выводом. Если у него есть проблемы, то все, что он может сделать, - это ответить '.' во ввод, с сообщением '550 content rejected' и разъединиться без посылки '.' не посылая почту обратно в Postfix.

/etc/postfix/master.cf :

# ===================================================================
# service       type  private unpriv  chroot  wakeup  maxproc command
#                     (yes)   (yes)   (yes)   (never) (100)
# ===================================================================
localhost:10026 inet  n       -       n       -       10      smtpd
	-o content_filter= 
	-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters
	-o smtpd_helo_restrictions=
	-o smtpd_client_restrictions=
	-o smtpd_sender_restrictions=
	# Postfix 2.10 and later: specify empty smtpd_relay_restrictions.
	-o smtpd_relay_restrictions=
	-o smtpd_recipient_restrictions=permit_mynetworks,reject
	-o mynetworks=127.0.0.0/8
	-o smtpd_authorized_xforward_hosts=127.0.0.0/8

* Пробелы перед строками с опциями - обязательны.

  • ВАЖНО! - Не используйте пробелы вокруг "=" или ","
  • ВАЖНО! - Сервер SMTP не должен иметь меньший лимит процессов, чем "filter" в соответствующем описании в "master.cf"
  • -o content_filter= - переопределяет настройки "main.cf", и требует не подвергать фильтрации почту, которая уже была отфильтрована. Это необходимо, чтобы избежать зацикливания.
  • -o receive_override_options - переопределяет настройки "main.cf", так же чтобы избежать дублирования того, что уже было сделано контент-фильтром ранее. Следующие параметры дополняют параметры указанные в "main.cf":
    • no_unknown_recipient_checks - отключает предупреждение о том, что адресат не найден
    • no_header_body_checks - отключает проверку header/body
    • no_milters - отключает Milter (для Postfix версий 2.3 и выше)
    • Здесь отсутствует опция no_address_mappings. Это позволяет выполнить преобразования к виртуальному алиасу, каноническое отображение, адрес-максарадинг и т.п., после контент-фильтра. А параметр receive_override_options отключает эти преобразования перед контент-фильтром

    Это передает переопределяемые опции как, либо реализуемые сервером SMTP, либо переданные в cleanup{These receive override options are either implemented by the SMTP server itself, or they are passed on to the cleanup server}.

  • -o smtpd_xxx_restrictions и -o mynetworks=127.0.0.0/8 - переопределяет настройки "main.cf". Это спам-контроль, который здесь только отнимет время.
  • -o smtpd_authorized_xforward_hosts=127.0.0.0/8 - Попытка определить первоначальное имя клиента и IP-адрес, и сохранить его после фильтрации

Производительность в расширенном фильтре

В многослойном подходе фильтрации контента, описанном здесь, важно, чтобы было адекватное соответствие лимитов параллельных процессов возможностям машины (памяти и пр. ресурсов). Слишком малое допустимое количество процессов переполняет очередь, даже при малом количестве писем. Слишком большое допустимое количество процессов приводит к отказам обработки контент-фильтром из за нехватки ресурсов.

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

Отключение расширенного фильтра

Чтобы выключить расширенный фильтр:

  • Удалите или закомментируйте в
  • /etc/postfix/main.cf :

    content_filter = scan:localhost:10025
    receive_override_options = no_address_mappings

    Прочие изменения станут неактивны после отключения вышеуказанных настроек.

  • Выполните: postsuper -r ALL, чтобы очистить от фильтра текущую очередь
  • Выполните: service postfix restart

Фильтрация только почты извне

Самый простой способ - настроить Postfix на несколько IP-адресов:

  • Два SMTP-сервера на разных IP, для внутренних пользователей - с отключенной фильтрацией контента.
  • /etc/postfix/master.cf :

    ======================================
    # service      type  private unpriv  chroot  wakeup  maxproc command
    #                    (yes)   (yes)   (yes)   (never) (100)
    # ==================================================================
    1.2.3.4:smtp   inet  n       -       n       -       -       smtpd
    	-o smtpd_client_restrictions=permit_mynetworks,reject
    127.0.0.1:smtp inet  n       -       n       -       -       smtpd
    	-o smtpd_client_restrictions=permit_mynetworks,reject

    * Пробелы перед строками с опциями - обязательны.

  • Один SMTP-сервер для почты извне со включенным контент-фильтром
  • /etc/postfix/master.cf :

    # =================================================================
    # service     type  private unpriv  chroot  wakeup  maxproc command
    #                   (yes)   (yes)   (yes)   (never) (100)
    # =================================================================
    1.2.3.5:smtp  inet  n       -       n       -       -       smtpd
    	-o content_filter=filter-service:filter-destination 
    	-o receive_override_options=no_address_mappings

    * Пробелы перед строками с опциями - обязательны.

После этого, можно повторить настройку для "упрощенного" или "расширенного" контент-фильтра, описанную в примерах выше, за исключением того, что не указывать content_filter или receive_override_options в файле "main.cf".

Разные фильтры для разных доменов

Если вы являетесь поставщиком MX-службы и хотите применять разные контент-фильтры для разных доменов, можно настроить один экземпляр Postfix на несколько SMTP-серверов со своими IP-адресами в master.cf . При этом для каждого адреса используется свой контент-фильтр.

/etc/postfix/master.cf :

# =================================================================
# service     type  private unpriv  chroot  wakeup  maxproc command
#                   (yes)   (yes)   (yes)   (never) (100)
# =================================================================
# SMTP service for domains that are filtered with service1:dest1
1.2.3.4:smtp  inet  n       -       n       -       -       smtpd
	-o content_filter=service1:dest1 
	-o receive_override_options=no_address_mappings
# SMTP service for domains that are filtered with service2:dest2
1.2.3.5:smtp  inet  n       -       n       -       -       smtpd
	-o content_filter=service2:dest2
	-o receive_override_options=no_address_mappings

* Пробелы перед строками с опциями - обязательны.

После этого, можно повторить настройку для "упрощенного" или "расширенного" контент-фильтра, описанную в примерах выше, за исключением того, что не указывать content_filter или receive_override_options в файле "main.cf".

Необходимо настроить каждую MX-запись в DNS на свой экземпляр SMTP-сервера.

Динамическая фильтрация, в access или header/body

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

Чтобы включить контент-фильтр для access с использованием таблицы{списка} правил:

/etc/postfix/access:
    whatever       FILTER foo:bar

Чтобы включить контент-фильтр для header_checks или body_checks с использованием паттерна таблицы{списка}:

/etc/postfix/header_checks:
    /whatever/     FILTER foo:bar

Вы можете сделать это в smtpd - access-maps так же как и в header/body_checks для cleanup. Эта функция должна быть использована с большой осторожностью: Вы должны отключить все опции UCE в after-filter для smtpd и cleanup демонов, иначе у Вас будет петля в фильтрации контента.

Ограничения:

  • Действие FILTER от smtpd access-maps и header/body_checks имеют приоритет над фильтрами, указанными в файле "main.cf" в параметре content_filter
  • Если сообщение вызывает срабатывание более одного фильтра, только последний из них возымеет эффект
  • Но при этом контент-фильтр будет применен ко всем получателям данного сообщения.

Источники

Источники информации и ссылки перечислены на отдельной странице, указанной внизу главной страницы темы:
Установка и настройка почтового сервера

Комментариев: 9 RSS
Иван Иваныч1
2015-12-17 в 11:43:37

Вот поэтому и нужно читать оригинальную документацию

"Если у него есть проблемы, то все, что он может сделать, - это ответить '.' во ввод, "

А в оригинале http://www.postfix.org/FILTER_README.html

"If it has a problem, all it HAS to do is to reply to an input of `.' from Postfix with"

(КАПС мой)

ДОЛЖЕН, не может, а ДОЛЖЕН

Иван Иваныч

Оригинал читать нужно, согласен. Но в данном случае я думаю смысл передан нормально. Выражение "...то все что он может сделать, это ответить..." подразумевает что он это сделает. Выражение "...то все что он должен сделать, это ответить..." менее привычное, не такое характерное.

Не думаю, что здесь у читающего могут здесь возникнуть проблемы с пониманием.

Иван Иваныч3
2015-12-19 в 14:18:39

ну уж если по русски то так: "всё, что ему нужно сделать" - подчеркивает факт минимума усилий и полностью соответсвует оригиналу.

PS.Случайно снова забрел сюда, хоть и зарекался.

Иван Иваныч

Можно и так. Суть не только понятна, но и улавливается интуитивно во всех этих случаях.

P.S. Случайностей не бывает :).

Подскажите, пожалуйста, по фильтрации после милтера.

Стоит Rspamd, явный спам отбрасывает, вероятный помечает заголовком X-Spam: Yes

Нужно такие письма перенаправлять на отдельный ящик.

Прописал в /etc/postfix/header_checks

/^X-Spam: Yes/ REDIRECT spam@mailserver.ru

Вариант с проверкой на этапе cleanup не работает:

/etc/postfix/master.cf

cleanup unix n - n - 0 cleanup

-o header_checks=regexp:/etc/postfix/header_checks

Вариант с направлением на отдельный smtpd и проверкой заголовков уже на нем также не срабатывает:

/etc/postfix/main.cf

content_filter = headercheck:[127.0.0.1]:10025

/etc/postfix/master.cf

headercheck unix - - n - 1 smtp

-o smtp_send_xforward_command=yes

-o smtp_tls_security_level=none

127.0.0.1:10025 inet n - n - 1 smtpd

-o content_filter=

-o smtpd_recipient_restrictions=

-o smtpd_milters=

-o non_smtpd_milters=

-o header_checks=regexp:/etc/postfix/header_checks

Видимо эти заголовки добавляются позднее? Помогите разобраться, что происходит.

pashkenciy

Не сталкивался с Rspamd, может быть в самом деле заголовки добавляются позднее. Я бы лучше использовал Sieve для перенаправления писем в другую папку.

У меня посфикс пограничный сервер, дальше расходится почта на несколько ексченджей. Можно конечно на них настраивать, но удобней было бы в одном месте сделать) Rspamd обычный милтер, мне казалось они почту обрабатывают еще до постановки в очередь и возвращают постфиксу.

pashkenciy

Посмотрел внимательно Ваше предыдущее сообщение. Не совсем понятны Ваши настройки.

Попробуйте сделать все четко по инструкции в этой статье для расширенной фильтрации.

Нашлось простое решение, вместо header_checks использовать milter_header_checks

Спасибо за помощь!

Оставьте комментарий

Вы можете войти под своим логином или зарегистрироваться на сайте.