dnl dnl проверка FQDN хоста отправителя в HELO по следующему алгоритму: dnl dnl 1. поизводится получение A записи аргумента команды HELO dnl 2. полученная A запись сравнивается с A записью рилея dnl 3. если A записи равны, проверка оканчивается успешно dnl 4. если A записи не равны, сравниваются доменные части HELO и PTR записи рилея dnl 5. если они не равны, сообщение считается не прошедшим проверку dnl 6. если доменные части HELO и PTR записи рилея равны, то сравниваются номера dnl сетей класса C полученной ранее A записи HELO и A записи рилея dnl 7. если номера сетей равны (A запись HELO и A запись рилея находятся в одной dnl сети класса C), то проверка оканчивается успешно dnl 8. в противном случае сообщение считается не прошедшим проверку dnl NO - не проводить проверку dnl WARN - вывода в лог файл предупреждения dnl DEFER - возврата клиенту кода 451 dnl REJECT - возврата клиенту кода 5xx dnl define(`confCHECK_HELO_FQDN', `WARN')dnl dnl исключеня из проверки FQDN в HELO (список) dnl AUTH - не проводить проверку аутентифицированных отправителей dnl RELAY_FROM - не проводить проверку исходящих сообщений dnl HOST_LIST - не проводить проверку сообщений, получаемых с определенного списка хостов dnl (список хостов/сетей находится в файле skip_helo_fqdn_check) dnl define(`confCHECK_HELO_FQDN_SKIP', `AUTH RELAY_FROM')dnl dnl ifelse(SECTION, `MAIN', `dnl ifelse_strstr(confCHECK_HELO_FQDN_SKIP, `HOST_LIST', `dnl hostlist skip_helo_fqdn_check = CONFDIR/skip_helo_fqdn_check ')') dnl ifelse(SECTION, `ACL_CHECK_RCPT', `dnl # проверка HELO на наличие FQDN хоста отправителя warn set acl_m0 = skip ifelse_strstr(confCHECK_HELO_FQDN_SKIP, `AUTH', `dnl ! authenticated = * ')dnl ifelse_strstr(confCHECK_HELO_FQDN_SKIP, `RELAY_FROM', `dnl ! hosts = +relay_from_hosts ')dnl ifelse_strstr(confCHECK_HELO_FQDN_SKIP, `HOST_LIST', `dnl ! hosts = +skip_helo_fqdn_check ')dnl set acl_m0 = ok set acl_m1 = ${lookup dnsdb{a=$sender_helo_name}} condition = ${if eq{$acl_m1}{$sender_host_address}{no}{yes}} set acl_m0 = ${if and{\ {\ eq{\ ${if match{$acl_m1}\ {\N^(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}\N}\ {$1}{helo_doesnot_resolved}}\ }\ {\ ${if match{$sender_host_address}\ {\N^(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}\N}\ {$1}{host_address_not_ip}}\ }\ }\ {\ eq{\ ${lc:${if match{$sender_helo_name}\ {\N(?i)^[^\.]+\.(.+)\N}\ {$1}{helo_without_dot}}}\ }\ {\ ${lc:${if match{$sender_host_name}\ {\N(?i)^[^\.]+\.(.+)\N}\ {$1}{sender_host_name_without_dot}}}\ }\ }\ }{passed}{forged}} ifelse(confCHECK_HELO_FQDN, `WARN', `dnl # Warning в случае указания в качестве HELO не FQDN хоста-отправителя warn condition = ${if eq{$acl_m0}{forged}{yes}{no}} message = X-Warn-HELO-Forged: Forged HELO used (A record of HELO $sender_helo_name does not correspond to relay address) log_message = Forged HELO used ')dnl dnl ifelse(confCHECK_HELO_FQDN, `DEFER', `dnl # 4xx в случае указания в качестве HELO не FQDN хоста-отправителя defer condition = ${if eq{$acl_m0}{forged}{yes}{no}} message = Forged HELO used log_message = Forged HELO used (A record of HELO $sender_helo_name does not correspond to relay address) ')dnl ifelse(confCHECK_HELO_FQDN, `REJECT', `dnl # 5xx в случае указания в качестве HELO не FQDN хоста-отправителя deny condition = ${if eq{$acl_m0}{forged}{yes}{no}} message = Forged HELO used log_message = Forged HELO used (A record of HELO $sender_helo_name does not correspond to relay address) ')dnl ')