dnl dnl проверка SPF записей домена отправителя dnl dnl варианты действий при несоответствии рилея отправителя SPF записи домена отправителя dnl описаны в файле CONFDIR/access-spf2 в виде: dnl dnl sender.domain.tld|result : действие : сообщение клиенту : сообщение в файл протокола dnl dnl где sender.dom.tld - домен отправителя, допускаются wildcards dnl result - результат проверки соответствия рилея отправителя SPF записи dnl домена отправителя (pass, fail, softfail, none, neutral, dnl err_perm, err_temp; см. exiscan-acl-spec.txt, dnl 8. Sender Policy Framework (SPF) support) dnl http://duncanthrax.net/exiscan-acl/exiscan-acl-spec.txt dnl dnl в качестве "действия" могут выступать: dnl ok - принимать сообщения dnl warn - выдача предупреждения в лог файл и в заголовки письма dnl и добавление в заголовки сообщения поле X-Warn-Mail-MX dnl текст сообщения об ошибке может быть указан через двоеточие dnl deny или reject - отказ в приеме сообщения dnl drop или discard - отказ в приеме сообщения с обрывом соединения dnl defer - возврат клиенту временной ошибки 4xx 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 сообщения, возвращаемое клиенту и выводимое в файл протокола, могут отсуствовать dnl dnl пример: dnl *.aol.com|fail : deny : AOL sender, but not from AOL-approved relay dnl *.aol.com|neutral : warn : AOL sender, but not from AOL-approved relay dnl aol.com|fail : deny : AOL sender, but not from AOL-approved relay dnl aol.com|neutral : deny : AOL sender, but not from AOL-approved relay dnl dnl bigmir.net|softfail : defer dnl bigmir.net|err_temp : defer dnl gala.net|softfail : deny : You can not send messages with gala.net as sender domain dnl gala.net|fail : deny : You can not send messages with gala.net as sender domain dnl rambler.ru|softfail : deny : You can not send messages with rambler.ru as sender domain dnl rambler.ru|fail : deny : You can not send messages with rambler.ru as sender domain dnl dnl *|fail : deny dnl *|softfail : defer dnl *|err_temp : defer dnl *|neutral : warn dnl dnl исключения из проверки SPF записей указываются в файле CONFDIR/access-spf2 в виде: dnl адрес_отправителя : skip : список сетей dnl dnl пример: dnl *@hotmail.com : skip : 194.183.162.130 dnl dnl необходимо внести в виде исключений адреса backup MX'ов: dnl * : skip : backup_MX_1 : backup_MX_2 dnl warn set acl_m0 = set acl_m2 = ${lookup{$sender_address}wildlsearch{CONFDIR/access-spf2}} condition = ${if eq{$acl_m2}{}{no}{yes}} set acl_m1 = ${extract{1}{:}{$acl_m2}} acl = normalize_action condition = ${if eq{$acl_m1}{skip}{yes}{no}} set acl_m2 = ${sg{$acl_m2}{\N^\s*\S+\s*(:\s*)?\N}{}} set acl_m2 = ${if eq{$acl_m2}{}{*}{$acl_m2}} hosts = $acl_m2 set acl_m0 = skip warn set acl_m3 = warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m3}{}{yes}{no}} spf = pass set acl_m3 = pass warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m3}{}{yes}{no}} spf = fail set acl_m3 = fail warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m3}{}{yes}{no}} spf = softfail set acl_m3 = softfail warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m3}{}{yes}{no}} spf = none set acl_m3 = none warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m3}{}{yes}{no}} spf = neutral set acl_m3 = neutral warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m3}{}{yes}{no}} spf = err_perm set acl_m3 = err_perm warn condition = ${if eq{$acl_m0}{skip}{no}{yes}} condition = ${if eq{$acl_m3}{}{yes}{no}} spf = err_temp set acl_m3 = err_temp warn set acl_m1 = condition = ${if eq{$acl_m3}{}{no}{yes}} set acl_m0 = ${lookup{$sender_address_domain|$acl_m3}wildlsearch{CONFDIR/access-spf2}} condition = ${if eq{$acl_m0}{}{no}{yes}} set acl_m1 = ${extract{1}{:}{$acl_m0}} acl = normalize_action set acl_m1 = ${sg{$acl_m1 }{\N\b([^=\s\d]+)(\s)\N}{\$1=00\$2}} # message = $acl_m2 # log_message = $acl_m0 set acl_m2 = ${sg{${extract{2}{:}{$acl_m0}}}{\N^\s+\N}{}} set acl_m2 = ${if eq{$acl_m2}{}{You can send mail from that domain via their approved relay only}{$acl_m2}} set acl_m0 = ${sg{${extract{3}{:}{$acl_m0}}}{\N^\s+\N}{}} set acl_m0 = ${if eq{$acl_m0}{}\ {sender host address $sender_host_address does not match SPF record of sender address domain $sender_address_domain ($acl_m3)\ ${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', `spf', `blacklisted', `$sender_address', `0') warn condition = ${if match{$acl_m1}{submit_sqlite}{yes}{no}} ENTERPRISE(`sqlite', `submit', `spf', `blacklisted', `$sender_address', `0') warn condition = ${if match{$acl_m1}{submit_rbl}{yes}{no}} ENTERPRISE(`rbl', `update', `mx.org.ua', `spf.rbl.mx.org.ua', `blacklisted', `$sender_address') ')dnl warn condition = ${if eq{${extract{pause}{$acl_m1}}}{}{no}{yes}} delay = ${extract{pause}{$acl_m1}}s deny condition = ${if eq{${extract{reject}{$acl_m1}}}{00}{yes}{no}} log_message = $acl_m0 message = $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 warn condition = ${if match{$acl_m1}{warn}{yes}{no}} log_message = $acl_m0 message = X-Warn-SPF: $acl_m0 ifelse(confGREYLIST_DBM, `OPTIONAL', `dnl warn condition = ${if eq{${extract{greylist}{$acl_m1}}}{}{no}{yes}} set acl_c8 = \ scores=${eval:${extract{scores}{$acl_c8}}+${extract{greylist}{$acl_m1}}} \ log_message="${extract{log_message}{$acl_c8}} $acl_m0;" ') dnl ifelse(confGREYLIST_DBM, `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_c6 = \ scores=${eval:${extract{scores}{$acl_c6}}+${extract{reject}{$acl_m1}}} \ log_message="${extract{log_message}{$acl_c6}} $acl_m0;" ')') dnl ifdef(`confOPTIONAL_REJECT', `ifelse(confOPTIONAL_REJECT, `NO', `', `')')