Проблема с spamooborona 1024 + exim

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
almos
ефрейтор
Сообщения: 55
Зарегистрирован: 2006-03-31 0:24:24
Контактная информация:

Проблема с spamooborona 1024 + exim

Непрочитанное сообщение almos » 2009-09-24 12:10:51

Доброго всем времени суток.

Есть следующая проблема. Не могу заставить работать спамооборону 1024 в режиме SMTP proxy.
Письма проходят через спамороборону, но никаких хидеров (X-Spam-Flag) отражающих правильность работы фильтра не обнаруживается.

На официальном сайте и в документации рекомендуют пересобирать exim, но мне сей вариант никак не подходит.
Хотелось бы настроить все это хозяйство используя мощь и гибкость конфигурационных возможностей экзма :).

Итак, целевая система CentOS 5.2 + exim с авторизацией в Win2k AD.
Спасооборону ставил из rpm пакета.

Как я уже и говорил, письма проходят через фильтр, о чем я могу судить по следующей сигнатуре присутствующей во всех полученных письмах:

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

Received: from my.host.ua () 
	by  (Spamooborona SMTP proxy); Thu, 24 Sep 2009 01:23:32 +0200 (EEST)
Вот мои роутеры:

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

dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

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

spam_yandex_route:
  driver = manualroute
  transport = spamoborona
  domains = my.host.ua
  condition = ${if eq {$interface_port}{25}{yes}{no}}
  #address_test = false
  no_verify
  route_data = localhost
  self = send

localuser:
  driver = accept
  check_local_user
  transport = local_delivery
  cannot_route_message = Unknown user

