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

Постфикс: условные проверки заголовков

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

Почтовый поток помечен провайдером онлайн-ретрансляции (!! SPAM !!, !! BULK !! и т. Д.)

Почтовый поток принимается внутренним постфиксом. Транспорт настроен для ретрансляции на наш внутренний 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

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

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

 If Subject contains *!!SPAM!!*
  then
   If from contains trustedsender@domain.com AND if to contains InternalUser@domain.com
    Then redirect to internal exchange server
    else redirect to quarantine server
  endif
 endif

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

После комментария от @masegaloeh я нашел решение. Идея состоит в том, чтобы второй постфиксный 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

Это заставляет второй экземпляр постфикса переопределять использование 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" == "alphamikevictor@serverfault.com" ] && [ "$recipient" == "alphamikevictor@example.com" ]
            then
            echo "action=FILTER smtp:192.168.1.150"
            echo
            exit 0
            fi
        if [ "$sender" == "thomas@serverfault.com" ] && [ "$recipient" == "thomas@example.com" ]
            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, вот только пример, чтобы понять идею.

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

От: thomas@serverfault.com

Кому: alphamikevictor@example.com

Кому: thomas@example.com

Это перейдет на обычный сервер для alphamikevictor и thomas, поскольку последний тест на сервере политики вернет ФИЛЬТР в нормальное состояние, но если вы поместите alphamikevictor на вторую позицию, он отправит почту для обоих получателей в карантин.