[exim-conf] фильтрация по континенту хоста отправителя и интеграция с GeoIP2 через libmaxmind

Victor Ustugov victor на corvax.kiev.ua
Ср Сен 12 21:05:11 EEST 2018


приветствую

в дополнение к проверке страны хоста отправителя и комбинации страны
хоста отправителя, адреса отправителя и адреса получателя реализована
проверка контитента хоста отправителя и комбинации контитента хоста
отправителя, адреса отправителя и адреса получателя.

включение проверки контитента хоста отправителя производится указанием
действия по умолчанию в переменной confCHECK_ACCESS_RELAY_CONTINENT:


NO		- не проводить проверку
REJECT		- возврата по умолчанию клиенту кода 5xx
DEFER		- возврата по умолчанию клиенту кода 4xx
WARN		- вывода по умолчанию в лог файл предупреждения
QUARANTINE	- принять письмо с сохранением в карантин без доставки
		получателям
PAUSE=XX	- пауза XX секунд
GREYLIST=XX	- добавить XX баллов к счетчику опционального
		greylisting'а
REJECT=XX	- добавить XX баллов к счетчику опционального reject'а

define(`confCHECK_ACCESS_RELAY_CONTINENT', `NO')dnl


набор действий по умолчанию традиционный.

проверка континента хоста отправителя является расширением проверки
адреса хоста отправителя.
т. е. confCHECK_ACCESS_RELAY_CONTINENT можно использовать только вместе
с confCHECK_ACCESS_RELAY.

запрос к access-relay по двухбуквенному коду континента производится
только в случае, если запросы по IP адресу, имени хоста отправителя и
стране отправителя не дали результатов.

в файле CONFDIR/access-relay можно указать необходимые действия для
континента хоста отправителя в виде:
CONTINENT_NN	: action : message : log_message

где
NN - двухбуквенный код континента
action - действие
message - ответ SMTP клиенту (может отсутствовать)
log_message - сообщение в лог файл (может отсутствовать)

информация по двухбуквенным кодам континентов:
https://dev.maxmind.com/geoip/legacy/web-services/

возможные значения для action такие же, как при проверке хоста
отправителя (переменная confCHECK_ACCESS_RELAY).

ответ SMTP будет использован в случае указания reject/deny или defer в
качестве значения для action. если текст ответа не будет указан, будет
использован текст сообщения об ошибке по умолчанию.

если параметр action не будет указан, будет использоваться действие,
указанное в переменной confCHECK_ACCESS_RELAY

пример:
CONTINENT_AF	: GREYLIST=10 : Temporary problem
CONTINENT_AN	: WARN : Wow, the message from Antarctica

префикс CONTINENT пришлось использовать, т. к. при тестах определения
контитента письма из Аргентины выяснилось, что SA (код контитента Южная
Америка) совпадает с кодом страны SA (Саудовская Аравия).

исключения для данного фильтра указываются в файле CONFDIR/access-relay
в виде IP адресов или сетей в виде CIDR, в качестве действия указав skip
или ok

механизм определения страны по IP адресу можно указать в переменной
confIP2COUNTRY_BACKEND (об этом ниже).


управление проверкой комбинации континента хоста отправителя, адресов
отправителя и получателя производится с помощью переменной
confCHECK_ACCESS_COMPAT_RELAY_CONTINENT:

NO		- не проводить проверку
YES		- проводить проверку
define(`confCHECK_ACCESS_COMPAT_RELAY_CONTINENT', `NO')

проверка комбинации континента хоста отправителя и адресов отправителя и
получателя является расширением проверки комбинации страны хоста
отправителя, адресов отправителя и получателя.
т. е. confCHECK_ACCESS_COMPAT_RELAY_CONTINENT можно использовать только
вместе с confCHECK_ACCESS_COMPAT_RELAY.

отличием confCHECK_ACCESS_COMPAT_RELAY_CONTINENT от
confCHECK_ACCESS_COMPAT_RELAY и confCHECK_ACCESS_COMPAT_RELAY_COUNTRY
является лишь то, что вместе адреса хоста отправителя или имени хоста
отправителя нужно указывать континент хоста отправителя в виде
двухбуквенного кода.

при этом запрос в access-compay-relay с комбинацией контитента хоста
отправителя, адреса отправителя и адреса получателя производится только
в случае, если в данном файле не найдены комбинации адреса хоста
отправителя, адреса отправителя и адреса получателя или имени хоста
отправителя, адреса отправителя и адреса получателя, а также страны
хоста отправителя, адреса отправителя и адреса получателя или имени
хоста отправителя, адреса отправителя и адреса получателя.

в файле CONFDIR/access-compat-relay можно указать необходимые действия
для комбинации континента хоста отправителя, адреса отправителя и адреса
получателя в виде:

CONTINENT_NN<@>sender_mailbox на sender.domain<@>rcpt_mailbox на rcpt.domain :
действие : сообщение : сообщение в лог файл

где
NN - двухбуквенный код континента
действие - действие, применяемое к письму
сообщение - ответ SMTP клиенту (может отсутствовать)
сообщение в лог файл - сообщение в лог файл MTA (может отсутствовать)

информация по двухбуквенным кодам континентов:
https://dev.maxmind.com/geoip/legacy/web-services/

возможные значения для действия такие же, как при проверке кобминации
хоста отправителя и адресов отправителя и получателя (переменная
confCHECK_ACCESS_COMPAT_RELAY).

ответ SMTP клиенту будет использован в случае указания reject/deny или
defer в качестве действия. если текст ответа не будет указан, будет
использован текст сообщения об ошибке по умолчанию.

если действие не будет указано, будет использоваться действие,
указанное в переменной confCHECK_ACCESS_COMPAT_RELAY_CONTINENT

пример:

CONTINENT_AS<@>sender на ukr.net<@>recipient на local.domain.tld : ok

\N^CONTINENT_AS<@>.+ на ukr.net<@>.+ на local\.domain\.tld$\N : warn pause=10
greylist=10 : Message with ukr.net sender address domain from Asia

\N^CONTINENT_AS<@>.+ на ukr.net<@>$\N : deny : Access denied : Message with
ukr.net sender address domain from Asia


в примере ко всем письмам из домена ukr.net, отправленным из Азии для
пользователей домена local.domain.tld, будут применены пауза и "серые
списки".
прием писем из домена ukr.net, отправленных из Ази для пользователей
других доменов, будет отвергнут.
исключение сделано для пары адресов отправителя и получателя
sender на ukr.net и recipient на local.domain.tld

механизм определения континента по IP адресу можно указать в переменной
confIP2CONTINENT_BACKEND.

при SQLITE в confCHECK_ACCESS_COMPAT_RELAY_BACKEND:
запрос к БД SQLite:

define(`confCHECK_ACCESS_COMPAT_RELAY_CONTINENT_SQLITE_QUERY', `SELECT
action FROM access_list WHERE
continent="$acl_c_sender_host_address_continent" AND
recipient="${quote_sqlite:$local_part@$domain}" AND
sender="${quote_sqlite:$sender_address}"')dnl

второй запрос к БД SQLite (опциональный):

define(`confCHECK_ACCESS_COMPAT_RELAY_CONTINENT_SQLITE_QUERY2',>`SELECT
action FROM access_list WHERE
continent="$acl_c_sender_host_address_continent" AND
sender="${quote_sqlite:$sender_address}"')dnl

при MYSQL в confCHECK_ACCESS_COMPAT_RELAY_BACKEND:
запрос к БД MySQL:

define(`confCHECK_ACCESS_COMPAT_RELAY_CONTINENT_MYSQL_QUERY',<->`SELECT
action FROM access_list WHERE
continent="$acl_c_sender_host_address_continent" AND
recipient="${quote_mysql:$local_part@$domain}" AND
sender="${quote_mysql:$sender_address}"')dnl

второй запрос к БД MySQL (опциональный):

define(`confCHECK_ACCESS_COMPAT_RELAY_CONTINENT_MYSQL_QUERY2',<>`SELECT
action FROM access_list WHERE
continent="$acl_c_sender_host_address_continent" AND
sender="${quote_mysql:$sender_address}"')dnl



также реализовано определение страны и континента хоста отправителя по
базе GeoIP2 с использованием библиотеке libmaxminddb.

интеграция произведена с помощью новой dlfunc:

https://mta.org.ua/exim-4.88-conf/dlfunc/maxminddb/

механизмы, используемые для определения страны и континента хоста
отправителя, можно указать в соответствующих переменных
confIP2COUNTRY_BACKEND и confIP2CONTINENT_BACKEND.

механизм определения страны по IP адресу:

DLFUNC		- определение страны по IP адресу с помощью dlfunc
		ip2country при включенной поддержке IPv6 используется
		dlfunc geoipv6
		для использования dlfunc необходимо:
		собрать exim с EXPAND_DLFUNC
		собрать и установить GeoIP library
DLFUNC_GEOIP	- синоним DLFUNC
DLFUNC_GEOIPV6	- определение страны по IP адресу с помощью dlfunc
		geoipv6
		для использования dlfunc необходимо:
		собрать exim с EXPAND_DLFUNC
		собрать и установить GeoIP library
DLFUNC_GEOIP2	- определение страны по IP адресу с помощью dlfunc
		maxminddb
		для использования dlfunc необходимо:
		собрать exim с EXPAND_DLFUNC
		собрать и установить libmaminddb library
DNSBL		- определение страны по IP адресу с помощю DNSBL
		zz.countries.nerd.dk
WIP-API		- определение страны по WIPMANIA API
		(http://www.wipmania.com/ru/api/)
PTRTLD		- определение страны по IP адресу с на основании TLD из
		PTR записи
define(`confIP2COUNTRY_BACKEND', `DNSBL PTRTLD')dnl

в качестве значения confIP2COUNTRY_BACKEND можно указывать несколько
механизмов.

т. к. dlfunc maxminddb является прототипом (сейчас обрабатываются только
результаты с type MMDB_DATA_TYPE_UTF8_STRING), вполне разумно
использовать сразу две dlfunc. т. е. указать в confIP2COUNTRY_BACKEND и
DLFUNC_GEOIP2 и DLFUNC_GEOIP. при этом первой будет использовать dlfunc
maxminddb, и только потом (в случае, если результат будет
неопределённым) dlfunc ip2country или geoip6 (в зависимости от того,
включена ли поддержка IPv6).

в случае использования DLFUNC_GEOIP2 в качестве значения
confIP2COUNTRY_BACKEND путь в файлу данных:
define(`confIP2COUNTRY_MAXMINDDB_FILE',
`/usr/local/share/GeoIP/GeoLite2-Country.mmdb')dnl

можно использовать как базу GeoLite2-Country.mmdb, так и базу
GeoLite2-City.mmdb

игнорирование ошибок в работе dlfunc (на данный момент времени
используетс в dlfunc maxminddb):
NO          - не игноировать ошибки
YES         - игноировать ошибки
define(`confIP2COUNTRY_DEFER_OK', `YES')dnl

в случае возникновения ошибок в работе dlfunc maxminddb (не удалось
прочитать файл базы, не удалось выделить память, не удалось извлечь
данные из результатов запроса) приём письма будет продолжен, а в лог
файл будет выведено сообщение об ошибке.

механизм определения континента по IP адресу
DLFUNC		- определение континента по IP адресу с помощью dlfunc
		ip2country
		при включенной поддержке IPv6 используется dlfunc
		geoipv6
		для использования dlfunc необходимо:
		собрать exim с EXPAND_DLFUNC
		собрать и установить GeoIP library
DLFUNC_GEOIP	- синоним DLFUNC
DLFUNC_GEOIPV6	- определение континента по IP адресу с помощью dlfunc
		geoipv6
		для использования dlfunc необходимо:
		собрать exim с EXPAND_DLFUNC
		собрать и установить GeoIP library
DLFUNC_GEOIP2	- определение континента по IP адресу с помощью dlfunc
		maxminddb
		для использования dlfunc необходимо:
		собрать exim с EXPAND_DLFUNC
		собрать и установить libmaminddb library
define(`confIP2CONTINENT_BACKEND', `DLFUNC_GEOIP')dnl



-- 
Best wishes
Victor Ustugov        mailto:victor на corvax.kiev.ua
public GnuPG/PGP key: https://victor.corvax.kiev.ua/corvax.asc
Skype ID: corvax_nb   JID: victor на corvax.kiev.ua




Подробная информация о списке рассылки Exim-conf