Страница 1 из 1

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

Добавлено: 2017-06-27 16:12:22
dalt
Раньше был сервер на постфиксе, там я делал необходимые мне блокировки по хосту в 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"

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

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

Добавлено: 2017-06-28 11:57:29
xM
Ой, тут долго можно писать многократно написанное и переписанное, в том числе и на этом сайте, на предмет синтаксического разбора SMTP сессии на стадии RCPT. При желании вы это и сами без труда отыщете.
Конкретно по вашей теме. Согласно RFC HELO должен быть обязательно, а имя хоста нет. Если в качестве HELO используется IP адрес, а это автоматически означает, что имя хоста отсутствует, то он должен быть представлен в т.н. literal notaion, то заключён в квадратные скобки.
Принадлежность строки к IP-адресу лучше всего проверять функцией Exim $isip, которая поддерживает и IPv4 и IPv6.
И H= это HELO.

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

Добавлено: 2017-06-28 15:19:02
dalt
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 адрес (которого не должно быть у нормального почтового сервера) - блокируется всё подряд.

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

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

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

Добавлено: 2017-06-28 15:50:45
dalt
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 часть строки. Или тут косяк в работе экзима?

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

Добавлено: 2017-06-28 17:44:57
xM
Включите режим отладки - там будут видны раскрываемые строки в правилах.