dnl dnl использование серых списков с кешем в DBM dnl dnl путь к файлу DBM кеша dnl define(`confGREYLIST_DBM_CACHE', `/var/spool/exim/db/greylist.db')dnl dnl время блокировки записи в "сером списке" в минутах dnl define(`confGREYLIST_DBM_BLOCKED', `55')dnl dnl минимальное время жизни записи в "сером списке" в минутах dnl define(`confGREYLIST_DBM_RECORD_EXIRE_MIN', `300')dnl dnl время жизни записи в "сером списке" в днях dnl define(`confGREYLIST_DBM_RECORD_EXIRE', `36')dnl dnl сообщение, возвращаемое клиенту при задержке почтового сообщения dnl define(`confGREYLIST_MESSAGE', `Message delayed as part of spam avoidance measure')dnl dnl define(`confGREYLIST_MESSAGE', `System too busy. Please try again later')dnl dnl define(`confGREYLIST_MESSAGE', `Temporary local problem - please try later')dnl dnl домены получателей, проверяемые по серым спискам, перечисляются в domains-greylist dnl хосты и сети, исключаемые из проверки по серым спискам, перечисляются в skip_greylist_relays dnl списки отправителей, исключаемых из проверки по серым спискам, перечисляются в файле skip_greylist_senders dnl список указывается в виде: dnl domain : addr1 : addr2 : addr3 dnl пример: dnl zuper.domain.com : user : info : admin dnl списки отправителей, исключаемых из проверки по серым спискам, перечисляются в файле skip_greylist_recipients dnl список указывается в виде: dnl domain : addr1 : addr2 : addr3 dnl пример: dnl zuper.domain.com : user : info : admin dnl триплеты адрес_рилея/адрес_отправителя/адрес_получателя, исключаемые из проверки по серым спискам, dnl перечисляются в файле skip_greylist в виде: dnl A.B.C.D|sender@domain1.tld|recipient@domain2.tld dnl пример: dnl 113.130.15.19|corvax@test.org.ua|test@local.domain dnl ifdef(`confGREYLIST_MESSAGE', `dnl ifelse(len(X`'confGREYLIST_MESSAGE), `1', `dnl define(`confGREYLIST_MESSAGE', `Temporary local problem - please try later')dnl ')', `dnl define(`confGREYLIST_MESSAGE', `Temporary local problem - please try later')dnl ') ifelse(SECTION, `MAIN', `dnl dnl domainlist greylist_domains = lsearch;CONFDIR/domains-greylist hostlist skip_greylist_hosts = CONFDIR/skip_greylist_relays dnl ') dnl ifelse(SECTION, `ACL_CHECK_RCPT', `dnl # Использование серых списков с кешем в DBM # определяем необходимость использования "серого списка" warn set acl_m0 = skip domains = +greylist_domains : +local_domains ! authenticated = * ! hosts = +skip_greylist_hosts : +relay_from_hosts condition = ${if eq{$local_part}{postmaster}{no}{yes}} condition = ${if eq{$local_part}{abuse}{no}{yes}} condition = ${if eq{$sender_address_local_part}{}{no}{yes}} ifelse(confGREYLIST_EXCLUDE_POSTMASTER, `NO', `', `dnl condition = ${if eq{$sender_address_local_part}{postmaster}{no}{yes}} ')dnl condition = ${lookup{$sender_host_address|$sender_address|$local_part@$domain}\ lsearch{CONFDIR/skip_greylist}{no}{yes}} ! recipients = @@lsearch;CONFDIR/skip_greylist_recipients ! senders = @@lsearch;CONFDIR/skip_greylist_senders set acl_m0 = no_skip # если использовать серый список необходимо, # ищем запись а рилее/отправителе/получателе в "сером списке" warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} set acl_m0 = ${lookup{$sender_host_address|$sender_address|$local_part@$domain}\ dbm{confGREYLIST_DBM_CACHE}} ifdef(`confGREYLIST_DBM_BLOCKED', `ifelse(eval(confGREYLIST_DBM_BLOCKED > 0), `1', `dnl # время блокировки записи в "сером списке" больше нуля # если запись в "сером списке не найдена, создаем ее defer condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch+confGREYLIST_DBM_BLOCKED*60} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена, но истек record_expires defer condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{${extract{record_expires}{$acl_m0}}}{$tod_epoch}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch+confGREYLIST_DBM_BLOCKED*60} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена, но не истек block_expires defer condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if >{${extract{block_expires}{$acl_m0}}}{$tod_epoch}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${extract{record_expires}{$acl_m0}} \ blocked_count=${eval:${extract{blocked_count}{$acl_m0}}+1} \ passed_count=${extract{passed_count}{$acl_m0}} \ aborted_count=${extract{aborted_count}{$acl_m0}} \ origin_type=${extract{origin_type}{$acl_m0}} \ create_time=${extract{create_time}{$acl_m0}} \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена, block_expires истек, а record_expires не истек warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE*24*60*60} \ blocked_count=${extract{blocked_count}{$acl_m0}} \ passed_count=${eval:${extract{passed_count}{$acl_m0}}+1} \ aborted_count=${extract{aborted_count}{$acl_m0}} \ origin_type=${extract{origin_type}{$acl_m0}} \ create_time=${extract{create_time}{$acl_m0}} \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} ')') dnl ifdef(`confGREYLIST_DBM_BLOCKED', `ifelse(eval(confGREYLIST_DBM_BLOCKED == 0), `1', `dnl # время блокировки записи в "сером списке" равно нулю # (принимаем все сообщения, производится лишь обучение кеша) # если запись в "сером списке не найдена, создаем ее warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} # если запись в "сером списке найдена, но истек record_expires warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{${extract{record_expires}{$acl_m0}}}{$tod_epoch}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} # если запись в "сером списке найдена и не истек record_expires warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE*24*60*60} \ blocked_count=${extract{blocked_count}{$acl_m0}} \ passed_count=${eval:${extract{passed_count}{$acl_m0}}+1} \ aborted_count=${extract{aborted_count}{$acl_m0}} \ origin_type=${extract{origin_type}{$acl_m0}} \ create_time=${extract{create_time}{$acl_m0}} \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} ')') dnl ifdef(`confGREYLIST_DBM_BLOCKED', `ifelse(eval(confGREYLIST_DBM_BLOCKED < 0), `1', `dnl # время блокировки записи в "сером списке" меньше нуля # (первое сообщение задерживается, остальные пропускаются) # если запись в "сером списке не найдена, создаем ее defer condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена, но истек record_expires defer condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if <{${extract{record_expires}{$acl_m0}}}{$tod_epoch}{yes}{no}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${eval:$tod_epoch} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE_MIN*60} \ blocked_count=1 \ passed_count=0 \ aborted_count=0 \ origin_type=AUTO \ create_time=$tod_epoch \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} message = confGREYLIST_MESSAGE log_message = message blocked by greylist: $sender_host_address; $sender_address; $local_part@$domain # если запись в "сером списке найдена и record_expires не истек warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{no}{yes}} condition = ${if eq{\ ${perl{dbm_save}{confGREYLIST_DBM_CACHE}\ {$sender_host_address|$sender_address|$local_part@$domain}\ {\ block_expires=${extract{block_expires}{$acl_m0}} \ record_expires=${eval:$tod_epoch+confGREYLIST_DBM_RECORD_EXIRE*24*60*60} \ blocked_count=${extract{blocked_count}{$acl_m0}} \ passed_count=${eval:${extract{passed_count}{$acl_m0}}+1} \ aborted_count=${extract{aborted_count}{$acl_m0}} \ origin_type=${extract{origin_type}{$acl_m0}} \ create_time=${extract{create_time}{$acl_m0}} \ last_update=$tod_epoch \ }}\ }{}{yes}{yes}} ')') ')