dnl dnl Использование ratelimit'ов dnl dnl NO - не использовать ratelimit'ы dnl HOST - использовать ratelimit'ы по хостам отправителей dnl AUTH - использовать ratelimit'ы по учетным записям аутентифицировавшихся отправителей dnl MAIL - использовать ratelimit'ы по адресам отправителей dnl RCPT - использовать ratelimit'ы по адресам получателей dnl DEBUG - выводить в файл протокола результаты расчет ratelimit'ов вне зависимости от их превышения dnl define(`confRATELIMIT', `NO')dnl dnl возможно одновременное использование нескольких значений dnl dnl настройки ratelimit'ов по хостам отправителей указываются в файле ratelimit-host dnl настройки ratelimit'ов по учетным записям аутентифицировавшихся отправителей указываются в файле ratelimit-auth dnl настройки ratelimit'ов по адресам отправителей указываются в файле ratelimit-mail dnl настройки ratelimit'ов по адресам получателей указываются в файле ratelimit-rcpt dnl dnl во всех файлах настроек ratelimit'ов данные указываются однотипно в виде: dnl dnl аргумент : лимит : действие : сообщение dnl dnl где: dnl аргумент - это адрес хоста отправителя в случае ratelimit-host, dnl SMTP логин в случае ratelimit-auth, адреса отправителя dnl и получателя в случае ratelimit-mail и ratelimit-rcpt. dnl лимит - ограничение в виде "количество / время" dnl действие - действие, применяемое к письму (может отсутствовать) dnl сообщение - сообщение SMTP клиенту dnl dnl адреса хостов можно задавать в виде IP адресов, номеров сетей, имен dnl хостов, в том числе указанных по маске или в виде регулярного dnl выражения. dnl dnl SMTP логины и адреса отправителей и получателей можно указывать в dnl виде полных адресов, масок или регулярных выражений. dnl dnl лимит указывается в виде "количество сообщений / период времени". dnl dnl возможные действия: dnl ok - исключение из проверки dnl warn - вывод предупреждения в файл протокола и добавление в письмо поля заголовка dnl reject - отказ в приеме сообщения dnl deny - синоним для reject dnl defer - возврат временной ошибки dnl greylist=X - добавление X баллов к счетчику опционального грейлистинга dnl reject=X - добавление X баллов к счетчику опционального reject'а dnl delay=zz - задержка на zz секунд перед продолжением обработки сообщения dnl pause=zz - синоним delay=zz dnl dnl по умолчанию применяется действие defer. dnl dnl при описании действий можно использовать вычисляемые выражения. dnl пример: dnl * : 20 / 10m : defer delay=${eval:${sg{$sender_rate}{\N[\.].*$\N}{}} - $sender_rate_limit} : Try again later dnl dnl в качестве сообщения SMTP клиенту указывается не столько само dnl сообщение, сколько его уточнение dnl в уточнии сообщения SMTP клиенту можно использовать вычислямые dnl выражения, например в нем можно использовать переменные $sender_rate, dnl $sender_rate_limit и $sender_rate_period dnl dnl по умолчанию SMTP клиенту возвращаются следующие сообщения: dnl Sender host rate exceeds limit dnl Sender rate exceeds limit dnl Recipient rate exceeds limit dnl dnl далее следует уточнение сообщения. если оно отсутсвует, то dnl используется фраза "Try again later" dnl ifdef(`confRATELIMIT', `ifelse(confRATELIMIT, `NO', `', `dnl ifelse(SECTION, `ACL_CHECK_CONNECT', `dnl ifelse_strstr(confRATELIMIT, `HOST', ` # Использование ratelimit-ов по адресам хостов отправителей warn set acl_m_normalize_action_result = set acl_m_rate_host = ${sg{${lookup{$sender_host_address}wildlsearch{CONFDIR/ratelimit-host}{$value}{}}}{\N^\s+\N}{}} set acl_m_rate_host = ${if match{$acl_m_rate_host}{\N(?i)^\s*(no|skip)\N}{}{$acl_m_rate_host}} set acl_m_rate_host = ${sg{$acl_m_rate_host}{eval:}{eval╕}} warn condition = ${if eq{$acl_m_rate_host}{}{no}{yes}} set acl_m_limit = ${extract{1}{:}{$acl_m_rate_host}} set acl_m_limit = ${sg{$acl_m_limit}{eval╕}{eval:}} set acl_m_limit = ${if match{$acl_m_limit}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_limit}}{$acl_m_limit}} ratelimit = $acl_m_limit / per_conn / strict set acl_m_action = ${extract{2}{:}{$acl_m_rate_host}} set acl_m_action = ${sg{$acl_m_action}{eval╕}{eval:}} set acl_m_action = ${if match{$acl_m_action}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_action}}{$acl_m_action}} acl = acl_normalize_action "$acl_m_action" set acl_m_normalize_action_result = ${if match{$acl_m_normalize_action_result}{\N^\s*$\N}{defer}{$acl_m_normalize_action_result}} set acl_m_normalize_action_result = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} set acl_m_log_message = Sender host rate $sender_rate exceeds limit $sender_rate_limit messages per $sender_rate_period set acl_m_smtp_message = ${extract{3}{:}{$acl_m_rate_host}} set acl_m_smtp_message = Sender host rate exceeds limit.${if eq{$acl_m_smtp_message}{}{Try again later}{$acl_m_smtp_message}} set acl_m_smtp_message = ${if match{$acl_m_smtp_message}{\N(^\$|[^\\]\$)\N}{${expand:$acl_m_smtp_message}}{$acl_m_smtp_message}} ifelse_strstr(confRATELIMIT, `DEBUG', ` warn condition = ${if eq{$acl_m_rate_host}{}{no}{yes}} log_message = Sender host ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] rate $sender_rate / $sender_rate_period ') dnl ifelse_strstr(confRATELIMIT, `DEBUG', `') FEATURE(`ratelimit-actions')dnl ') dnl ifelse_strstr(confRATELIMIT, `HOST', `') ') dnl ifelse(SECTION, `ACL_CHECK_CONNECT', `') ifelse(SECTION, `ACL_CHECK_MAIL', `dnl ifelse_strstr(confRATELIMIT, `AUTH', ` # Использование ratelimit-ов по учетным записям отправителей warn set acl_m_normalize_action_result = authenticated = * set acl_m_rate_auth = ${sg{${lookup{$sender_address}wildlsearch{CONFDIR/ratelimit-auth}{$value}{}}}{\N^\s+\N}{}} set acl_m_rate_auth = ${if match{$acl_m_rate_auth}{\N(?i)^\s*(no|skip)\N}{}{$acl_m_rate_auth}} set acl_m_rate_auth = ${sg{$acl_m_rate_auth}{eval:}{eval╕}} warn condition = ${if eq{$acl_m_rate_auth}{}{no}{yes}} set acl_m_limit = ${extract{1}{:}{$acl_m_rate_auth}} set acl_m_limit = ${sg{$acl_m_limit}{eval╕}{eval:}} set acl_m_limit = ${if match{$acl_m_limit}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_limit}}{$acl_m_limit}} ratelimit = $acl_m_limit / per_mail / strict / $authenticated_id set acl_m_action = ${extract{2}{:}{$acl_m_rate_auth}} set acl_m_action = ${sg{$acl_m_action}{eval╕}{eval:}} set acl_m_action = ${if match{$acl_m_action}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_action}}{$acl_m_action}} acl = acl_normalize_action "$acl_m_action" set acl_m_normalize_action_result = ${if match{$acl_m_normalize_action_result}{\N^\s*$\N}{defer}{$acl_m_normalize_action_result}} set acl_m_normalize_action_result = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} set acl_m_log_message = Authenticated sender rate $sender_rate exceeds limit $sender_rate_limit messages per $sender_rate_period set acl_m_smtp_message = ${extract{3}{:}{$acl_m_rate_auth}} set acl_m_smtp_message = Sender rate exceeds limit.${if eq{$acl_m_smtp_message}{}{Try again later}{$acl_m_smtp_message}} set acl_m_smtp_message = ${if match{$acl_m_smtp_message}{\N(^\$|[^\\]\$)\N}{${expand:$acl_m_smtp_message}}{$acl_m_smtp_message}} ifelse_strstr(confRATELIMIT, `DEBUG', ` warn condition = ${if eq{$acl_m_rate_auth}{}{no}{yes}} log_message = Authenticated sender $authenticated_id rate $sender_rate / $sender_rate_period ') dnl ifelse_strstr(confRATELIMIT, `DEBUG', `') FEATURE(`ratelimit-actions')dnl ') dnl ifelse_strstr(confRATELIMIT, `AUTH', `') ifelse_strstr(confRATELIMIT, `MAIL', ` # Использование ratelimit-ов по адресам отправителей warn set acl_m_normalize_action_result = set acl_m_rate_mail = ${sg{${lookup{$sender_address}wildlsearch{CONFDIR/ratelimit-mail}{$value}{}}}{\N^\s+\N}{}} set acl_m_rate_mail = ${if match{$acl_m_rate_mail}{\N(?i)^\s*(no|skip)\N}{}{$acl_m_rate_mail}} set acl_m_rate_mail = ${sg{$acl_m_rate_mail}{eval:}{eval╕}} warn condition = ${if eq{$acl_m_rate_mail}{}{no}{yes}} set acl_m_limit = ${extract{1}{:}{$acl_m_rate_mail}} set acl_m_limit = ${sg{$acl_m_limit}{eval╕}{eval:}} set acl_m_limit = ${if match{$acl_m_limit}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_limit}}{$acl_m_limit}} ratelimit = $acl_m_limit / per_mail / strict set acl_m_action = ${extract{2}{:}{$acl_m_rate_mail}} set acl_m_action = ${sg{$acl_m_action}{eval╕}{eval:}} set acl_m_action = ${if match{$acl_m_action}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_action}}{$acl_m_action}} acl = acl_normalize_action "$acl_m_action" set acl_m_normalize_action_result = ${if match{$acl_m_normalize_action_result}{\N^\s*$\N}{defer}{$acl_m_normalize_action_result}} set acl_m_normalize_action_result = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} set acl_m_log_message = Sender rate $sender_rate exceeds limit $sender_rate_limit messages per $sender_rate_period set acl_m_smtp_message = ${extract{3}{:}{$acl_m_rate_mail}} set acl_m_smtp_message = Sender rate exceeds limit.${if eq{$acl_m_smtp_message}{}{Try again later}{$acl_m_smtp_message}} set acl_m_smtp_message = ${if match{$acl_m_smtp_message}{\N(^\$|[^\\]\$)\N}{${expand:$acl_m_smtp_message}}{$acl_m_smtp_message}} ifelse_strstr(confRATELIMIT, `DEBUG', ` warn condition = ${if eq{$acl_m_rate_mail}{}{no}{yes}} log_message = Sender ${if eq {$sender_address}{}{<>}{$sender_address}} rate $sender_rate / $sender_rate_period ') dnl ifelse_strstr(confRATELIMIT, `DEBUG', `') FEATURE(`ratelimit-actions')dnl ') dnl ifelse_strstr(confRATELIMIT, `MAIL', `') ') dnl ifelse(SECTION, `ACL_CHECK_MAIL', `') ifelse(SECTION, `ACL_CHECK_RCPT', `dnl ifelse_strstr(confRATELIMIT, `RCPT', ` # Использование ratelimit-ов по адресам получателей warn set acl_m_normalize_action_result = set acl_m_rate_rcpt = ${sg{${lookup{$local_part@$domain}wildlsearch{CONFDIR/ratelimit-rcpt}{$value}{}}}{\N^\s+\N}{}} set acl_m_rate_rcpt = ${if match{$acl_m_rate_rcpt}{\N(?i)^\s*(no|skip)\N}{}{$acl_m_rate_rcpt}} set acl_m_rate_rcpt = ${sg{$acl_m_rate_rcpt}{eval:}{eval╕}} warn condition = ${if eq{$acl_m_rate_rcpt}{}{no}{yes}} set acl_m_limit = ${extract{1}{:}{$acl_m_rate_rcpt}} set acl_m_limit = ${sg{$acl_m_limit}{eval╕}{eval:}} set acl_m_limit = ${if match{$acl_m_limit}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_limit}}{$acl_m_limit}} ratelimit = $acl_m_limit / per_rcpt / strict set acl_m_action = ${extract{2}{:}{$acl_m_rate_rcpt}} set acl_m_action = ${sg{$acl_m_action}{eval╕}{eval:}} set acl_m_action = ${if match{$acl_m_action}{\N.+(lookup |[\{\}])\N}{${expand:$acl_m_action}}{$acl_m_action}} acl = acl_normalize_action "$acl_m_action" set acl_m_normalize_action_result = ${if match{$acl_m_normalize_action_result}{\N^\s*$\N}{defer}{$acl_m_normalize_action_result}} set acl_m_normalize_action_result = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} set acl_m_log_message = Recipient rate $sender_rate exceeds limit $sender_rate_limit messages per $sender_rate_period set acl_m_smtp_message = ${extract{3}{:}{$acl_m_rate_rcpt}} set acl_m_smtp_message = Recipient rate exceeds limit.${if eq{$acl_m_smtp_message}{}{Try again later}{$acl_m_smtp_message}} set acl_m_smtp_message = ${if match{$acl_m_smtp_message}{\N(^\$|[^\\]\$)\N}{${expand:$acl_m_smtp_message}}{$acl_m_smtp_message}} ifelse_strstr(confRATELIMIT, `DEBUG', ` warn condition = ${if eq{$acl_m_rate_rcpt}{}{no}{yes}} log_message = Recipient $local_part@$domain rate $sender_rate / $sender_rate_period ') dnl ifelse_strstr(confRATELIMIT, `DEBUG', `') FEATURE(`ratelimit-actions')dnl ') dnl ifelse_strstr(confRATELIMIT, `RCPT', `') ') dnl ifelse(SECTION, `ACL_CHECK_RCPT', `') ')') dnl ifdef(`confRATELIMIT', `ifelse(confRATELIMIT, `NO', `', `')')