Вход:  Пароль:  
FreeSource: Документация?/Postfix/filter?/headerbodycheckspassthru ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |

Выборочное приминение {header,body}_check

Статья подготовлена на основе http://postfix.ru/viewtopic.php?t=229&start=30

>> Смотрите первый пост этого треда. И попытайтесь осознать, что header/../body_check выполняется всегда и для всех без исключений by design.
> Конечно, Вы правы, unk. Но я с детства не люблю, когда говорят «это так есть, так должно быть, и точка». И, знаете, чаще всего получалось так, что можно сделать и по-другому, и оно таки будет работать! :)

На самом деле, момент истины заключается в том, что правила smtpd_*_restrictions работают в демоне smtpd, а header/body_checks – в демоне cleanup. Т.е. обработка письма идет так:
-> smtp -> cleanup -> qmgr -> ..., и, конечно, cleanup не знает, что smtp уже хочет отдать письмо в hold (это поймет только qmgr, а он идет уже после cleanup).


Обойти cleanup невозможно в принципе, но он берет параметры *_checks из main.cf. Итак... что нужно сделать? Правильно – поменять main.cf так, чтобы в нем либо *_checks отсутствовали, либо игнорировались. Это достигается путем запуска еще одного listener'а с условием -o receive_override_options=no_header_body_checks (ВНИМАНИЕ: решение не предусматривает запуска 2-го экземпляра postfix).


Теперь, собственно, остается решить только одно: как перенаправлять входящие сообщения для определенного клиента на этот листенер.


Рассмотрим, во-первых, порядок работы listener'ов. Назовем их «фильтрующий» – в котором включены проверки header/body, и «простой» – в котором проверки header/body выключены.


Напомню постулат – cleanup невозможно обойти в принципе. И если письмо будет сначала проходить фильтрующий listener, то в нем правила header/body_checks сработают обязательно. А вот если сначала будет простой, тогда можно письма для всех клиентов пересылать на фильтрующий, а для спец-супер-дупер-без-проверок-клиента – просто отправлять далее в очередь (без фильтрации, она же отключена в простом).


Во-вторых, надо выбрать способ перенаправления. В postfix'е их несколько, но, например, если использовать перенаправление через таблицу транспортов (transport_maps = ....), то эта таблица будет работать в обоих listener'ах сразу, а это приведет к зацикливанию фильтрующего. Чем же еще можно манипулировать? Да теми же фильтрующими правилами, относящимися к проверке, скажем, реципиентов.


Итак, скелет рабочей схемы:


Код:
1) master.cf:


2) main.cf:


3) vip_client_checks:


ВАЖНО! Проверку regexp:<path_to_config_dir>/vip_client_checks нужно разместить так, чтобы через нее проходили все реципиенты Вашего домена.


На этом все.


P.S. Работает, проверено, postfix v2.2.5.


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]