Postfix: Условные проверки заголовков

Postfix: Условные проверки заголовков

Вот моя ситуация с SMTP.

Почтовый поток помечается поставщиком услуг онлайн-ретрансляции (!!СПАМ!!, !!РАСПРОСТРАНЕНИЕ!! и т. д.)

Почтовый поток принимается внутренним postfix. Транспорт настроен на ретрансляцию на наш внутренний Exchange, иначе, если тема помечена. Я делаю это с помощью Header_checks. Помеченный почтовый поток отправляется на наш карантинный сервер (веб-интерфейс для отдельных пользователей и т. д.)

/^[sS]ubject:.*!!SPAM!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!BULK!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!SUSPECT!!*/ FILTER smtp:192.168.11.250

Работает отлично. Наш карантинный сервер может генерировать список доверенных отправителей для пользователей. Этот белый список доступен, и я могу загрузить его на свой postfix.

У меня вопрос: как применить белый список до проверки заголовков?

 If Subject contains *!!SPAM!!*
  then
   If from contains [email protected] AND if to contains [email protected]
    Then redirect to internal exchange server
    else redirect to quarantine server
  endif
 endif

Я не знаю, как это сделать. Есть какие-нибудь подсказки?

решение1

После комментария @masegaloeh я нашел решение. Идея заключается в том, чтобы иметь второй сервер Postfix SMTP, прослушивающий 10025 с сервером политики, чтобы отправлять почту на обычный сервер (если он в белом списке) или на сервер карантина.

Идея начиналась с решения header_checks в main.cf:

header_checks = regexp:/etc/postfix/header_checks

В header_checks:

/^(S|s)ubject: .*!!(SPAM|BULK|SUSPECT)!!.*/ FILTER  smtp:127.0.0.1:10025

Затем в master.cf (отредактировано с комментариями @masegaloeh):

10025      inet  n       -       n       -       -       smtpd
        -o receive_override_options=no_header_body_checks
        -o smtpd_recipient_restrictions=${my_switcher_restrictions}
policy  unix    -       n       n       -       0       spawn   user=nobody argv=/etc/postfix/policy-server-switcher

Это заставляет второй экземпляр postfix переопределять использование header_checks.

И в main.cf

my_switcher_restrictions = check_policy_service unix:private/policy

И содержимое policy-server-switcher

!/bin/bash

sender=""
recipient=""

while read line
    do
    key=$(echo $line | cut -f1 -d=)
    value=$(echo $line|cut -f2 -d=)
    if [ "$key" == "sender" ] 
        then
        sender=${value}
        logger -p mail.info -t PolicyServer "Sender is: ${value}"
        fi
    if [ "$key" == "recipient" ] 
        then
        recipient=${value}
        logger -p mail.info -t PolicyServer "Recipient is: ${value}"
        fi
    if [  "x${recipient}" != "x" ] && [  "x${sender}" != "x" ]
        then
        if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
            then
            echo "action=FILTER smtp:192.168.1.150"
            echo
            exit 0
            fi
        if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
            then
            echo "action=FILTER smtp:192.168.1.150"
            echo
            exit 0
            fi
        echo "action=FILTER smtp:192.168.1.151"
        echo
        exit 0
        fi
    done

Конечно, вам нужно будет запрограммировать свой сервер политик для загрузки белого списка из базы данных или LDAP, вот просто пример, чтобы понять идею.

Но здесь все еще есть некоторые оговорки, предположим, я отправлю письмо с этим

От:[email protected]

К:[email protected]

К:[email protected]

Это будет отправлено на обычный сервер для alphamikevictor и для thomas, поскольку последний тест на сервере политик возвращает FILTER в обычное состояние, но если вы поместите alphamikevictor на вторую позицию, то он отправит почту для обоих получателей в карантин.

Связанный контент