dnl dnl использовать механизм определения номера AS по IP адресу dnl NO - не использовать механизм определения номера AS по IP адресу dnl YES - использовать механизм определения номера AS по IP адресу dnl define(`confIP2ASN', `NO')dnl dnl dnl при использовании фильтрации писем по номеру AS хоста отправителя dnl (переменная confCHECK_ACCESS_RELAY_ASN), комбинации номера AS хоста dnl отправителя и адресов отправителя и получателя (переменная dnl confCHECK_ACCESS_COMPAT_RELAY_ASN), комбинации SMTP логина и номера AS dnl хоста отправителя (переменная confSMTP_AUTH_RELAY_ASN) значение dnl confIP2ASN автоматически устанавливается равным YES dnl dnl механизм определения номера AS по IP адресу dnl DLFUNC_GEOIP2 - определение страны по IP адресу с помощью dlfunc maxminddb dnl для использования dlfunc необходимо: dnl собрать exim с EXPAND_DLFUNC dnl собрать и установить libmaminddb library dnl GEOLITE2_DB - определение номера AS по IP адресу по данным MySQL БД geolite2 dnl WHOIS_RADB - определение номера AS по данным whois.radb.net dnl WHOIS_RIPE - определение номера AS по данным whois.ripe.net (только Европа) dnl DNS_CYMRU - определение номера AS по DNS зонам origin.asn.cymru.com и origin6.asn.cymru.com dnl DNS_SPAMEATINGMONKEY - определение номера AS по DNS зоне origin.asn.spameatingmonkey.net (только IPv4) dnl WHOIS_CYMRU - определение номера AS по данным whois.cymru.com dnl API_IPINFO - определение номера AS по данным https://ipinfo.io/ dnl только для exim 4.95 и выше, т. к. нужен патч для поддержки SNI dnl при получении ответа "429 Too Many Requests" нужно dnl "Create an API access token by signing up to get 50k req/month" dnl IP2LOCATION_DB - определение номера AS по IP адресу по данным MySQL БД ip2location dnl define(`confIP2ASN_BACKEND', `WHOIS_RADB WHOIS_RIPE DNS_CYMRU DNS_SPAMEATINGMONKEY WHOIS_CYMRU')dnl dnl в качестве значения confIP2ASN_BACKEND можно указывать несколько механизмов dnl dnl игнорирование ошибок в работе dlfunc (на данный момент времени используется в dlfunc maxminddb): dnl NO - не игноировать ошибки dnl YES - игноировать ошибки dnl define(`confIP2ASN_DEFER_OK', `YES')dnl dnl dnl путь к бинарному файлу maxminddb при использовании DLFUNC_GEOIP2 в confIP2ASN_BACKEND: dnl define(`confIP2ASN_MAXMINDDB_FILE', `/usr/local/share/GeoIP/GeoLite2-ASN.mmdb')dnl dnl dnl запросы для определения номера AS по IP адресу хоста отправителя в случае использования GEOLITE2_DB в качестве значения confIP2COUNTRY_BACKEND: dnl define(`confIP2ASN_GEOLITE2_DB_QUERY_IPV4', `SELECT asn FROM geolite2.geolite2_asn_ipv4 WHERE INET_ATON("$sender_host_address") <= ip_to AND INET_ATON("$sender_host_address") >= ip_from LIMIT 1;')dnl dnl define(`confIP2ASN_GEOLITE2_DB_QUERY_IPV6', `SELECT asn FROM geolite2.geolite2_asn_ipv6 WHERE ${reduce{<: ${ipv6denorm:$sender_host_address}}{}{${if eq{$value}{}{}{($value)*65536.0+}}${eval:0x$item+0}.0}} <= ip_to AND ${reduce{<: ${ipv6denorm:$sender_host_address}}{}{${if eq{$value}{}{}{($value)*65536.0+}}${eval:0x$item+0}.0}} >= ip_from LIMIT 1;')dnl dnl примеры запросов для проверки IPv4 адресов по БД для IPv6 адресов dnl define(`confIP2ASN_GEOLITE2_DB_QUERY_IPV4', `SELECT asn FROM geolite2.geolite2_asn_ipv6 WHERE 65535.0*256.0*256.0*256.0*256.0+${extract{1}{.}{$sender_host_address}}.0*256.0*256.0*256.0+${extract{2}{.}{$sender_host_address}}.0*256.0*256.0+${extract{3}{.}{$sender_host_address}}.0*256.0+${extract{4}{.}{$sender_host_address}}.0 <= ip_to AND 65535.0*256.0*256.0*256.0*256.0+${extract{1}{.}{$sender_host_address}}.0*256.0*256.0*256.0+${extract{2}{.}{$sender_host_address}}.0*256.0*256.0+${extract{3}{.}{$sender_host_address}}.0*256.0+${extract{4}{.}{$sender_host_address}}.0 >= ip_from LIMIT 1;')dnl dnl define(`confIP2ASN_GEOLITE2_DB_QUERY_IPV4', `SELECT asn FROM geolite2.geolite2_asn_ipv6 WHERE ${reduce{<. 255.255.$sender_host_address}{}{${if eq{$value}{}{}{($value)*256.0+}}${eval:$item+0}.0}} <= ip_to AND ${reduce{<. 255.255.$sender_host_address}{}{${if eq{$value}{}{}{($value)*256.0+}}${eval:$item+0}.0}} >= ip_from LIMIT 1;')dnl dnl ВНИМАНИЕ! на момент реализации определения номера AS по IP адресу под данных MySQL БД geoip2 в БД для IPv6 AS не было данных по IPv4 AS dnl dnl запросы для определения номера AS по IP адресу хоста отправителя в случае использования IP2LOCATION_DB в качестве значения confIP2COUNTRY_BACKEND: dnl define(`confIP2ASN_IP2LOCATION_DB_QUERY_IPV4', `SELECT asn FROM ip2location.ip2location_asn_ipv4 WHERE INET_ATON("$sender_host_address") <= ip_to LIMIT 1;')dnl dnl define(`confIP2ASN_IP2LOCATION_DB_QUERY_IPV6', `SELECT asn FROM ip2location.ip2location_asn_ipv6 WHERE ${reduce{<: ${ipv6denorm:$sender_host_address}}{}{${if eq{$value}{}{}{($value)*65536.0+}}${eval:0x$item+0}.0}} <= ip_to LIMIT 1;')dnl dnl примеры запросов для проверки IPv4 адресов по БД для IPv6 адресов dnl define(`confIP2ASN_IP2LOCATION_DB_QUERY_IPV4', `SELECT asn FROM ip2location.ip2location_asn_ipv6 WHERE 65535.0*256.0*256.0*256.0*256.0+${extract{1}{.}{$sender_host_address}}.0*256.0*256.0*256.0+${extract{2}{.}{$sender_host_address}}.0*256.0*256.0+${extract{3}{.}{$sender_host_address}}.0*256.0+${extract{4}{.}{$sender_host_address}}.0 <= ip_to LIMIT 1;')dnl dnl define(`confIP2ASN_IP2LOCATION_DB_QUERY_IPV4', `SELECT asn FROM ip2location.ip2location_asn_ipv6 WHERE ${reduce{<. 255.255.$sender_host_address}{}{${if eq{$value}{}{}{($value)*256.0+}}${eval:$item+0}.0}} <= ip_to LIMIT 1;')dnl dnl ВНИМАНИЕ! на момент реализации определения номера AS по IP адресу по данным MySQL БД ip2location в БД для IPv6 AS не было данных по IPv4 AS dnl dnl кеширование данных о номерах AS: dnl NO - не кешировать результаты dnl REDIS - кешировать результаты в redis dnl MEMCACHED - кешировать результаты в memcached dnl SQLITE - кешировать результаты в sqlite (ещё не реализовано) dnl MYSQL - кешировать результаты в mysql (ещё не реализовано) dnl define(`confIP2ASN_CACHE', `NO')dnl dnl dnl время жизни в кеше данных о номерах AS dnl define(`confIP2ASN_CACHE_TTL', `eval(2*30*24*60*60)')dnl dnl dnl время жизни в кеше отрицательных результатов получения номеров AS dnl define(`confIP2ASN_CACHE_TTL_UNKNOWN', `eval(60*60)')dnl dnl dnl при MEMCACHED или REDIS в confIP2ASN_CACHE dnl dnl префикс записей: dnl define(`confIP2ASN_CACHE_RECORD_PREFIX', `ip2asn:')dnl dnl dnl при SQLITE в confIP2ASN_CACHE dnl dnl define(`confIP2ASN_CACHE_SQLITE_FILE', `confSPOOLDIR/db/cache.db')dnl dnl dnl dnl define(`confIP2ASN_CACHE_SQLITE_GET', `SELECT asn FROM ip2asn WHERE ip="$acl_arg1" AND expires > UNIXEPOCH();')dnl dnl dnl define(`confIP2ASN_CACHE_SQLITE_SET', `REPLACE INTO ip2asn (ip, asn, expires) VALUES ("$acl_arg1", "$acl_m_ip2asn_result", UNIXEPOCH() + ${if eq{$acl_m_ip2asn_result}{UNKNOWN}{confIP2ASN_CACHE_TTL_UNKNOWN}{confIP2ASN_CACHE_TTL}});')dnl dnl dnl define(`confIP2ASN_CACHE_SQLITE_DELETE', `DELETE FROM ip2asn WHERE expires < UNIXEPOCH();')dnl dnl changequote(<<, >>) dnl define(<>, <