Exim&amavis&dspam

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Exim&amavis&dspam

Непрочитанное сообщение ExH » 2007-02-20 12:11:57

Стоит указанная связка.

Проблема в том, что exim пропускает до amavis'a несуществующи пользователей для существующих доменов, а amavis в свою очередь проверяет эту почту через dspam и clamav и в конце радостно говорит Unknown User.

Хочется отсекать несуществующих пользователей на уровне acl deny.

exim.conf

Код: Выделить всё

begin acl

check_recipient:

accept hosts = :

deny domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]

deny domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

deny message = "HELO/EHLO required by SMTP RFC."
condition = ${if eq{$sender_helo_name}{}{yes}{no}}

deny message = "can not be only numbers in HELO!."
condition = ${if match{$sender_helo_name}{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *

deny message = "main IP in your HELO!."
condition = ${if match{$sender_helo_name}{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *

deny message = "No sender address."
condition = ${if eq{$sender_address}{}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *

deny message = "Your host blacklisted."
sender_domains = +blacklist_domains

deny message = "Your host blacklisted."
domains = +blacklist_domains

deny message = "No postmaster here."
local_parts = postmaster
domains = +local_domains

deny message = "No abuse here."
local_parts = abuse
domains = +local_domains

require verify = sender

accept hosts = +auth_relay_hosts
condition = ${if eq {$interface_port}{587} {yes}{no}}
endpass
message = relay not permitted, authentication required
authenticated = *

accept domains = +local_domains
endpass
message = "Unknown User."
verify = recipient

accept domains = +relay_domains
endpass
message = "No relay here."
verify=recipient

accept hosts = +relay_hosts

accept hosts = +auth_relay_hosts
endpass
message = "authentication required."
authenticated = *

deny message = relay not permitted 

Хостинговая компания 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/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-20 12:14:19

и в чём проблема?
========

Код: Выделить всё

deny message = "No sender address."
condition = ${if eq{$sender_address}{}{yes}{no}}
hosts = !127.0.0.1 : !localhost : * 
тех кто не принимает рикошеты, тоже вносят в блэк-листы.
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-20 12:25:22

Может я не верно объясняю.
К примеру.

домен: domain.com
один пользователь: user@domain.com

отправляем письмо от xxx@spam.com пользователю nouser@domain.com.

происходит следующее:

1. Emim получает письмо и передаёт его amavis
2. Amavis вызывает dspam.
3. Dspam обрабатывает письмо.
4. Amavis передаёт исьмо exim.
5. И вот тут exim говорит amavis'у user unknown.

Хочется чтобы exim уже на первом шаге сказал отправителю письма user unknown.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-20 12:27:06

юзеры где?
Вот по этому месту поиск и сделай.
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-20 12:33:45

Это Directadmin.

В /etc/virtual/название-домена/passwd находится список пользователей для этого домена.
Как его можно разбирать в acl?

А разве указание verify = recipient не говорит о том, что пропускать только существующих пользователей?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-20 12:48:31

а хрен его знает по какому принципу он проверяет.
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-20 13:23:29

И всё таки, может кто знает как разбирать это:
В /etc/virtual/название-домена/passwd находится список пользователей для этого домена.
в acl?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-20 13:47:45

никак, пока не скажешь какой формат файла - телепатов нету...
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-20 13:57:19

Логично.

Формат такой:

Код: Выделить всё

user_1:94Jy2Jr084PQg:557:12::/home/xxx/imap/xxx.ru/user_1:/bin/false
user_2:94Jy2Jr084PQg:557:12::/home/xxx/imap/xxx.ru/user_2:/bin/false
Заранее спасибо!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-20 15:44:22

пример из дефолтового конфига

Код: Выделить всё

system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup{$local_part}lsearch{/etc/aliases}}
  user = mailnull
  group = mail
  file_transport = address_file
  pipe_transport = address_pipe
ссылка на документацию http://www.lissyara.su/?id=1209
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-20 15:48:39

Ну да.
На уровне транспортов разрулить можно, это понятно.

А можно ли разрулить на уровне acl?

До попадания в транспорты, просто сказать deny.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-20 17:07:01

это просто пример запроса.
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Непрочитанное сообщение Гость » 2007-02-21 8:43:50

Спасибо за помощь!

Всё решилось так:

exim.conf

Код: Выделить всё

perl_startup = do '/etc/exim.pl';

deny message = "No user here"
        domains = +local_domains
        set acl_m1 = ${perl{is_user_exists}}
        condition = ${if eq{acl_m1}{0}{1}}
exim.pl

Код: Выделить всё

sub is_user_exists
{
  $my domain = Exim::expand_string( '$domain' );
  $my user = Exim::expand_string( '$local_part' );

  if( "" eq $domain ) {
    return 0;
  }

  open( PASSWD, "/etc/virtual/$domain/passwd" ) || return 0;

  while( $entry = <PASSWD> ) {

    ( $usr, $pass ) = split(( /:/, $entry );

    if( $usr eq $user ) {
      close( PASSWD );
      return 1;
    }

    close( PASSWD );

    return 0;
}
И всё работает как надо.

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-21 8:51:05

Гость это я.
За час отсеялось 845 сообщений. Фантастика!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-21 10:08:57

мдя... запуск перла на каждое сообщение - жестоко.
Особенно при наличии встроенных средст поиска :)
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-21 10:20:34

Вполне возможно.

Можете поделиться одним из таких "встроенных методов" для моего случая?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-21 10:27:38

http://www.lissyara.su/?id=1209
конкретно - lsearch
запрос не дам - но когда-то писал, я вместо сасла использовал тупой поиск по файлу паролей. Пример был где-то в рассылке родного сайта exim`a
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-21 11:03:49

век живи - век учись...
походу оно тока локальных узеров проверяет...
пришлось кондишен у себя так пеерписать:

Код: Выделить всё

        accept  domains = +local_domains
                endpass
                message = "In my mailserver not stored this user"
#               verify  = recipient
                condition = ${if eq{${lookup mysql{SELECT 1 FROM `alias` WHERE \
                        `address`=LCASE('${quote_mysql:$local_part@$domain}') OR \
                        `address`=LCASE('${quote_mysql:@$domain}') AND `active`='1' \
                        ORDER BY SUBSTRING_INDEX(`address`,'@',1) DESC LIMIT 1}}}{1}{yes}{no}}
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-21 11:21:18

от ёпть...
за 20 минут - 94 реджекта
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Непрочитанное сообщение ExH » 2007-02-21 13:42:32

Вот и мне кажется что это отличный способ снизить нагрузку на сервер даже с учётом вызова perl в моём случае.

В директ админе перл полюбому вызывается для аутентификации и роутинга.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-02-21 22:40:42

во, допёрся до пункта касающегося нашего обсуждения.
http://gate.fwtrade.ru/lissyara/exim/sp ... ml#toc0334
инетерсен абзац сразу за листингом кода.
======
вкратце - проверяются пользователи через роутеры, которые могут различать проверку и роутинг для доставки.
либо у тя с роутингом не так, либо х.з...

==========
разбираться надо, короче...
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: Exim&amavis&dspam

Непрочитанное сообщение ExH » 2007-07-20 19:03:40

Теперь я знаю как можно решить это всё без perl.

Код: Выделить всё

deny message = "Error. Unknown user. ACL.
        domains = +local_domains
        hosts      = !+relay_hosts
        condition = ${if eq{} {$if exists{/etc/virtual/${domain}/passwd}{${lookup{$local_part}lsearch{/etc/virtual/${domain}/passwd}}}}}{yes}{no}}
Всё бы замечательно, если бы на одном из серверов клиент не захотел включить catch-all, который этой проверкой, естественно не отлавливается.

Собственно вопрос сейчас стоит как бы обработать catch-all.
Данные о catch-all записывается в файл aliases, который лежит там же где и passwd.

Формат:

catch-all отключен:
-------------------------
domain: domain
*: :fail:
-------------------------

catch-all включен:
-------------------------
domain:domain
*: dompop@domain.ru
-------------------------

Дык вот вопрос. Можно ли с помощью lsearch разбивать строчки по знаку : и проверять получившиеся части?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Exim&amavis&dspam

Непрочитанное сообщение Alex Keda » 2007-07-20 20:17:39

может быть стоит написать процедуру на перле?
===========
кстати - он не вызывает perl каждый раз.
загружает один раз при старте, и в дальнейшем просто вызывает функции...
клёво сделано :)
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: Exim&amavis&dspam

Непрочитанное сообщение ExH » 2007-07-21 15:25:10

А есть ли какая-нибудь возможность выводить результат работы conditions в ACL в лог?
Перл-то, конечно, уже в памяти,а вот скрипт нет. Его надо грузить, а это накладне расходы.
Так что хочется всё-таки на ACL всё это реализовать, ибо должно бть быстрее.

Хотя.. Может они этот конфиг преобразуют на лету в перл скрипт, и потом просто перлом исполняют?