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

Victor Ustugov victor на corvax.kiev.ua
Вс Ноя 18 23:24:21 EET 2018


приветствую

реализовано использование номеров AS при:

- фильтрации писем по хосту отправителя;
- фильтрации писем по комбинации хоста отправителя, адреса отправителя и
адреса получателя;
- ограничении использования SMTP аутентификации по комбинации SMTP
логина и хоста отправителя.

в всех случаях сначала производится поиск по IP адресу хоста
отправителя, потом по имени хоста отправителя, потом по номеру AS, потом
по стране и потом уже по континенту (в случае включения в явном виде
использования фильтрации по номеру AS, стране и континенту).


проверка номера AS хоста отправителя включается переменной
confCHECK_ACCESS_RELAY_ASN:

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

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

отличием confCHECK_ACCESS_RELAY_ASN от confCHECK_ACCESS_RELAY является
лишь то, что вместе адреса хоста отправителя или имени хоста отправителя
нужно указывать номер AS хоста отправителя с префиксом "AS".

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

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

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

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

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

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

пример:
AS44600	: defer	: message defered. contact postmaster@$qualify_domain
AS15169	: pause=20 warn

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


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

NO		- не проводить проверку
REJECT		- возврат клиенту кода 5xx
REJECT_ALL	- отказ в приеме письма для всех получателей
QUARANTINE	- принять письмо с сохранением в карантин без доставки
		получателям
QUARANTINE_OTHER - при отказе в приеме письма текущему получателю и
		наличии других получателей письмо доставляется в
		карантин без доставки этим остальным получателям
DEFER		- возврат клиенту кода 451
WARN		- вывод в лог файл предупреждения
GREYLIST=XX	- добавить XX баллов к счетчику опционального
		грейлистинга
