dnl dnl проверка рилея отправителя dnl dnl NO - не проводить проверку dnl REJECT - возврата по умолчанию клиенту кода 5xx dnl DEFER - возврата по умолчанию клиенту кода 4xx dnl WARN - вывода по умолчанию в лог файл предупреждения dnl QUARANTINE - принять письмо с сохранением в карантин без доставки получателям dnl PAUSE:XX - пауза XX секунд dnl GREYLIST:XX - добавить XX баллов к счетчику опционального greylisting'а dnl REJECT:XX - добавить XX баллов к счетчику опционального reject'а dnl define(`confCHECK_ACCESS_RELAY', `WARN')dnl dnl dnl действия WARN, PAUSE:XX, GREYLIST:XX, REJECT:XX можно указывать через пробел dnl dnl в файле access-relay-blacklist перечисляются A записи хостов и сети в виде CIDR dnl для хостов и сетей, перечисленных в файле access-relay-blacklist, применяется dnl действие, указанное в переменной confCHECK_ACCESS_RELAY dnl dnl в файле access-relay перечисляются A записи хостов, сети в виде CIDR, dnl PTR записи хостов, доменные зоны в виде wildcard или регулярных выражений dnl dnl в файле access-relay можно указать необходимое действие для данного dnl хоста в виде: dnl хост : действие : сообщение : сообщение 2 dnl dnl где dnl хост - A запись хоста, сеть в виде CIDR, PTR запись хоста или dnl доменная зона в виде wildcard или регулярного выражения dnl действие - действие, применяемое к письму dnl сообщение - ответ SMTP клиенту (может отсутствовать) dnl сообщение 2 - сообщение в файл протокола или в добавляемое поле dnl заголовка (может отсутствовать) dnl dnl возможные действия: dnl ok - исключение из проверки для указанного хоста dnl warn - вывод предупреждения в файл протокола и добавление в письмо поля заголовка dnl reject - отказ в приеме сообщения dnl deny - синоним для reject dnl defer - возврат временной ошибки dnl quarantine - принять письмо с сохранением в карантин без доставки получателям dnl greylist=X - добавление X баллов к счетчику опционального грейлистинга dnl reject=X - добавление X баллов к счетчику опционального reject'а dnl delay=zz - задержка на zz секунд перед продолжением обработки сообщения dnl pause=zz - синоним delay=zz dnl submit_mysql - занесение записи о хосте в базу MySQL (только в enterprise версии) dnl submit_sqlite - занесение записи о хосте в базу SQLite (только в enterprise версии) dnl submit_rbl - занесение записи о хосте в DNSBL (только в enterprise версии) dnl dnl ответ SMTP будет использован в случае указания reject/deny или defer в dnl качестве значения для action. если текст ответа не будет указан, будет dnl использован текст сообщения об ошибке по умолчанию dnl dnl если параметр action не будет указан, будет использоваться действие, указанное dnl в переменной confCHECK_ACCESS_RELAY dnl dnl пример: dnl A.B.C.D : defer : message defered. contact postmaster@$qualify_domain dnl A.B.C.0/24 : deny : sender network blacklisted dnl host.domain.tld : warn dnl host2.domain.tld : ok dnl *.domain.tld dnl \N^.+\.zuper-ISP\..+$\N : reject : message from zuper-ISP rejected dnl dnl ############################################## dnl dnl Проверка страны хоста отправителя dnl dnl NO - не проводить проверку dnl YES - проводить проверку dnl define(`confCHECK_ACCESS_RELAY_COUNTRY', `NO')dnl dnl dnl проверка страны хоста отправителя является расширением проверки dnl адреса хоста отправителя. dnl т. е. confCHECK_ACCESS_RELAY_COUNTRY можно использовать только dnl вместе с confCHECK_ACCESS_RELAY. dnl dnl отличием confCHECK_ACCESS_RELAY_COUNTRY от dnl confCHECK_ACCESS_RELAY является лишь то, что вместе адреса хоста dnl отправителя или имени хоста отправителя можно указывать страну dnl хоста отправителя в виде двубуквенного кода. dnl dnl при этом запрос в access-relay по стране хоста отправителя dnl производится только в случае, если в данном файле не найдены адрес dnl хоста отправителя и имя хоста отправителя. dnl dnl в файле CONFDIR/access-relay можно указать необходимые действия для страны dnl хоста отправителя в виде: dnl NN : action : message : log_message dnl dnl где dnl NN - двубуквенный код страны dnl action - действие dnl message - ответ SMTP клиенту (может отсутствовать) dnl log_message - сообщение в лог файл (может отсутствовать) dnl dnl возможные значения для action такие же, как при проверке хоста dnl отправителя (переменная confCHECK_ACCESS_RELAY). dnl dnl ответ SMTP будет использован в случае указания reject/deny или defer в dnl качестве значения для action. если текст ответа не будет указан, будет dnl использован текст сообщения об ошибке по умолчанию dnl dnl если параметр action не будет указан, будет использоваться действие, указанное dnl в переменной confCHECK_ACCESS_RELAY dnl dnl пример: dnl CN : defer : message defered. contact postmaster@$qualify_domain dnl MX : pause=20 warn dnl dnl исключения для данного фильтра указываются в файле CONFDIR/access-relay в виде dnl IP адресов или сетей в виде CIDR, в качестве действия указав skip или ok dnl dnl механизм определения страны по IP адресу можно указать в переменной confIP2COUNTRY_BACKEND dnl dnl ############################################## dnl dnl Проверка A записи рилея на принадлежность к dial-up/dsl/cable сетям dnl dnl NO - не проводить проверку dnl REJECT - возврата по умолчанию клиенту кода 5xx dnl DEFER - возврата по умолчанию клиенту кода 4xx dnl WARN - вывода по умолчанию в лог файл предупреждения dnl QUARANTINE - принять письмо с сохранением в карантин без доставки получателям dnl PAUSE:XX - пауза XX секунд dnl GREYLIST:XX - добавить XX баллов к счетчику опционального greylisting'а dnl REJECT:XX - добавить XX баллов к счетчику опционального reject'а dnl define(`confCHECK_ACCESS_RELAY_DYNAMIC', `WARN')dnl dnl dnl действия WARN, PAUSE:XX, GREYLIST:XX, REJECT:XX можно указывать через пробел dnl dnl списки dial-up/dsl/cable хостов и сетей можно указывать в виде A записей и номеров сетей dnl указываются в файле CONFDIR/access-relay-dynamic dnl dnl confCHECK_ACCESS_RELAY_DYNAMIC используется только при использовании confCHECK_ACCESS_RELAY dnl ifelse(confCHECK_ACCESS_RELAY, `YES', `define(`confCHECK_ACCESS_RELAY', `REJECT')') ifelse_strstr(confCONTENT_SCANNING_QUARANTINE, `PERSONAL',`dnl define(`_CHECK_RELAY_ACCESS_TMP', `NORMALIZE_ACTION_PERSONAL_QUARANTINE(confCHECK_ACCESS_RELAY)')dnl ',`dnl define(`_CHECK_RELAY_ACCESS_TMP', `NORMALIZE_ACTION(confCHECK_ACCESS_RELAY)')dnl ')dnl define(`confCHECK_ACCESS_RELAY', _CHECK_RELAY_ACCESS_TMP)dnl ifelse(SECTION, `MAIN', `dnl hostlist hosts_blacklisted = CONFDIR/access-relay-blacklist ifelse(confCHECK_ACCESS_RELAY_DYNAMIC, `NO', `dnl', `dnl hostlist hosts_blacklist_dialup = CONFDIR/access-relay-dynamic ') dnl ifelse(confCHECK_ACCESS_RELAY_DYNAMIC, `NO', `dnl', `' ') dnl ifelse(SECTION, `MAIN', `') ifelse(SECTION, `ACL_CHECK_RCPT', ` # Проверка рилея отправителя warn set acl_m1 = set acl_m0 = ${lookup{$sender_host_address}iplsearch{CONFDIR/access-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_RELAY}{$value}}}\ {\ ${lookup{$sender_host_name}wildlsearch{CONFDIR/access-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_RELAY}{$value}}}\ {no}}\ }} ACL(`check_relay_hostlist', `hosts_blacklisted', `confCHECK_ACCESS_RELAY', `Access from relay $sender_host_address denied according to the local policy', `Sender relay $sender_host_address blacklisted') ifelse(confCHECK_ACCESS_RELAY_DYNAMIC, `NO', `dnl', `dnl ifelse_strstr(confCONTENT_SCANNING_QUARANTINE, `PERSONAL',`dnl define(`_CHECK_RELAY_ACCESS_TMP', `NORMALIZE_ACTION_PERSONAL_QUARANTINE(confCHECK_ACCESS_RELAY_DYNAMIC)')dnl ',`dnl define(`_CHECK_RELAY_ACCESS_TMP', `NORMALIZE_ACTION(confCHECK_ACCESS_RELAY_DYNAMIC)')dnl ')dnl define(`confCHECK_ACCESS_RELAY_DYNAMIC', _CHECK_RELAY_ACCESS_TMP)dnl ACL(`check_relay_hostlist', `hosts_blacklist_dialup', `confCHECK_ACCESS_RELAY_DYNAMIC', `Access from dial-up/dsl/cable relays denied according to the local policy.\n\ Use mail server of your ISP', `Access from dial-up/dsl/cable relay [$sender_host_address] denied /A record/') ') dnl ifelse(confCHECK_ACCESS_RELAY_DYNAMIC, `NO', `dnl', `' ifelse(confCHECK_ACCESS_RELAY_COUNTRY, `NO', `', ` define(`confIP2COUNTRY', `YES')dnl warn condition = ${if eq{$acl_m0}{no}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{}{yes}{no}} acl = acl_ip2country $sender_host_address set acl_m_sender_host_address_country = $acl_m_ip2country_result warn condition = ${if eq{$acl_m0}{no}{yes}{no}} condition = ${if eq{$acl_m_sender_host_address_country}{UNKNOWN}{no}{yes}} condition = ${if eq{$acl_m_sender_host_address_country}{}{no}{yes}} set acl_m0 = ${lookup{$acl_m_sender_host_address_country}\ wildlsearch{CONFDIR/access-relay}\ {${if eq{$value}{}{confCHECK_ACCESS_RELAY}{$value}}}\ {no}} ') dnl ifelse(confCHECK_ACCESS_RELAY_COUNTRY, `NO', `') warn condition = ${if eq{$acl_m0}{no}{no}{yes}} acl = acl_normalize_action "${extract{1}{:}{$acl_m0}}" set acl_m1 = ${sg{$acl_m_normalize_action_result }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} # message = $acl_m2 # log_message = $acl_m0 set acl_m2 = ${expand:${sg{${extract{2}{:}{$acl_m0}}}{\N^\s+\N}{}}} set acl_m0 = ${expand:${sg{${extract{3}{:}{$acl_m0}}}{\N^\s+\N}{}}} set acl_m_check_relay_msg = ${if eq{$acl_m0}{}{}{: $acl_m0}} set acl_m0 = ${if eq{$acl_m0}{}{relay ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] blacklisted${if eq{$acl_m2}{}{}{: $acl_m2}}}{$acl_m0}} set acl_m2 = ${if eq{$acl_m2}{}{Access from relay ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] denied according to the local policy}{$acl_m2}} ifdef(`confENTERPRISE_USER', `dnl warn condition = ${if match{$acl_m1}{submit_mysql}{yes}{no}} ENTERPRISE(`mysql', `submit', `sender_host_address', `blacklisted', `$sender_host_name', `0') warn condition = ${if match{$acl_m1}{submit_sqlite}{yes}{no}} ENTERPRISE(`sqlite', `submit', `sender_host_address', `blacklisted', `$sender_host_name', `0') warn condition = ${if match{$acl_m1}{submit_rbl}{yes}{no}} dnl ENTERPRISE(`rbl', `update', `mx.org.ua', `sender-host-name.rbl.mx.org.ua', `blacklisted', `$sender_host_name') ENTERPRISE(`rbl', `submit', `sender-host-name', `blacklisted', `$sender_host_name') ') dnl # Warning в случае принадлежности хоста рилея к blacklisted сетям # Warning if sender host in blacklisted network warn condition = ${if match{$acl_m1}{warn}{yes}{no}} add_header = X-Warn-Relay-BlackListed: $acl_m0 log_message = $acl_m0${if eq{${extract{pause}{$acl_m1}}}{}{}{: message delayed for ${extract{pause}{$acl_m1}}s}} # Pause в случае принадлежности хоста рилея к blacklisted сетям # Pause if sender host in blacklisted network warn condition = ${if eq{${extract{pause}{$acl_m1}}}{}{no}{yes}} delay = ${extract{pause}{$acl_m1}}s set acl_m_spam_action = ${acl_m_spam_action}\t\ delay=${extract{pause}{$acl_m1}}s\t\t\ $acl_m0\n # quarantine and reject accept condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{yes}{no}} log_message = message will be quarantined and rejected: relay ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] blacklisted${acl_m_check_relay_msg} set acl_m_fakereject = \ message will be quarantined and rejected: relay ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] blacklisted${acl_m_check_relay_msg}\ |X-Quarantine-Relay: relay ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] blacklisted${acl_m_check_relay_msg}\ |$acl_m2 set acl_m_add_x_orig_rcpt = yes set acl_m_quarantined = $acl_m_quarantined envelope # quarantine and !reject warn condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{no}{yes}} add_header = X-Quarantine-Relay: relay ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] blacklisted${acl_m_check_relay_msg} log_message = message will be quarantined: relay ${if eq{$sender_host_name}{}{}{$sender_host_name }}[$sender_host_address] blacklisted${acl_m_check_relay_msg} set acl_m_add_x_orig_rcpt = yes set acl_m_quarantined = $acl_m_quarantined envelope accept condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{no}{yes}} # !quarantine and reject deny condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{yes}{no}} condition = ${if eq{${extract{quarantine}{$acl_m1}}}{00}{no}{yes}} log_message = $acl_m0 message = $acl_m2 # Defer в случае принадлежности хоста рилея к blacklisted сетям # Defer if sender host in blacklisted network defer condition = ${if match{$acl_m1}{defer}{yes}{no}} message = $acl_m2 log_message = $acl_m0 # Drop в случае принадлежности хоста рилея к blacklisted сетям # Drop if sender host in blacklisted network drop condition = ${if match{$acl_m1}{drop}{yes}{no}} message = $acl_m2 log_message = $acl_m0 ifelse(confGREYLIST, `OPTIONAL', `dnl # greylist в случае принадлежности хоста рилея к blacklisted сетям # greylist if sender host in blacklisted network warn condition = ${if eq{${extract{greylist}{$acl_m1}}}{}{no}{yes}} set acl_m_optional_greylist = \ scores=${eval:${extract{scores}{$acl_m_optional_greylist}}+${extract{greylist}{$acl_m1}}} \ log_message="${extract{log_message}{$acl_m_optional_greylist}} $acl_m0;" set acl_m_spam_action = ${acl_m_spam_action}\t\ greylist scores=${extract{greylist}{$acl_m1}}\t\ $acl_m0\n ') dnl ifelse(confGREYLIST, `OPTIONAL', `') ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `dnl', `dnl # optional reject в случае принадлежности хоста рилея к blacklisted сетям # optional reject if sender host in blacklisted network warn condition = ${if eq{${extract{reject}{$acl_m1}}}{}{no}{yes}} condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{no}{yes}} set acl_m_optional_reject = \ scores=${eval:${extract{scores}{$acl_m_optional_reject}}+${extract{reject}{$acl_m1}}} \ log_message="${extract{log_message}{$acl_m_optional_reject}} $acl_m0;" set acl_m_spam_action = ${acl_m_spam_action}\t\ reject scores=${extract{reject}{$acl_m1}}\t\t\ $acl_m0\n ')') dnl ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `', `')') ') dnl ifelse(SECTION, `ACL_CHECK_RCPT', `')