EXIM, acls, блокировка по sender_host_name

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
dalt
рядовой
Сообщения: 21
Зарегистрирован: 2012-01-17 9:56:53

EXIM, acls, блокировка по sender_host_name

Непрочитанное сообщение dalt » 2017-06-27 16:12:22

Раньше был сервер на постфиксе, там я делал необходимые мне блокировки по хосту в check_client_access regexp:/usr/local/etc/postfix/regexp_client где в файле regexp_client был список тех, кого блокировать. Список я составлял сам, на основе логов, блокировал по шаблонам регулярных выражений всё, что не могло быть адекватным почтовым сервисом, в общем такая была задача. И всё работало так, как мне нужно.

Сейчас сделал exim, он давно работает, но сейчас активно полез спам, и назрела необходимость его почикать. Помогите разобраться в том, что есть что.

В логах в соединениях есть строка, например, H=odfs.com.ua (m.odfs.com.ua) [213.155.6.130] - где первое это host name, в круглых скобках это HELO, ну и ip адрес в квадратных. (Насколько я это понял)
Бывают соединения где host name отсутствует, есть только HELO и IP. (вида H=(abcde.com) [123.123.123.123])
Бывают соединения где отсутствует HELO (вида H=abcde.com [123.123.123.123])

Логика подсказывает, что нормальный почтовый сервер будет иметь все три пункта в наличии (в постфиксе даже вопроса такого не возникало, на этапе smtp подключения показывало хост и айпи). В синтаксисе кондишенов я еще тоже не особо разбираюсь.
Подскажите как записать condition для acl где будет резаться подключение с отсутствующим host name и отсутствующим helo. А если так делать не стоит - то почему?

Ну и не понятна еще одна вещь

Я сделал правило, которое блокирует хосты вида H=ip-109-91-111-73.hsi12.unitymediagroup.de

deny message = "spam rule 2"
condition = ${if match{$sender_host_name}{[0-9]*-[0-9]*-[0-9]*-[0-9]*} {yes}{no}}

Оно работает адекватно.

Попытался таким же образом порезать те хосты, где айпи написан канонически с разделением точками.
deny message = "spam rule 3"
condition = ${if match{$sender_host_name}{[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.} {yes}{no}}

Но это правило начало резать всё подряд, например H=omp.email.farfetch.com [199.7.206.186] F=<farfetch@email.farfetch.com> rejected RCPT <ttttt@tttttttt.ru>: "spam rule 3"

Вот тут мне совершенно непонятно почему это происходит. Что я понимаю неправильно?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

EXIM, acls, блокировка по sender_host_name

Непрочитанное сообщение xM » 2017-06-28 11:57:29

Ой, тут долго можно писать многократно написанное и переписанное, в том числе и на этом сайте, на предмет синтаксического разбора SMTP сессии на стадии RCPT. При желании вы это и сами без труда отыщете.
Конкретно по вашей теме. Согласно RFC HELO должен быть обязательно, а имя хоста нет. Если в качестве HELO используется IP адрес, а это автоматически означает, что имя хоста отсутствует, то он должен быть представлен в т.н. literal notaion, то заключён в квадратные скобки.
Принадлежность строки к IP-адресу лучше всего проверять функцией Exim $isip, которая поддерживает и IPv4 и IPv6.
И H= это HELO.
IT voodoo blog https://kostikov.co

dalt
рядовой
Сообщения: 21
Зарегистрирован: 2012-01-17 9:56:53

EXIM, acls, блокировка по sender_host_name

Непрочитанное сообщение dalt » 2017-06-28 15:19:02

xM писал(а): И H= это HELO.
Практика показывает, что это не просто HELO

например подключаюсь с одного из серверов (не почтового) своих на 25 порт почтовика

root@gate02:/home/dalt # telnet mail.myserver.ru 25
Trying 212.xxx.xxx.130...
Connected to mail.myserver.ru.
Escape character is '^]'.
220 mail.myserver.ru ESMTP
helo test.test.test
250 mail.myserver.ru Hello gate-fxp0.server.ru [212.112.132.123]

в логах вижу
H=gate-fxp0.server.ru (test.test.test) [212.112.132.123]
connection from gate-fxp0.server.ru (test.test.test) [212.112.132.123] closed by QUIT

т.е. первая часть из трех в строке H= это host name

Отправлено спустя 8 минут 7 секунд:
xM писал(а): Если в качестве HELO используется IP адрес, а это автоматически означает, что имя хоста отсутствует
То это автоматически означает, что это спамер :) Потому что все нормальные почтовые сервера имеют нормальный хост нейм и нормальное HELO.

Я успешно использовал механизм блокировки спамеров по хост нейму в postfix. Мне нужен простой пример, как это делается в экзим. Так что мой вопрос в силе. Частично я уже разобрался, но у меня нет понимания почему если в sender_host_name задать шаблон содержащий IP адрес (которого не должно быть у нормального почтового сервера) - блокируется всё подряд.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

EXIM, acls, блокировка по sender_host_name

Непрочитанное сообщение xM » 2017-06-28 15:23:38

dalt писал(а): Практика показывает, что это не просто HELO
Да, вы правы, там не всегда так однозначно. Вот тут описано что там пишется.
Но, в любом случае, искать строку именно из HELO вам надо в переменной $sender_helo_name.
IT voodoo blog https://kostikov.co

dalt
рядовой
Сообщения: 21
Зарегистрирован: 2012-01-17 9:56:53

EXIM, acls, блокировка по sender_host_name

Непрочитанное сообщение dalt » 2017-06-28 15:50:45

xM писал(а):
dalt писал(а): Практика показывает, что это не просто HELO
Да, вы правы, там не всегда так однозначно. Вот тут описано что там пишется.
Но, в любом случае, искать строку именно из HELO вам надо в переменной $sender_helo_name.
меня интересует не sender_HELO_name, а sender_HOST_name

в частности есть хосты вида ip-109-91-111-73.hsi12.unitymediagroup.de и есть хосты вида ip-109.91.111.73.hsi12.unitymediagroup.de

Правило
deny message = "spam rule 2"
condition = ${if match{$sender_host_name}{[0-9]*-[0-9]*-[0-9]*-[0-9]*} {yes}{no}}

успешно блокирует хосты вида ip-109-91-111-73.hsi12.unitymediagroup.de

правило

deny message = "spam rule 3"
condition = ${if match{$sender_host_name}{[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.} {yes}{no}}

Должно блокировать ip-109.91.111.73.hsi12.unitymediagroup.de

А блокирует то, что не надо, даже вот такое H=omp.email.farfetch.com [199.7.206.186] F=<farfetch@email.farfetch.com> rejected RCPT <ttttt@tttttttt.ru>: "spam rule 3"

Меня интересует почему это происходит, потому что такого быть просто не должно, в моем понимании.

Такое может быть, если правило по шаблону проверяет всю строку целиком H=omp.email.farfetch.com [199.7.206.186], включая IP адрес в квадратных скобках. Но это ведь ерунда, так быть просто не должно, ведь sender_host_name - должен обрабатывать именно host name часть строки. Или тут косяк в работе экзима?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

EXIM, acls, блокировка по sender_host_name

Непрочитанное сообщение xM » 2017-06-28 17:44:57

Включите режим отладки - там будут видны раскрываемые строки в правилах.
IT voodoo blog https://kostikov.co