URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 95249
[ Назад ]

Исходное сообщение
"правила Sendmail"

Отправлено andlis , 03-Дек-13 13:32 
Не выходит что-то каменный цветок... Посмотрите, плиз - где косячу?

Задача - взять почту, соответствующую какому-то правилу и отправить ее пользователю user1.
Вообще-то задача обычная: проверить релэй на соответствие шаблону и если соответствует - перенаправить пользователю, коллектирующему спам. Но что-то все как-то не работало.. Правила с $#error выполняются, а с $#local - нет.. Решил поколупаться в простейшем случае, поэтому прошу не удивляться бессмысленности примера ниже. Это пример, чтобы понять, что не работает.

sendmail.mc:

......
LOCAL_CONFIG
Ksyslog syslog
Kstorage macro

KSPAM6         regex -a@MATCH user2.*

LOCAL_RULE_0

SLocal_check_rcpt

R$*<---><------><------>$: $(SPAM6 $1 $)
R@MATCH><------><------>$: $(syslog "**user2**" $)
R@MATCH><------><------>$# local $: user1

ни в таком виде, ни в таком

R$*<---><------><------>$: $(SPAM6 $1 $)
R@MATCH><------><------>$# local $: user1

письма отправленные user2 к user1 не приходят. Все идет к user2. Лог пишется **user2**.
что не так? голову уже сломал ((


Содержание

Сообщения в этом обсуждении
"правила Sendmail"
Отправлено Аноним , 04-Дек-13 12:28 
Как бы
sendmail -bt -C <your_config> в руки и глядеть.

"правила Sendmail"
Отправлено andlis , 04-Дек-13 12:40 
> Как бы
> sendmail -bt -C <your_config> в руки и глядеть.

Хм. А можно поподробнее? Естественно, я сделал sendmail -bt и проверил отрабатываются ли правила. Все отрабатывается. Не работает только строчка $#local - ее как будто нет.. И в логах при любом уровне логирования про нее молчок.
Или вы про другое?


"правила Sendmail"
Отправлено andlis , 04-Дек-13 13:00 
> Как бы
> sendmail -bt -C <your_config> в руки и глядеть.

[root@mydomain tmp]# sendmail -bt -C sendmail.cf

WARNING: Ruleset Local_check_relay has multiple definitions
WARNING: Ruleset Local_check_rcpt has multiple definitions
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> Local_check_rcpt user2@mydomain

Local_check_rcpt   input: user2 @ mydomain
Local_check_rcpt returns: $# local $: user1

то есть вроде все как надо.. Но действия нет.


"правила Sendmail"
Отправлено Аноним , 04-Дек-13 13:36 
Предупреждения ни на какие мысли не наводят ?
Загляните в полученный .cf файл.

"правила Sendmail"
Отправлено andlis , 04-Дек-13 13:47 
> Предупреждения ни на какие мысли не наводят ?
> Загляните в полученный .cf файл.

Хм. Давайте договоримся так: да, я тупой. Можно мне объяснить где моя тупость?
Лично меня предупреждения наводят на мысли о том, что я использую эти 2 правила для своих фильтров. Естественно они там 2 раза (в оригинальном месте и в моих правилах), а что может быть по-другому?
А что такое "полученный" файл? В результате чего он получен?
Вы понимаете какая штука, если бы я мог догадаться без дополнительных вводных, я бы догадался до того как спросил... ((


"правила Sendmail"
Отправлено Аноним , 04-Дек-13 13:55 
Если Вы приводите .mc файл, то sendmail работает с .cf файлом, полученным из .mc.
Sendmail'у Вы, я надеюсь, подсовываете новый, "полученный" .cf файл.
Вот загляните в оригинальный .cf файл, посмотрите как там оформлены прототипы локальных правил.
Потом взгляните в _полученный_Вами_ .cf файл.

"правила Sendmail"
Отправлено andlis , 04-Дек-13 14:00 
> Если Вы приводите .mc файл, то sendmail работает с .cf файлом, полученным
> из .mc.
> Sendmail'у Вы, я надеюсь, подсовываете новый, "полученный" .cf файл.
> Вот загляните в оригинальный .cf файл, посмотрите как там оформлены прототипы локальных
> правил.
> Потом взгляните в _полученный_Вами_ .cf файл.

Я не понял, совет - взглянуть в полученный мной .cf файл? Хорошо, взглянул. Что дальше?


"правила Sendmail"
Отправлено gruzzy , 05-Дек-13 17:45 
попробуй так
R$*                     $: $(SPAM6 $1 $)
R$* . @MATCH            $# local $: user1

"правила Sendmail"
Отправлено andlis , 05-Дек-13 17:57 
> попробуй так
> R$*            
>          $: $(SPAM6
> $1 $)
> R$* . @MATCH          
>   $# local $: user1

Попробовал - пришло опять юзеру 2.
-bt
WARNING: Ruleset Local_check_relay has multiple definitions
WARNING: Ruleset Local_check_rcpt has multiple definitions
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> Local_check_rcpt user2@mydomain

Local_check_rcpt   input: user2 @ mydomain
Local_check_rcpt returns: @ MATCH

довольно странное, кстати, вернул..
Мне все же кажется, что проблема именно в части $# local $: user1
ведь все остальное (если написать на этом же месте) прекрасно исполняется... То ли при каком-то апгрейде сендмейла запретили по умолчанию пересылку в нулевом правиле.. Но ничего подобного в инете не могу найти.. везде и у всех вот так же ((


"правила Sendmail"
Отправлено gruzzy , 05-Дек-13 18:03 
для начала таки пофикси
WARNING: Ruleset Local_check_relay has multiple definitions
WARNING: Ruleset Local_check_rcpt has multiple definitions

посмотри файл .mc, нет ли там дубля Local_check_rcpt
если всё ОК
make all install

и снова -bt прогони


"правила Sendmail"
Отправлено gruzzy , 05-Дек-13 18:12 
ну и для очистки совести
KSPAM6         regex -aMATCH user2.*


SLocal_check_rcpt

R$*         $: $(SPAM6 $1 $)
R$* . MATCH $: $(syslog "**user2**" $)
R$* . MATCH $# local $: user1


"правила Sendmail"
Отправлено andlis , 05-Дек-13 18:21 
> ну и для очистки совести
> KSPAM6         regex -aMATCH user2.*
> SLocal_check_rcpt
> R$*         $: $(SPAM6 $1 $)
> R$* . MATCH $: $(syslog "**user2**" $)
> R$* . MATCH $# local $: user1

не - так не работает. то же самое выдает.


"правила Sendmail"
Отправлено andlis , 05-Дек-13 18:16 
> для начала таки пофикси
> WARNING: Ruleset Local_check_relay has multiple definitions
> WARNING: Ruleset Local_check_rcpt has multiple definitions
> посмотри файл .mc, нет ли там дубля Local_check_rcpt
> если всё ОК
> make all install
> и снова -bt прогони

нет, конечно там нет дублей. ИМХО, если бы это вызывало ошибку - что-то не работало бы. Однако все работает как часы - сервер пропускает порядка 6000 писем в день. Хоть что-то бы сбилось.. Не работает только перенаправление..
Варнинг появляется из-за моего локального правила. Но ведь для того и есть локальные правила?
Пересобирать не хотелось бы - я из rpm собирал. То есть я бы и пересобрал, нет проблем, но я нигде в документации не могу найти, чтобы было что-то, что запрещает оное перенаправление! Как бэ нет смысла пересобирать..


"правила Sendmail"
Отправлено andlis , 05-Дек-13 18:28 
проверил на допотопном серваке, где сендмэйл 8 лет успешно проработал вместе с моими правилами (правила почти те же, только вместо $#local было $#error. Там выдает в точности такое же предупреждение.


"правила Sendmail"
Отправлено gruzzy , 06-Дек-13 01:33 
убери LOCAL_RULE_0

"правила Sendmail"
Отправлено andlis , 06-Дек-13 12:18 
> убери LOCAL_RULE_0

Нет, это конечно нельзя убрать ) Перенаправление почты разрешено только в этой цепочке правил.
Кажется пришло озарение! В ней нельзя использовать правила из других цепочек! Получится - отпишусь. Правда непонятно, почему лог пишется, ну да это нюансы..


"правила Sendmail"
Отправлено gruzzy , 06-Дек-13 15:59 
ладно, тада хотябы замени  LOCAL_RULE_0 на LOCAL_RULESETS

по сути у тебя K-map возвращает некорректное значение
должен возвращать INPUT . @ MATCH


"правила Sendmail"
Отправлено gruzzy , 06-Дек-13 16:07 
а собака окопалась тут:)
SLocal_check_rcpt

R$*<---><------><------>$: $(SPAM6 $1 $)
R@MATCH><------><------>$: $(syslog "**user2**" $)
R@MATCH><------><------>$# local $: user1

попробуй так
KSPAM6         regex -aMATCH user2.*

SLocal_check_rcpt
R$*                     $: $(SPAM6 $1 $)
R$*                     $: $(syslog "**user2**" $) $1
R$* . @ MATCH           $# local $: user1


"правила Sendmail"
Отправлено gruzzy , 06-Дек-13 16:08 
KSPAM6         regex -aMATCH user2.*

SLocal_check_rcpt
R$*                     $: $(SPAM6 $1 $)
R$*                     $: $(syslog "**user2**" $) $1
R$* . MATCH           $# local $: user1


"правила Sendmail"
Отправлено andlis , 06-Дек-13 16:08 
> ладно, тада хотябы замени  LOCAL_RULE_0 на LOCAL_RULESETS
> по сути у тебя K-map возвращает некорректное значение
> должен возвращать INPUT . @ MATCH

почему? map как раз возвращает MATCH.
Да я вообще все неправильно сделал (( В LOCAL_RULE_0 нельзя обращаться к этим правилам. Удивительно, что я не могу найти готового решения в сети. Исходная идея была банальная. Фильтр по имени релея - и дальше все письма, которые мне не нравятся (типа спам) перенаправляются специальному пользователю. Вот не отлуп (как у меня 100 лет работало) а перенаправление. Куда распространеннее задача? Вот если в лоб, она описана здесь http://linux.ufaras.ru/mailroute.html#2.1 . Но там такая путаница! Сижу отлаживаю (( Но чувствую, придется все равно с нуля переписывать, главное чтобы идея была рабочая..


"правила Sendmail"
Отправлено gruzzy , 06-Дек-13 16:24 
OK

просто сделай так вот, просто ради интереса и покажи вывод sendmail -bt -C sendmail.cf
LOCAL_CONFIG
Ksyslog syslog
Kstorage macro

KSPAM6         regex -aMATCH user2.*

LOCAL_RULE_0

SLocal_check_rcpt

R$*                    $: $(SPAM6 $1 $)
R$* . MATCH            $: $(syslog "**user2**" $) $1 . MATCH2
R$* . MATCH2           $# local $: user1

ЗЫ - не забывай делать make all install


"правила Sendmail"
Отправлено andlis , 06-Дек-13 16:54 
> OK
> просто сделай так вот, просто ради интереса и покажи вывод sendmail -bt

[root@xx tmp]# sendmail -bt -C sendmail.cf
WARNING: Ruleset Local_check_rcpt has multiple definitions
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /map SPAM6 user2@mydomain

map_lookup: SPAM6 (user2@mydomain) returns MATCH (0)

Перенаправление не работает. Да в целом и не может..


"правила Sendmail"
Отправлено gruzzy , 06-Дек-13 17:08 
и еще разок

LOCAL_CONFIG
Ksyslog syslog
Kstorage macro

KSPAM6         regex -a.MATCH user2+<@domain>

LOCAL_RULE_0

SLocal_check_rcpt

R$*                    $: $(SPAM6 $1 $)
R$* . MATCH            $: $(syslog "**user2**" $) $1 . MATCH2
R$* . MATCH2           $# local $: user1

ЗЫ - не забывай делать make all install
ЗЫ2 - скорее всего нужно регексы штудировать


"правила Sendmail"
Отправлено andlis , 10-Дек-13 18:28 
Как обещал, отписываюсь о результате. Ничего не получалось у меня, потому что в LOCAL_RULE_0 нельзя задавать правила (типа Local_check_relay). Как только чтение доходит до чего-то вроде SLocal_check_relay, дальнейшее воспринимается, как описание правила, а не часть LOCAL_RULE_0. То есть строки типа $#local $:user там уже не работают. А вот то, что одно и то же правило описывается в разных местах это нормально. Судя по документации, такие части правила просто последовательно добавляются друг к другу. Другой вопрос зачем так делать?
Ну и главное. Поскольку, я хотел сделать перенаправлялку для спама по шаблону релея, то я ее выкладываю. Вообще-то оригинал я взял тут: http://linux.ufaras.ru/mailroute.html#2.1 (за что автору большое спасибо), но две вещи изменил. В оригинале идет отладочная запись в лог, а у меня только по срабатыванию правила. И у меня письма, отправленные моими пользователями (определенными по smtp-авторизации), не проверяются (за идею и обсуждение спасибо DeadLoco и Medlar).

LOCAL_CONFIG

Ksyslog syslog
Kstorage macro

KSPAM1         regex -a@MATCH ([0-9]{1,3}[._x-]){3}[0-9]{1,3}
KSPAM2         regex -a@MATCH ([0-9]+[._x-]){2,}.*(\..*){2,}
KSPAM3         regex -a@MATCH [0-9a-f]{8,}(\..*){3,}
KSPAM4         regex -a@MATCH [0-9].*(dsl|dial|dynamic|static|ppp|pool|client|user|dhcp|gprs).*(\..*){2,}
KSPAM5         regex -a@MATCH (dsl|dial|dyn|static|ppp|pool|client|user|dhcp|gprs|ip|vpn|nat)[a-z_-]*[0-9]+.*(\..*){2,}
KSPAM6         regex -a@MATCH (mail.*\.com\.ua)

LOCAL_RULE_0

R$+<---><------><------><------>$: <$&{auth_authen}>AUTH $1
R<$+>AUTH$*<---><------><------>$: $2

R<>AUTH$*<-----><------><------>$: <$&f> $1
R<>$+<-><------><------><------>$: $1
R<$+>$+><------><------><------>$: $2 $| $>Parse11
R$+ $| OK<-----><------><------>$: $1
R$+ $| local $+><------><------>$# local $: $2

SParse11

R$*<---><------><------><------>$: <$&{client_name}>
R<><---><------><------><------>$@ OK
R<[192.168.1.$-]><-----><------>$@ OK
R<$+><-><------><------><------>$: $1

R$+<---><------><------><------>$: $(SPAM1 $1 $)
R@$+<--><------><------><------>$: $(syslog "Spam1 redirect: " $&{client_name} $) @$1
R@MATCH><------><------><------>$@ local user1

R$+<---><------><------><------>$: $(SPAM2 $1 $)
R@$+<--><------><------><------>$: $(syslog "Spam2 redirect: " $&{client_name} $) @$1
R@MATCH><------><------><------>$@ local user1

R$+<---><------><------><------>$: $(SPAM3 $1 $)
R@$+<--><------><------><------>$: $(syslog "Spam3 (IPV6) redirect: " $&{client_name} $) @$1
R@MATCH><------><------><------>$@ local user1

R$+<---><------><------><------>$: $(SPAM4 $1 $)
R@$+<--><------><------><------>$: $(syslog "Spam4 redirect: " $&{client_name} $) @$1
R@MATCH><------><------><------>$@ local user1

R$+<---><------><------><------>$: $(SPAM5 $1 $)
R@$+<--><------><------><------>$: $(syslog "Spam5 redirect: " $&{client_name} $) @$1
R@MATCH><------><------><------>$@ local user1

R$+<---><------><------><------>$: $(SPAM6 $1 $)
R@$+<--><------><------><------>$: $(syslog "Spam6 (known spammers) redirect: " $&{client_name} $) @$1
R@MATCH><------><------><------>$@ local user1

R$*<---><------><------><------>$@ OK