Страница 1 из 1
Exim&amavis&dspam
Добавлено: 2007-02-20 12:11:57
ExH
Стоит указанная связка.
Проблема в том, что 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
Добавлено: 2007-02-20 12:14:19
Alex Keda
и в чём проблема?
========
Код: Выделить всё
deny message = "No sender address."
condition = ${if eq{$sender_address}{}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
тех кто не принимает рикошеты, тоже вносят в блэк-листы.
Добавлено: 2007-02-20 12:25:22
ExH
Может я не верно объясняю.
К примеру.
домен: 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.
Добавлено: 2007-02-20 12:27:06
Alex Keda
юзеры где?
Вот по этому месту поиск и сделай.
Добавлено: 2007-02-20 12:33:45
ExH
Это Directadmin.
В /etc/virtual/название-домена/passwd находится список пользователей для этого домена.
Как его можно разбирать в acl?
А разве указание verify = recipient не говорит о том, что пропускать только существующих пользователей?
Добавлено: 2007-02-20 12:48:31
Alex Keda
а хрен его знает по какому принципу он проверяет.
Добавлено: 2007-02-20 13:23:29
ExH
И всё таки, может кто знает как разбирать это:
В /etc/virtual/название-домена/passwd находится список пользователей для этого домена.
в acl?
Добавлено: 2007-02-20 13:47:45
Alex Keda
никак, пока не скажешь какой формат файла - телепатов нету...
Добавлено: 2007-02-20 13:57:19
ExH
Логично.
Формат такой:
Код: Выделить всё
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
Заранее спасибо!
Добавлено: 2007-02-20 15:44:22
Alex Keda
пример из дефолтового конфига
Код: Выделить всё
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
Добавлено: 2007-02-20 15:48:39
ExH
Ну да.
На уровне транспортов разрулить можно, это понятно.
А можно ли разрулить на уровне acl?
До попадания в транспорты, просто сказать deny.
Добавлено: 2007-02-20 17:07:01
Alex Keda
это просто пример запроса.
Добавлено: 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;
}
И всё работает как надо.
Добавлено: 2007-02-21 8:51:05
ExH
Гость это я.
За час отсеялось 845 сообщений. Фантастика!
Добавлено: 2007-02-21 10:08:57
Alex Keda
мдя... запуск перла на каждое сообщение - жестоко.
Особенно при наличии встроенных средст поиска

Добавлено: 2007-02-21 10:20:34
ExH
Вполне возможно.
Можете поделиться одним из таких "встроенных методов" для моего случая?
Добавлено: 2007-02-21 10:27:38
Alex Keda
http://www.lissyara.su/?id=1209
конкретно - lsearch
запрос не дам - но когда-то писал, я вместо сасла использовал тупой поиск по файлу паролей. Пример был где-то в рассылке родного сайта exim`a
Добавлено: 2007-02-21 11:03:49
Alex Keda
век живи - век учись...
походу оно тока локальных узеров проверяет...
пришлось кондишен у себя так пеерписать:
Код: Выделить всё
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}}
Добавлено: 2007-02-21 11:21:18
Alex Keda
от ёпть...
за 20 минут - 94 реджекта
Добавлено: 2007-02-21 13:42:32
ExH
Вот и мне кажется что это отличный способ снизить нагрузку на сервер даже с учётом вызова perl в моём случае.
В директ админе перл полюбому вызывается для аутентификации и роутинга.
Добавлено: 2007-02-21 22:40:42
Alex Keda
во, допёрся до пункта касающегося нашего обсуждения.
http://gate.fwtrade.ru/lissyara/exim/sp ... ml#toc0334
инетерсен абзац сразу за листингом кода.
======
вкратце - проверяются пользователи через роутеры, которые могут различать проверку и роутинг для доставки.
либо у тя с роутингом не так, либо х.з...
==========
разбираться надо, короче...
Re: Exim&amavis&dspam
Добавлено: 2007-07-20 19:03:40
ExH
Теперь я знаю как можно решить это всё без 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 разбивать строчки по знаку : и проверять получившиеся части?
Re: Exim&amavis&dspam
Добавлено: 2007-07-20 20:17:39
Alex Keda
может быть стоит написать процедуру на перле?
===========
кстати - он не вызывает perl каждый раз.
загружает один раз при старте, и в дальнейшем просто вызывает функции...
клёво сделано

Re: Exim&amavis&dspam
Добавлено: 2007-07-21 15:25:10
ExH
А есть ли какая-нибудь возможность выводить результат работы conditions в ACL в лог?
Перл-то, конечно, уже в памяти,а вот скрипт нет. Его надо грузить, а это накладне расходы.
Так что хочется всё-таки на ACL всё это реализовать, ибо должно бть быстрее.
Хотя.. Может они этот конфиг преобразуют на лету в перл скрипт, и потом просто перлом исполняют?