LINUX.ORG.RU

exim ratelimit

 ,


0

0

Сервер хостинга с ISPManager, установлен exim 4.8. Настроен ratelimit писем/час, если сам отправляю с помощью php mail(mail / exec / system), то ограничение работает и в логи пишется rate overlimit. Но некоторые пользователи шлют письма в огромных количествах и эти лимиты не работают. Пробовал добавлять в /etc/exim/ratelimits конкретного сендера (спамера) в виде: user : limit , userdomain : limit , user@userdomain : limit (указываю конкретный ящик с которого летит спам), ни один из вариантов не ограничивает отправку.

в экзим письма приходят так: 1YlHA7-0006Zi-R8 <= <имя_нашего_спамера>@gmail.com U=p20580 P=local cwd=/var/spool/exim 3 args: /usr/sbin/exim -Mc 1YlHA7-0006Zi-R8 1YlHA7-0006Zi-R8 => botl1960@rambler.ru R=dnslookup T=remote_smtp

p20580 - это имя пользователя из /etc/passwd

был вариант, что рейтлимит не распространяется на non_smtp трафик, но в exim.conf правила есть

подскажите плз куда копать чтобы заставить работать рейтлимит для всех

Ответ на: комментарий от mky
acl_not_smtp = acl_check_not_smtp
        acl_check_not_smtp:
                # check ratelimits by local user
                warn    set     acl_c9  = $sender_ident
                                condition       = ${if match_local_part{$sender_ident}{lsearch;/etc/exim/ratelimits} {yes}{no}}
                warn    set acl_c9      = $sender_address_local_part
                                condition       = ${if match_local_part{$sender_address_local_part}{lsearch;/etc/exim/ratelimits} {yes}{no}}
                deny    set acl_c8      = ${lookup{$acl_c9}lsearch*{/etc/exim/ratelimits}}
                                ratelimit       = $acl_c8 / 1h / strict / $acl_c9
                                message         = Sender rate overlimit - $sender_rate / $sender_rate_period / $acl_c9
                                condition       = ${if and{{!eq{$acl_c9}{}}{>{$acl_c8}{0}}}{yes}{no}}
.ifdef DEFAULT_RATELIMIT
                # check ratelimits by default
                warn    set acl_c7      = $sender_ident
                warn    set acl_c7      = $sender_address_local_part
                                condition       = ${if eq{$acl_c7}{} {yes}{no}}
                deny    ratelimit       = DEFAULT_RATELIMIT / 1h / strict / $acl_c7
                                message         = Sender rate overlimit - $sender_rate / $sender_rate_period / $acl_c7
                                condition       = ${if and{{!eq{$acl_c7}{}}{eq{$acl_c8}{}}}{yes}{no}}
.endif

                accept


xfiles ()
Ответ на: комментарий от xfiles

Для меня эти правила выглядят мудрёно. Я бы попробовал переставить местами ″set″ и ″condition″ у второго warn:

warn  condition = ${if match_local_part{$sender_address_local_part}{lsearch;/etc/exim/ratelimits}{yes}{no}}
       set acl_c9 = $sender_address_local_part

И в файле ″/etc/exim/ratelimits″ записать:

p20580@ : 100 

mky ★★★★★ ()
Ответ на: комментарий от mky

Перестановка строк помогла! Не вижу логики, но работает, спасибо :) Формат строки в файле ratelimits не менял В логах теперь то что нужно

rejected by non-SMTP ACL: Sender rate overlimit - 25.9 / 1h / p20622

xfiles ()
Ответ на: комментарий от xfiles

Я сам с этими exim'овскими ACL'ами особо не дружу, но, вроде как он их выполняет по порядку, пока не будет очевидно, что дальше выполнять не нужно. В данном случае, ″warn″ содержал две строки — ″set″ и ″condition″. Сначала выполнялся ″set″ и затирал предыдущее значение ″acl_c9″, а потом уже проверялось условие ″condition = ${if match_local_part{″.

Возможно, что для ″acl_not_smtp″ вобще не нужно искать по ″sender_address_local_part″, я не уверен, всегда ли определён ″sender_address″ для случая ″not_smtp″.

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.