Вот моя ситуация с 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 на вторую позицию, он отправит почту для обоих получателей в карантин.