Доброго времени суток.Имеется FreeBSD 6.2
EXIM 4.67Настраивал по статье http://www.lissyara.su/?id=1200
Несуществующие локальные пользователи, почему то не отрубаются ACL, а проходят до роутера и уже там отваливаются с ошибкой Unknown User.Части из конфига:
acl_check_rcpt:
# Allow all LOCAL rcpt, using standart IO
accept hosts = :# Проверяем недопустимые символы для локальных получателей:
deny local_parts = ^[.] : ^.*[@%!/|]
domains = +local_domains
message = "Incorrect symbol in address"# Проверяем недопустимые символы для нелокальных получателей:
deny local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
domains = !+local_domains
message = "Incorrect symbol in address"accept local_parts = postmaster
domains = +local_domains# Принимаем сообщения от тех, кто аутентифицировался:
accept authenticated = *# Рубим тех, кто в блеклисте
deny message = "you in blacklist - $dnslist_domain \n $dnslist_text"
dnslists = opm.blitzed.org : \
cbl.abuseat.org : \
bl.csma.biz : \
dynablock.njabl.org# Запрещаем тех, кто не обменивается приветственными сообщениями (HELO/EHLO)
deny message = "HELO/EHLO require by SMTP RFC"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}# Рубаем нах, тех, кто подставляет свой IP в HELO
deny message = "Your IP in HELO - access denied!"
hosts = * : !+relay_from_hosts
condition = ${if eq{$sender_helo_name}\
{$sender_host_address}{true}{false}}
# Рубаем тех, кто в HELO пихает мой IP
deny message = "main IP in your HELO! Access denied!"
condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *# Рубаем тех, кто в HELO пихает только цифры (не бывает хостов ТОЛЬКО из цифр)
deny message = "can not be only number in HELO!"
condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *# Рубаем хосты типа *adsl*; *dialup*; *pool*;....
# Нормальные люди с таких не пишут. Если будут
# проблемы - уберёте проблемный пункт (у меня клиенты
# имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
deny message = "your hostname is bad (adsl, poll, ppp & etc)."
condition = ${if match{$sender_host_name} \
{adsl|dialup|pool|peer|dhcp} \
{yes}{no}}warn
# ставим дефолтовую задержку в 30 секунд
set acl_m0 = 30swarn
# ставим задержку в 0 секунд своим хостам
hosts = +relay_from_hosts
set acl_m0 = 0s
warn
# пишем в логи задержку (если оно вам надо)
logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail \
from $sender_address to $local_part@$domain.
delay = $acl_m0# Если отправитель сообщения может быть проверен, то Next, иначе - deny
require verify = sender
message = "Unknown Sender"# Как я понял, письма, которые идут на несуществующих локальных пользователей
# должны рубиться здесь
accept
domains = +local_domains
endpass
verify = recipient
message = "This user is not exist on this MailServer"
# Final Rule
deny
message = "This server is not open relay"
up!
up!
>up!проверка получателя осуществляется в роутерах. если вам необходимо своё сообщение, в роутере проверки используйте cannot_route_message
>>up!
>
>проверка получателя осуществляется в роутерах. если вам необходимо своё сообщение, в роутере
>проверки используйте cannot_route_messageКак мне тогда узнать сколька реального спама я отсеял?
PS Под реальным спамом я понимаю спамовые сообщения пришедшие на существующих пользователей. Ведь при нынешнем подходе у меня в лог в основном валятся сообщения, что пойман спам на пользователя xxxxx@xxxx.ru ( а его то и нет). Хотя по логике неплохо было бы вначале проверить существование пользователя, а потом уже всякие HELO/EHLO, header, и тем более уж тело письма
>>>up!
>>
>>проверка получателя осуществляется в роутерах. если вам необходимо своё сообщение, в роутере
>>проверки используйте cannot_route_message
>Смотрите документацию как работает verify и в частности verify recipient.
Повторяю, <<проверка получателя осуществляется в роутерах.>>
Вам туда, куда вы давали ссылку.Для того чтобы сделать проверку, этому acl нужен роутер (обычно accept и обычно тот роутер, который вызывает транспорт доставки) который и проверит существование пользователя.
>Как мне тогда узнать сколька реального спама я отсеял?
>как хотите, exim безграничен
>PS Под реальным спамом я понимаю спамовые сообщения пришедшие на существующих пользователей.
>Ведь при нынешнем подходе у меня в лог в основном валятся
>сообщения, что пойман спам на пользователя xxxxx@xxxx.ru ( а его то
>и нет). Хотя по логике неплохо было бы вначале проверить существование
>пользователя, а потом уже всякие HELO/EHLO, header, и тем более уж
>тело письмаУ каждого спамборца своя логика :)
Где проверять и когда, это ваше личное дело, поставьте проверку пользователя в самом начале acl_smtp_rcpt
>У каждого спамборца своя логика :)Это точно.
>Где проверять и когда, это ваше личное дело, поставьте проверку пользователя в
>самом начале acl_smtp_rcptЯ и хотел так сделать.
Получается что мне надо вначале acl передать письмо роутеру, а потом вернуться в acl(в случае если пользователь есть) и продолжить проверку?т.е. acl как то привязывается к роутеру? Я просто не доконца понял схему acl-router-transport.
>[оверквотинг удален]
>
>>Где проверять и когда, это ваше личное дело, поставьте проверку пользователя в
>>самом начале acl_smtp_rcpt
>
>Я и хотел так сделать.
>Получается что мне надо вначале acl передать письмо роутеру, а потом вернуться
>в acl(в случае если пользователь есть) и продолжить проверку?
>
>т.е. acl как то привязывается к роутеру? Я просто не доконца понял
>схему acl-router-transport.Почитайте наконец документацию, слишком много нюансов чтобы утверждать тут коротко и однозначно. И ещё смотрите в дебаге на процесс, это даст вам чёткую картинку когда, по какому поводу и зачем вызываются роутеры именно в вашей конфигурации
>>т.е. acl как то привязывается к роутеру? Я просто не доконца понял
>>схему acl-router-transport.У меня exim работает с мускулом.
Написал вот такое правило в "acl_check_rcpt":
deny
message = "Sorry, the user was not found. Try again."
domains = +local_domains
condition = ${if eq{}{${lookup mysql{SELECT `maildir` FROM `mailbox` \
WHERE `username`='${quote_mysql:$local_part@$domain}'}}}{yes}{no}}
condition = ${if eq{}{${lookup mysql{SELECT `address` FROM `alias` \
WHERE `address`='${quote_mysql:$local_part@$domain}'}}}{yes}{no}}Соответственно е-мейлы которые пришли на несуществующий ящик - рубятся