ldapuser:
  driver = accept
  condition = ${if eq{}{${lookup ldapdn{LDAP_AUTH ldap:///CN=Users,dc=ksu,dc=lan??sub?(&(SAMAccountname=${quote_ldap:$local_part}))}}}{no}{yes}}
  transport = ldap_delivery

Вот транспорты:

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

remote_smtp:
  driver = smtp

spamoborona:
  driver = smtp
  allow_localhost
  port = 1125

local_delivery:
  driver = appendfile
  check_string = ""
  create_directory
  delivery_date_add
  directory = /usr/home/${local_part}/Maildir
  directory_mode = 770
  envelope_to_add
  group = mail
  maildir_format
  maildir_tag = ,S=$message_size
  message_prefix = ""
  message_suffix = ""
  mode = 0660

address_pipe:
  driver = pipe
  return_output

address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

address_reply:
  driver = autoreply

ldap_delivery:
    driver = appendfile
    check_string = ""
    create_directory
    delivery_date_add
    directory = /var/spool/mail/${local_part}/Maildir
    directory_mode = 770
    envelope_to_add
    maildir_use_size_file
    group = exim
    maildir_format
    maildir_tag = ,S=$message_size
    message_prefix = ""
    message_suffix = ""
    mode = 0660
    return_path_add
Для корректного приема писем были изменены acl'ы:

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

acl_check_rcpt:
accept  hosts = localhost:127.0.0.1
Вот мой spam.ini

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

general.Limit: 64

# Define verbose level - max level is 3 (debug info will be logged).
general.log_level: 3

# accept mails w/o checks when Spamooborona servers aren't responding
general.accept_failures: 1

general.verbose: 2

spam.Syslog: 0
spam.fnLog: /var/log/sp-proxy.log

general.collect_statistics: 1

subject.label: SPAM
subject.show_score: 1
Вот что было поставлено с пакетом:

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

rpm -ql spamooborona1024_proxy
/etc/init.d/sp-proxy
/etc/spamooborona/SO1024-License_Eng.txt
/etc/spamooborona/SO1024-License_Windows-1251.txt
/etc/spamooborona/i18n/so1024ctl.i18n.ru_RU.KOI8-R
/etc/spamooborona/postinstall
/etc/spamooborona/preremove
/etc/spamooborona/spam.ini
/usr/sbin/so1024ctl
/usr/sbin/sp-proxy
Насколько понятно из описания, спасооборона 1024 отправляет первые general.Limit на сервера яндекса для анализа, и возвращает результат. Поэтому я начал изучать поставляемый бинарник /usr/sbin/sp-proxy

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

strings /usr/sbin/sp-proxy | grep ya
gethostbyaddr
so-plus.yandex.ru:2525
Что значит, возможно so-plus.yandex.ru:2525 юзается для отправки почты на сервера яндекса.

Начал проверять tcpdump'ом. Но пакеты туда не ходят.
В фаерволе -

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

iptables -A OUTPUT -p ALL -o eth1 -j ACCEPT
eth1 - внешний интерфейс.

Начал ковырять strace'ом.
И опять же засада - ничего кроме поллинга не замечено.

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

poll([{fd=4, events=POLLIN|POLLPRI}], 1, 5000) = 1 ([{fd=4, revents=POLLIN}])
accept(4, {sa_family=AF_INET, sin_port=htons(60667), sin_addr=inet_addr("127.0.0.1")}, [16]) = 7
clone(child_stack=0xb7eb44a4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb7eb4bd8, {entry_number:6, base_addr:0xb7eb4b90, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb7eb4bd8) = 10477
В логах какая-то активность есть, но толку от нее никакого нет :)

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

tail /var/log/maillog

Sep 24 15:08:29 ksu sp-proxy-agent[10534]: Starting ESMTP protocol. Host name is: my.host.ua
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN SND: 220  ESMTP Spamooborona proxy
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN RCV: EHLO my.host.ua
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN SND: 250-
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN RCV: MAIL FROM:<blah@host1.com> SIZE=2934
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN SND: 250 OK
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN RCV: RCPT TO:<foo@my.host.ua>
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN SND: 250 Accepted
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN RCV: DATA
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN SND: 354 Enter message, ending with "." on a line by itself
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: Outgoing mail skipped, origin=127.0.0.1
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN SND: 250 OK id=1Mqn7d-0002kd-3W
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN RCV: QUIT
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: IN SND: 221 my.host.ua closing connection
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: Protocol successful done.
Подскажите где еще копать и что еще можно сделать дабы завести сей аццкий антиспам ? :)

Спасибо.

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

almos
ефрейтор
Сообщения: 55
Зарегистрирован: 2006-03-31 0:24:24
Контактная информация:

Re: Проблема с spamooborona 1024 + exim

Непрочитанное сообщение almos » 2009-09-25 1:19:36

Йоу!

Походу решил проблему :smile:.

Обратил внимание на строчку в ранее приведенном логе
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: Outgoing mail skipped, origin=127.0.0.1
Погуглил по "Outgoing mail skipped" и вуаля! Товарищ (http://case.net.ru/tag/spamooborona/) столкнулся с сей проблемой только с fetchmail.

Оказывается нужно слать почту не на локальный интерфейс (127.0.0.1) а на внешний, который слушает exim

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

local_interfaces = <; [127.0.0.1]:1025; [127.0.0.1]:25; 111.111.111.111; 10.2.100.1
111.111.111.111 - внешний ip

Вооружившись доками http://www.lissyara.su/?id=1220 и http://www.lissyara.su/?id=1230

меняем роутер

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

spam_yandex_route:
  driver = manualroute
  transport = spamoborona
  domains = my.domain.ua
  condition = ${if eq {$interface_port}{25}{yes}{no}}
  no_verify
  route_data = my.domain.ua
  self = send
обратите внимание на директиву

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

route_data = my.domain.ua
и транспорт:

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

spamoborona:
  driver = smtp
  port = 1125
  interface = 111.111.111.111
тут не обделите вниманием директиву

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

interface = 111.111.111.111
Ура! Письма пошли на проверку на серваки йандекса :smile: что подтверждают радостно бегущие строчки в выводе tcpdump с характерными доменными именами.

В результате получаем письму уже проверенную и с заголовками

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

X-Spam-Ystatus: hits= 1.20
X-Spam-Flag: NO
X-Spam-Yversion: Spamooborona-3.0

З.Ы.1.
strace дал интересные результаты
как оказываеццо, sp-proxy ищет сокет от демона nscd а также /etc/ld.so.preload

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

# strace /usr/sbin/sp-proxy -l 1125 -s 127.0.0.1:1025 -d /var/spool/spamooborona -f -i /etc/spamooborona/spam.ini -n my.host.ua
....
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
....
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
1-й момент решается достаточно просто:

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

touch /etc/ld.so.preload
2-й запуском сервиса nscd

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

/etc/init.d/nscd start
или же для RHEL/CentOS/Fedora

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

service nscd start

almos
ефрейтор
Сообщения: 55
Зарегистрирован: 2006-03-31 0:24:24
Контактная информация:

Re: Проблема с spamooborona 1024 + exim

Непрочитанное сообщение almos » 2009-09-25 1:59:24

Вопрос теперь в следующем - как заставить exim резать почту в зависимости от
X-Spam-Ystatus и X-Spam-Flag?

Может у кого соответствующие acl'ы завалялись? :)

Al
ст. прапорщик
Сообщения: 501
Зарегистрирован: 2007-10-18 13:42:48
Откуда: Тверь
Контактная информация:

Re: Проблема с spamooborona 1024 + exim

Непрочитанное сообщение Al » 2009-09-26 13:46:52

almos писал(а):
Sep 24 15:08:29 ksu sp-proxy-agent[10534]: Outgoing mail skipped, origin=127.0.0.1
Погуглил по "Outgoing mail skipped" и вуаля! Товарищ (http://case.net.ru/tag/spamooborona/) столкнулся с сей проблемой только с fetchmail.

Оказывается нужно слать почту не на локальный интерфейс (127.0.0.1) а на внешний, который слушает exim
Нужно слать на локальный. Так правильнее. Просто настроить это надо было. Ну да ладно,если важно только чтобы работало,оставь так.
Я выбрасываю спам так

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

743 # если спам - выбрасываем
744 spam_router:
745   driver                       = redirect
746   domains                      = +local_domains
747   condition = ${if and {{!match {$local_part}{postmaster}} {match {$h_X-Spam-Flag:}{YES}} }}
748   #condition                                     = ${if match {$h_X-Spam-Flag:}{YES}}
749   data                    = :blackhole:
Можно складывать, но у меня техзаданием было выбрасывать.

almos
ефрейтор
Сообщения: 55
Зарегистрирован: 2006-03-31 0:24:24
Контактная информация:

Re: Проблема с spamooborona 1024 + exim

Непрочитанное сообщение almos » 2009-09-27 18:21:20

Я пока сделал следующим образом в роутере доставки почты:

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

directory = ${if and {{def:h_X-Spam-Flag:}{eq {$h_X-Spam-Flag:}{YES}}}{/var/spool/mail/${local_part}/Maildir/.Junk}{/var/spool/mail/${local_part}/Maildir}}
т.к. у меня все клиенты юзают IMAP, все письма с "X-Spam-Flag:YES" складывается в папку Junk.

Я хотел бы резать почту, для которой X-Spam-Ystatus: hits, например > 30, а всю остальную складывать в Junk.

Как это лучше реализовать?