dnl dnl использовать механизм определения страны по IP адресу dnl NO - не использовать механизм определения страны по IP адресу dnl YES - использовать механизм определения страны по IP адресу dnl define(`confIP2COUNTRY', `NO')dnl dnl dnl при использовании фильтрации писем по стране (континенту) хоста dnl отправителя (переменные confCHECK_ACCESS_RELAY_COUNTRY и dnl confCHECK_ACCESS_RELAY_CONTINENT), комбинации страны (континента) dnl хоста отправителя и адресов отправителя и получателя (переменные dnl confCHECK_ACCESS_COMPAT_RELAY_COUNTRY и dnl confCHECK_ACCESS_COMPAT_RELAY_CONTINENT), комбинации SMTP логина и dnl страны (контитента) хоста отправителя (переменные dnl confSMTP_AUTH_RELAY_COUNTRY и confSMTP_AUTH_RELAY_CONTINENT), а также dnl при указании в заголовках письма информации о странах, через которые dnl прошло письмо (перемення confRELAY_COUNTRIES), значение confIP2COUNTRY dnl автоматически устанавливается равным YES dnl dnl механизм определения страны по IP адресу dnl DLFUNC - определение страны по IP адресу с помощью dlfunc ip2country dnl при включенной поддержке IPv6 используется dlfunc ip2country_v6 (бывшая geoipv6) dnl для использования dlfunc необходимо: dnl собрать exim с EXPAND_DLFUNC dnl собрать и установить GeoIP library dnl DLFUNC_GEOIP - синоним DLFUNC dnl DLFUNC_GEOIPV6 - определение страны по IP адресу с помощью dlfunc ip2country_v6 (бывшая geoipv6) dnl даже при выключенной поддержке IPv6 dnl при этом необходимо: dnl собрать exim с EXPAND_DLFUNC dnl собрать и установить GeoIP library dnl DLFUNC_GEOIP2 - определение страны по IP адресу с помощью dlfunc maxminddb dnl для использования dlfunc необходимо: dnl собрать exim с EXPAND_DLFUNC dnl собрать и установить libmaminddb library dnl DNSBL - определение страны по IP адресу с помощю DNSBL zz.countries.nerd.dk dnl WIP-API - определение страны по WIPMANIA API (http://www.wipmania.com/ru/api/) dnl PTRTLD - определение страны по IP адресу с на основании TLD из PTR записи dnl define(`confIP2COUNTRY_BACKEND', `DNSBL PTRTLD')dnl dnl в качестве значения confIP2COUNTRY_BACKEND можно указывать несколько механизмов dnl dnl в случае использования DLFUNC_GEOIP2 в качестве значения confIP2COUNTRY_BACKEND путь в файлу данных: dnl define(`confIP2COUNTRY_MAXMINDDB_FILE', `/usr/local/share/GeoIP/GeoLite2-Country.mmdb')dnl dnl dnl игнорирование ошибок в работе dlfunc (на данный момент времени используетс в dlfunc maxminddb): dnl NO - не игноировать ошибки dnl YES - игноировать ошибки dnl define(`confIP2COUNTRY_DEFER_OK', `YES')dnl dnl dnl использовать механизм определения континента по IP адресу dnl NO - не использовать механизм определения континента по IP адресу dnl YES - использовать механизм определения континента по IP адресу dnl define(`confIP2CONTINENT', `NO')dnl dnl dnl механизм определения континента по IP адресу dnl DLFUNC - определение континента по IP адресу с помощью dlfunc ip2country dnl при включенной поддержке IPv6 используется dlfunc ip2country_v6 (бывшая geoipv6) dnl для использования dlfunc необходимо: dnl собрать exim с EXPAND_DLFUNC dnl собрать и установить GeoIP library dnl DLFUNC_GEOIP - синоним DLFUNC dnl DLFUNC_GEOIPV6 - определение континента по IP адресу с помощью dlfunc ip2country_v6 (бывшая geoipv6) dnl для использования dlfunc необходимо: dnl собрать exim с EXPAND_DLFUNC dnl собрать и установить GeoIP library dnl DLFUNC_GEOIP2 - определение континента по IP адресу с помощью dlfunc maxminddb dnl для использования dlfunc необходимо: dnl собрать exim с EXPAND_DLFUNC dnl собрать и установить libmaminddb library dnl define(`confIP2CONTINENT_BACKEND', `DLFUNC')dnl dnl ifelse(SECTION, `ACL_CHECK_CONNECT', `dnl ifelse(confCHECK_ACCESS_RELAY_COUNTRY, `NO', `', `define(`confIP2COUNTRY', `YES')')dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_COUNTRY, `NO', `', `define(`confIP2COUNTRY', `YES')')dnl ifelse(confSMTP_AUTH_RELAY_COUNTRY, `NO', `', `define(`confIP2COUNTRY', `YES')')dnl ifelse(confCHECK_ACCESS_RELAY_CONTINENT, `NO', `', `define(`confIP2COUNTRY', `YES')`'define(`confIP2CONTINENT', `YES')')dnl ifelse(confCHECK_ACCESS_COMPAT_RELAY_CONTINENT, `NO', `', `define(`confIP2COUNTRY', `YES')`'define(`confIP2CONTINENT', `YES')')dnl ifelse(confSMTP_AUTH_RELAY_CONTINENT, `NO', `', `define(`confIP2COUNTRY', `YES')`'define(`confIP2CONTINENT', `YES')')dnl dnl старое значение приводим к новому ifelse_strstr(confIP2COUNTRY_BACKEND` ', `DLFUNC ', `define(`confIP2COUNTRY_BACKEND', confIP2COUNTRY_BACKEND` DLFUNC_GEOIP')')dnl ifelse_strstr(confIP2COUNTRY_BACKEND` ', `DLFUNC_GEOIP ', `define(`confIP2COUNTRY_BACKEND', confIP2COUNTRY_BACKEND` DLFUNC_GEOIP1')')dnl ifelse_strstr(confIP2COUNTRY_BACKEND` ', `DLFUNC_GEOIPV6 ', `define(`confIP2COUNTRY_BACKEND', confIP2COUNTRY_BACKEND` DLFUNC_GEOIP1')')dnl dnl старое значение приводим к новому ifelse_strstr(confIP2CONTINENT_BACKEND` ', `DLFUNC ', `define(`confIP2CONTINENT_BACKEND', confIP2CONTINENT_BACKEND` DLFUNC_GEOIP')')dnl ifelse_strstr(confIP2CONTINENT_BACKEND` ', `DLFUNC_GEOIP ', `define(`confIP2CONTINENT_BACKEND', confIP2CONTINENT_BACKEND` DLFUNC_GEOIP1')')dnl ifelse_strstr(confIP2CONTINENT_BACKEND` ', `DLFUNC_GEOIPV6 ', `define(`confIP2CONTINENT_BACKEND', confIP2CONTINENT_BACKEND` DLFUNC_GEOIP1')')dnl ifelse(confIP2COUNTRY, `YES', `dnl warn condition = ${if eq{$acl_c_sender_host_address_country}{}{yes}{no}} set acl_c_sender_host_address_country = ${acl{acl_ip2country}{$sender_host_address}} ') dnl ifelse(confIP2COUNTRY, `YES', `') ifelse(confIP2CONTINENT, `YES', `dnl warn condition = ${if eq{$acl_c_sender_host_address_continent}{}{yes}{no}} set acl_c_sender_host_address_continent = ${acl{acl_ip2continent}{$sender_host_address}} ') dnl ifelse(confIP2CONTINENT, `YES', `') ') dnl ifelse(SECTION, `ACL_CHECK_CONNECT', `') ifelse(SECTION, `ACLS_ADDITIONAL', `dnl acl_ip2country: # acl_arg1 - IP адрес accept condition = ${if match_ip{$acl_arg1}{<; 127.0.0.1/8`'ifelse_strstr(confIPv6, `YES', ` ; ::1') ; +private_networks}{yes}{no}} message = UNKNOWN warn condition = ${if eq{${extract{country_${acl_arg1}}{$acl_c_ip2geo_result}}}{}{yes}{no}} set acl_c_ip2geo_result = $acl_c_ip2geo_result ${acl{acl_ip2geo}{$acl_arg1}} accept condition = ${if eq{${extract{country_${acl_arg1}}{$acl_c_ip2geo_result}}}{}{yes}{no}} message = UNKNOWN accept message = ${extract{country_${acl_arg1}}{$acl_c_ip2geo_result}} ifelse(confIP2CONTINENT, `NO', `dnl', `dnl acl_ip2continent: # acl_arg1 - IP адрес accept condition = ${if match_ip{$acl_arg1}{<; 127.0.0.1/8`'ifelse_strstr(confIPv6, `YES', ` ; ::1') ; +private_networks}{yes}{no}} message = UNKNOWN warn condition = ${if eq{${extract{continent_${acl_arg1}}{$acl_c_ip2geo_result}}}{}{yes}{no}} set acl_c_ip2geo_result = $acl_c_ip2geo_result ${acl{acl_ip2geo}{$acl_arg1}} accept condition = ${if eq{${extract{continent_${acl_arg1}}{$acl_c_ip2geo_result}}}{}{yes}{no}} message = UNKNOWN accept message = ${extract{continent_${acl_arg1}}{$acl_c_ip2geo_result}} ') dnl ifelse(confIP2CONTINENT, `NO', `dnl', `') acl_ip2geo: # acl_arg1 - IP адрес warn set acl_m_ip2country_result = UNKNOWN ifelse(confIP2CONTINENT, `NO', `dnl', `dnl warn set acl_m_ip2continent_result = UNKNOWN ') dnl ifelse(confIP2CONTINENT, `NO', `dnl', `') ifelse_strstr(confIP2COUNTRY_BACKEND` ', `DLFUNC_GEOIP2 ', `dnl ifdef(`confIP2COUNTRY_MAXMINDDB_FILE', `ifelse(len(X`'confIP2COUNTRY_MAXMINDDB_FILE), `1', `', `dnl warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} set acl_m_maxminddb_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{maxminddb}{confIP2COUNTRY_MAXMINDDB_FILE}{$acl_arg1}{confIP2COUNTRY_DEFER_OK}} set acl_m_ip2country_result = ${extract{country}{$acl_m_maxminddb_result}} warn set acl_m_ip2country_result = ${sg{$acl_m_ip2country_result}{--}{UNKNOWN}} condition = ${if eq{$acl_m_ip2country_result}{}{yes}{no}} set acl_m_ip2country_result = UNKNOWN ifelse(confIP2CONTINENT, `NO', `dnl', `dnl ifelse_strstr(confIP2CONTINENT_BACKEND` ', `DLFUNC_GEOIP2 ', `dnl warn condition = ${if eq{$acl_m_ip2continent_result}{UNKNOWN}{yes}{no}} set acl_m_ip2continent_result = ${extract{continent}{$acl_m_maxminddb_result}} warn set acl_m_ip2continent_result = ${sg{$acl_m_ip2continent_result}{--}{UNKNOWN}} condition = ${if eq{$acl_m_ip2continent_result}{}{yes}{no}} set acl_m_ip2continent_result = UNKNOWN ') dnl ifelse_strstr(confIP2CONTINENT_BACKEND` ', `DLFUNC_GEOIP2 ', `') ') dnl ifelse(confIP2CONTINENT, `NO', `', `') ')') dnl ifdef(`confIP2COUNTRY_MAXMINDDB_FILE', `ifelse(len(X`'confIP2COUNTRY_MAXMINDDB_FILE), `1', `', `')') ') dnl ifelse_strstr(confIP2COUNTRY_BACKEND` ', `DLFUNC_GEOIP2 ', `', `') ifelse_strstr(confIP2COUNTRY_BACKEND, `DLFUNC_GEOIP1', ` ifelse_strstr(confIP2COUNTRY_BACKEND, `DLFUNC_GEOIPV6', `dnl warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} set acl_m_ip2country_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2country_v6}{$acl_arg1}} warn condition = ${if eq{$acl_m_ip2country_result}{--}{yes}{no}} condition = ${if isip4{$acl_arg1}{yes}{no}} set acl_m_ip2country_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2country_v6}{::ffff:$acl_arg1}} ',`dnl ifelse_strstr(confIPv6, `YES', `dnl warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} condition = ${if isip4{$acl_arg1}{yes}{no}} set acl_m_ip2country_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2country}{$acl_arg1}} warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} condition = ${if isip6{$acl_arg1}{yes}{no}} set acl_m_ip2country_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2country_v6}{$acl_arg1}} warn condition = ${if eq{$acl_m_ip2country_result}{--}{yes}{no}} condition = ${if isip4{$acl_arg1}{yes}{no}} set acl_m_ip2country_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2country_v6}{::ffff:$acl_arg1}} ',`dnl warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} set acl_m_ip2country_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2country}{$acl_arg1}} ') dnl ifelse_strstr(confIPv6, `YES', `', `') ') dnl ifelse_strstr(confIP2COUNTRY_BACKEND` ', `DLFUNC_GEOIPV6', `') warn set acl_m_ip2country_result = ${sg{$acl_m_ip2country_result}{--}{UNKNOWN}} condition = ${if eq{$acl_m_ip2country_result}{}{yes}{no}} set acl_m_ip2country_result = UNKNOWN ifelse(confIP2CONTINENT, `NO', `dnl', `dnl ifelse_strstr(confIP2CONTINENT_BACKEND` ', `DLFUNC_GEOIPV6', `dnl warn condition = ${if eq{$acl_m_ip2continent_result}{UNKNOWN}{yes}{no}} set acl_m_ip2continent_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2continent_v6}{$acl_arg1}} ',`dnl ifelse_strstr(confIPv6, `YES', `dnl warn condition = ${if eq{$acl_m_ip2continent_result}{UNKNOWN}{yes}{no}} condition = ${if isip4{$acl_arg1}{yes}{no}} set acl_m_ip2continent_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2continent}{$acl_arg1}} warn condition = ${if eq{$acl_m_ip2continent_result}{UNKNOWN}{yes}{no}} condition = ${if isip6{$acl_arg1}{yes}{no}} set acl_m_ip2continent_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2continent_v6}{$acl_arg1}} ',`dnl warn condition = ${if eq{$acl_m_ip2continent_result}{UNKNOWN}{yes}{no}} set acl_m_ip2continent_result = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{ip2continent}{$acl_arg1}} ') dnl ifelse_strstr(confIPv6, `YES', `', `') ') dnl ifelse_strstr(confIP2CONTINENT_BACKEND` ', `DLFUNC_GEOIPV6', `') warn set acl_m_ip2continent_result = ${sg{$acl_m_ip2continent_result}{--}{UNKNOWN}} condition = ${if eq{$acl_m_ip2continent_result}{}{yes}{no}} set acl_m_ip2continent_result = UNKNOWN ') dnl ifelse(confIP2CONTINENT, `NO', `', `') ') dnl ifelse_strstr(confIP2COUNTRY_BACKEND, `DLFUNC_GEOIP1', `') ifelse_strstr(confIP2COUNTRY_BACKEND, `DNSBL', ` warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} # set acl_m_ip2country_result = ${lookup dnsdb{txt=<,${sg{$acl_arg1}{\N^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$\N}{\$4.\$3.\$2.\$1}}.zz.countries.nerd.dk}{$value}{UNKNOWN}} set acl_m_ip2country_result = ${lookup dnsdb{txt=<,${reverse_ip:$acl_arg1}.zz.countries.nerd.dk}{${sg{$value}{\n}{,}}}{UNKNOWN}} ') dnl ifelse_strstr(confIP2COUNTRY_BACKEND, `DNSBL', `') ifelse_strstr(confIP2COUNTRY_BACKEND, `WIP-API', ` warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} set acl_m_ip2country_result = ${sg{${readsocket{inet:api.wipmania.com:80}{GET http://api.wipmania.com/$acl_arg1 HTTP/1.0\n\n}{20s}{\n}{UNKNOWN}}}{\N^(.+\r?\n)+\r?\n\N}{}} set acl_m_ip2country_result = ${if eq{$acl_m_ip2country_result}{XX}{UNKNOWN}{$acl_m_ip2country_result}} set acl_m_ip2country_result = ${if match{$acl_m_ip2country_result}{\N^(UNKNOWN|[a-zA-Z]{2})$\N}{$acl_m_ip2country_result}{UNKNOWN}} ') dnl ifelse_strstr(confIP2COUNTRY_BACKEND, `WIP-API', `') ifelse_strstr(confIP2COUNTRY_BACKEND, `PTRTLD', ` warn condition = ${if eq{$acl_m_ip2country_result}{UNKNOWN}{yes}{no}} ## определяем страну по PTR записи в реверсной зоне только если существует соответствующая запись в прямой зоне # set acl_m_hostname = ${if eq{$acl_arg1}{$sender_host_address}{$sender_host_name}{${lookup dnsdb{ptr=$acl_arg1}{$value}{}}}} ## определяем страну по PTR записи в реверсной зоне даже если не существует соответствующая запись в прямой зоне set acl_m_hostname = ${if and{\ {eq{$acl_arg1}{$sender_host_address}}\ {!eq{$sender_host_name}{}}\ }{$sender_host_name}{${lookup dnsdb{ptr=$acl_arg1}{$value}{}}}} set acl_m_ip2country_result = ${if match{$acl_m_hostname}{\N(?i)^.+\.([a-z][a-z])$\N}{$1}{UNKNOWN}} ') dnl ifelse_strstr(confIP2COUNTRY_BACKEND, `PTRTLD', `') ifelse(confIP2CONTINENT, `NO', `dnl accept message = country_$acl_arg1=${uc:$acl_m_ip2country_result} ',` accept message = country_$acl_arg1=${uc:$acl_m_ip2country_result} continent_$acl_arg1=${uc:$acl_m_ip2continent_result} ') dnl ifelse(confIP2CONTINENT, `NO', `', `') ') dnl ifelse(SECTION, `ACLS_ADDITIONAL', `')