dnl dnl проверка NS записей домена отправителя dnl dnl NO - не проводить проверку dnl REJECT - возврата клиенту кода 5xx dnl DEFER - возврата клиенту кода 451 dnl WARN - вывод в лог файл предупреждения dnl GREYLIST:XX - добавить XX баллов к счетчику опционального грейлистинга dnl QUARANTINE - принять письмо с сохранением в карантин без доставки получателям dnl REJECT:XX - добавить XX баллов к счетчику опционального reject'а dnl DELAY:XX - задержка XX секунд перед ответом на RCPT TO dnl define(`confCHECK_ACCESS_MAIL_DOMAIN_NS', `NO')dnl dnl dnl черный список NS записей доменов отправителей находятся в файле CONFDIR/access-mail-domain-ns dnl в виде: dnl ptr_record : действие : сообщение dnl a_record : действие : сообщение dnl dnl при значении YES переменной confIPv6 в файле CONFDIR/access-mail-domain-ns dnl кроме A записей доменов можно указывать AAAA записи в двойных кавычках dnl dnl в качестве "действия" могут выступать: dnl ok - принимать сообщения dnl warn - выдача предупреждения в лог файл и в заголовки письма dnl и добавление в заголовки сообщения поле X-Warn-Mail-NS dnl текст сообщения об ошибке может быть указан через двоеточие dnl deny или reject - отказ в приеме сообщения dnl drop - отказ в приеме сообщения с обрывом соединения dnl discard - прием письма без доставки получателю dnl defer - возврат клиенту временной ошибки 4xx dnl quarantine - принять письмо с сохранением в карантин без доставки получателям dnl greylist=xx - добавление xx баллов к счетчику опционального greylisting'а dnl greylisting=xx - синоним greylist=xx dnl reject=yy - добавление yy баллов к счетчику опционального reject'а dnl deny=yy - синоним reject=yy dnl delay=zz - задержка на zz секунд перед продолжением обработки сообщения dnl pause=zz - синоним delay=zz dnl submit_mysql - занесение записи о хосте в базу MySQL dnl submit_sqlite - занесение записи о хосте в базу SQLite dnl submit_rbl - занесение записи о хосте в DNSBL dnl dnl если в файле CONFDIR/access-mail-domain-ns будет отсутствовать поле "действие", dnl то будет выполнено действие по умолчанию из переменно confCHECK_ACCESS_MAIL_DOMAIN_NS dnl поле "сообщение" может отсутствовать dnl dnl пример: dnl ns1.pegas-dns.com : greylist=10 : Too many domains with suspicious SPF records are hosted on $acl_m_key dnl ns2.pegas-dns.com : greylist=10 : Too many domains with suspicious SPF records are hosted on $acl_m_key dnl 91.222.65.12 : greylist=10 : Too many domains with suspicious SPF records are hosted on $acl_m_key dnl define(`confACL_DNSDB', `1')dnl # Проверка NS записей домена отправителя warn set acl_m0 = skip condition = ${if eq{$sender_address_domain}{}{no}{yes}} condition = ${if match_domain{$sender_address_domain}\ {+local_domains ifdef(`confSECONDARY_RELAY', `ifelse(confSECONDARY_RELAY, `NO', `', `: +relay_to_domains')')}\ {no}{yes}} condition = ${lookup{$sender_address_domain}wildlsearch{CONFDIR/access-mail-domain-ns}{\ ${if eq{${lc:$value}}{ok}{no}{yes}}\ }{yes}} set acl_m0 = warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} set acl_m2 = ${sg{${sg{\ ${lookup dnsdb{ns=$sender_address_domain}}\ }{\N\.$\N}{}}}{\N\.\n\N}{\n}} set acl_m10 = $acl_m2 condition = ${if eq{$acl_m2}{}{yes}{no}} set acl_m0 = skip warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} acl = acl_wildlsearch CONFDIR/access-mail-domain-ns "$acl_m2" set acl_m0 = ${if match{$acl_m_wildlsearch_result}{\N.+(lookup |\$\{|[\{\}])\N}{${expand:$acl_m_wildlsearch_result}}{$acl_m_wildlsearch_result}} warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m10}{}{no}{yes}} set acl_m_ptrlist_iplsearch_result = acl = acl_ptrlist_iplsearch CONFDIR/access-mail-domain-ns "$acl_m10" set acl_m0 = ${if match{$acl_m_ptrlist_iplsearch_result}{\N.+(lookup |\$\{|[\{\}])\N}{${expand:$acl_m_ptrlist_iplsearch_result}}{$acl_m_ptrlist_iplsearch_result}} ifelse_strstr(confIPv6, `YES', `dnl warn condition = ${if eq{$acl_m0}{}{yes}{no}} condition = ${if eq{$acl_m10}{}{no}{yes}} set acl_m_ptrlist_iplsearch_result = acl = acl_ptrlist_iplsearch_ipv6 CONFDIR/access-mail-domain-ns "$acl_m10" set acl_m0 = ${if match{$acl_m_ptrlist_iplsearch_result}{\N.+(lookup |\$\{|[\{\}])\N}{${expand:$acl_m_ptrlist_iplsearch_result}}{$acl_m_ptrlist_iplsearch_result}} ') dnl ifelse_strstr(confIPv6, `YES', `') warn set acl_m1 = condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m0}{}{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_m2 = ${if eq{$acl_m2}{}{Access denied}{$acl_m2}} set acl_m0 = ${expand:${sg{${extract{3}{:}{$acl_m0}}}{\N^\s+\N}{}}} set acl_m_check_mail_ns_msg = ${if eq{$acl_m0}{}{}{: $acl_m0}} set acl_m0 = ${if eq{$acl_m0}{}{NS record of sender domain $sender_address_domain blacklisted${if eq{$acl_m2}{}{}{: $acl_m2}}}{$acl_m0}} ifdef(`confENTERPRISE_USER', `dnl warn condition = ${if match{$acl_m1}{submit_mysql}{yes}{no}} ENTERPRISE(`mysql', `submit', `mail ns', `blacklisted', `$sender_address', `0') warn condition = ${if match{$acl_m1}{submit_sqlite}{yes}{no}} ENTERPRISE(`sqlite', `submit', `mail ns', `blacklisted', `$sender_address', `0') warn condition = ${if match{$acl_m1}{submit_rbl}{yes}{no}} dnl ENTERPRISE(`rbl', `update', `mx.org.ua', `mailns.rbl.mx.org.ua', `blacklisted', `$sender_address') ENTERPRISE(`rbl', `submit', `mailns', `blacklisted', `$sender_address') ')dnl warn condition = ${if match{$acl_m1}{warn}{yes}{no}} log_message = $acl_m0 add_header = X-Warn-Mail-NS: $acl_m0 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 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-Mail-NS: NS record of sender domain $sender_address_domain blacklisted${acl_m_check_mail_ns_msg} log_message = message will be quarantined: NS record of sender domain $sender_address_domain blacklisted 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 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: NS record of sender domain $sender_address_domain blacklisted set acl_m_fakereject = \ message will be quarantined: NS record of sender domain $sender_address_domain blacklisted\ |X-Quarantine-Mail-NS: NS record of sender domain $sender_address_domain blacklisted${acl_m_check_mail_ns_msg}\ |${expand:$acl_m2} set acl_m_add_x_orig_rcpt = yes set acl_m_quarantined = $acl_m_quarantined envelope # !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 = ${expand:$acl_m2} defer condition = ${if match{$acl_m1}{defer}{yes}{no}} log_message = $acl_m0 message = $acl_m2 drop condition = ${if match{$acl_m1}{drop}{yes}{no}} log_message = $acl_m0 message = $acl_m2 discard condition = ${if match{$acl_m1}{discard}{yes}{no}} log_message = $acl_m0 ifelse(confGREYLIST, `OPTIONAL', `dnl 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 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', `', `')')