Вот моя ситуация с 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, вот просто пример, чтобы понять идею.
Но здесь все еще есть некоторые оговорки, предположим, я отправлю письмо с этим
Это будет отправлено на обычный сервер для alphamikevictor и для thomas, поскольку последний тест на сервере политик возвращает FILTER в обычное состояние, но если вы поместите alphamikevictor на вторую позицию, то он отправит почту для обоих получателей в карантин.