REJECT=XX	- добавить XX баллов к счетчику опционального reject'а
DELAY=XX	- задержка XX секунд перед ответом на RCPT TO
define(`confCHECK_ACCESS_COMPAT_RELAY_ASN', `NO')

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

отличием confCHECK_ACCESS_COMPAT_RELAY_ASN от
confCHECK_ACCESS_COMPAT_RELAY является лишь то, что вместе адреса хоста
отправителя или имени хоста отправителя нужно указывать номер AS хоста
отправителя с префиксом "AS".

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

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

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

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

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

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

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

пример:
AS8856<@>sender на ukr.net<@>recipient на local.domain.tld : ok
\N^AS4134<@>.+ на ukr.net<@>.+$\N : deny : Access denied : Message with
ukr.net sender address domain from China


ограничения использования SMTP аутентификации по комбинациям логинов и
номеров AS хостов отправителей:
NO	- не использовать ограничения
YES	- не использовать ограничения
define(`confSMTP_AUTH_RELAY_ASN', `NO')

confSMTP_AUTH_RELAY_ASN является расширением confSMTP_AUTH_RELAY и без
неё не используется.

как и ограничения использования SMTP аутентификации по комбинации логина
и IP адреса, сети, имени хоста, страны и континента хоста отправителя,
ограничения использования SMTP аутентификации по комбинации логина
номера AS хоста отправителя указываются в файле access-auth-relay.

формат файла access-auth-relay:

login<@>ASXXXX	: action : message : log_message

где
login		- SMTP логин
XXXX		- номер AS хоста отправителя
action		- действие
message		- ответ SMTP клиенту (может отсутствовать)
log_message	- сообщение в лог файл (может отсутствовать)

возможные действия:
ok или skip	- исключение из проверки для указанной комбинации SMTP
		логина и номера AS хоста отправителя
warn		- вывод предупреждения в файл протокола и добавление
		поля заголовка в письмо
reject или deny	- отказ в приеме сообщения
drop		- отказ в приеме сообщения с обрывом соединения
defer		- возврат временной ошибки
discard		- приём письм без доставк получателю
quarantine	- принять письмо с сохранением в карантин без доставки
		получателям
noquarantine	- не дополнять действие deny (и reject) действием
		quarantine в случае использования персональных
		карантинов
greylist=XX	- добавление XX баллов к счетчику опционального
		грейлистинга
reject=XX	- добавление XX баллов к счетчику опционального reject'а
delay=XX	- задержка на XX секунд перед продолжением обработки
		сообщения
pause=XX	- синоним delay=XX
submit_mysql	- занесение записи о хосте в базу MySQL (только в
		расширенной версии)
submit_sqlite	- занесение записи о хосте в базу SQLite (только в
		расширенной версии)
submit_rbl	- занесение записи о хосте в DNSBL (только в расширенной
		версии)

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

примеры:
user на domain.tld<@>AS44600	: ok
\N^user на domain\.tld<@>.+$\N	: defer


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

DNS_CYMRU		- определение номера AS по DNS зонам
			origin.asn.cymru.com и origin6.asn.cymru.com
DNS_SPAMEATINGMONKEY	- определение номера AS по DNS зоне
			origin.asn.spameatingmonkey.net (только IPv4)
WHOIS_RADB		- определение номера AS по данным whois.radb.net
WHOIS_CYMRU		- определение номера AS по данным
			whois.cymru.com
WHOIS_RIPE		- определение номера AS по данным whois.ripe.net
			(только Европа)
define(`confIP2ASN_BACKEND', `DNS_CYMRU DNS_SPAMEATINGMONKEY WHOIS_RADB
WHOIS_CYMRU WHOIS_RIPE')

как видно, вариантов предостаточно. но т. к. ещё не собраны данные о
надёжности и точности каждого из них, по умолчанию будут использованы
все вышеперечисленные, пока номер AS не будет получен.

т. к. кеширование полученных номеров AS не реализовано, то предпочтение
пока отдаётся механизмам DNS_CYMRU и DNS_SPAMEATINGMONKEY, использующим
${lookup dnsdb, что подразумевает возможность использования кеширования
средствами DNS сервера.

к тому же, интенсивность запросов к whois серверам может быть ограничена
с их стороны.

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


# host -t txt `ipv6calc 8.8.4.4 --in ipv4addr --out revipv4 | sed
's/.in-addr.arpa.//'`.origin.asn.cymru.com | sed 's/"//' | awk '{print $4}'
15169


# host -t txt `ipv6calc 2001:4860:4860::8844 --in ipv6addr --out
revnibbles.arpa | sed 's/.ip6.arpa.//'`.origin6.asn.cymru.com | sed
's/"//' | awk '{print $4}'
15169


# exim -be '${sg{${sg{${extract{1}{|}{${lookup dnsdb{>\n;
defer_never,txt=${reverse_ip:8.8.4.4}.origin.asn.cymru.com}}}}}{\N^\s*\N}{AS}}}{\N\s+$\N}{}}'
AS15169


# exim -be '${sg{${sg{${extract{1}{|}{${lookup dnsdb{>\n;
defer_never,txt=${reverse_ip:2001:4860:4860::8844}.origin6.asn.cymru.com}}}}}{\N\s+$\N}{}}}{\N^\s*\N}{AS}}'
AS15169


# host -t txt `ipv6calc 8.8.4.4 --in ipv4addr --out revipv4 | sed
's/.in-addr.arpa.//'`.origin.asn.spameatingmonkey.net | awk -F"|"
'{print $2}'
 AS15169


# exim -be '${sg{${sg{${extract{2}{|}{${lookup dnsdb{>\n;
defer_never,txt=${reverse_ip:8.8.4.4}.origin.asn.spameatingmonkey.net}}}}}{\N^\s+\N}{}}}{\N\s+$\N}{}}'
AS15169


# whois -h whois.radb.net 8.8.4.4 | awk -F: '{if($1=="origin")print $2}'
| head -n 1
     AS15169


# echo "8.8.4.4" | netcat whois.radb.net 43 | awk -F:
'{if($1=="origin")print $2}' | head -n 1
     AS15169


# whois -h whois.radb.net 2001:4860:4860::8844 | awk -F:
'{if($1=="origin")print $2}' | head -n 1
     AS15169


# echo "2001:4860:4860::8844" | netcat whois.radb.net 43 | awk -F:
'{if($1=="origin")print $2}' | head -n 1
     AS15169


# exim -be '${if
match{${readsocket{inet:whois.radb.net:43}{8.8.4.4\n}{20s}{\n}{socket
failure}}}{\N^(?:.*\n)*?origin:\s*(\S+)\N}{$1}{}}'
AS15169


# exim -be '${if
match{${readsocket{inet:whois.radb.net:43}{2001:4860:4860::8844\n}{20s}{\n}{socket
failure}}}{\N^(?:.*\n)*origin:\s*(\S+)\N}{$1}{}}'
AS15169


# whois -h whois.cymru.com 8.8.4.4 | tail -n 1 | awk '{print $1}'
15169


# echo "8.8.4.4" | netcat whois.cymru.com 43 | tail -n 1 | awk '{print $1}'
15169


# whois -h whois.cymru.com 2001:4860:4860::8844 | tail -n 1 | awk
'{print $1}'
15169


# echo "2001:4860:4860::8844" | netcat whois.cymru.com 43 | tail -n 1 |
awk '{print $1}'
15169


# exim -be '${if
match{${readsocket{inet:whois.cymru.com:43}{8.8.4.4\n}{20s:shutdown=no}{\n}{socket
failure}}}{\N^(?:AS\s.*\n)(\d+)\s\N}{AS$1}{}}'
AS15169


# exim -be '${if
match{${readsocket{inet:whois.cymru.com:43}{2001:4860:4860::8844\n}{20s:shutdown=no}{\n}{socket
failure}}}{\N^(?:AS\s.*\n)(\d+)\s\N}{AS$1}{}}'
AS15169


# echo "193.0.6.135" | netcat whois.ripe.net 43 | awk -F:
'{if($1=="origin")print $2}' | head -n 1
         AS3333


# echo "2001:67c:2e8:22::c100:687" | netcat whois.ripe.net 43 | awk -F:
'{if($1=="origin")print $2}' | head -n 1
         AS3333


# exim -be '${if
match{${readsocket{inet:whois.ripe.net:43}{193.0.6.135\n}{20s:shutdown=no}{\n}{socket
failure}}}{\N^(?:.*\n)*origin:\s*(\S+)\N}{$1}{}}'
AS3333


# exim -be '${if
match{${readsocket{inet:whois.ripe.net:43}{2001:67c:2e8:22::c100:687\n}{20s:shutdown=no}{\n}{socket
failure}}}{\N^(?:.*\n)*origin:\s*(\S+)\N}{$1}{}}'
AS3333


после релиза exim 4.92 будут доступны ${readsocket с tls=yes и ${extract
json, тогда станет доступным ещё один механизм определения номера AS по
IP адресу:

API_IPTOASN - определение номера AS по данным https://api.iptoasn.com/


пример:


# curl https://api.iptoasn.com/v1/as/ip/8.8.4.4
{"announced":true,"as_country_code":"US","as_description":"GOOGLE -
Google
LLC","as_number":15169,"first_ip":"8.8.4.0","ip":"8.8.4.4","last_ip":"8.8.4.255"}


# curl https://api.iptoasn.com/v1/as/ip/2001:4860:4860::8844
{"announced":true,"as_country_code":"US","as_description":"GOOGLE -
Google
LLC","as_number":15169,"first_ip":"2001:4860:4806::","ip":"2001:4860:4860::8844","last_ip":"2001:4860:ffff:ffff:ffff:ffff:ffff:ffff"}


-- 
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