Страница 1 из 1
Exim и правила работы роутеров
Добавлено: 2012-07-22 12:03:13
dm07
Всем привет. Вроде работаю с постоянными вещами, но сегодня столкнулся с тем, что до конца не понимаю, как exim обрабатывает роутеры. Дебаггинг вообще ввел в ступор. Прошу помощи. Итак, что есть: exim 4.71 и секция роутеров:
Код: Выделить всё
begin routers
dnslookup:
driver = dnslookup
debug_print = "R: dnslookup for $local_part@$domain"
domains = ! +local_domains
transport = remote_smtp
pass_on_timeout
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
# следующий роутер будет в работе, если сработает pass_on_timeout от предыдущего роутера
notlocal_smarthost:
driver = manualroute
debug_print = "R: notlocal_smarthost for $local_part@$domain"
domains = !+local_domains
transport = remote_smtp
route_list = * mail.domen.ru byname
# здесь все как у всех, вопросов нет
system_aliases:
driver = redirect
debug_print = "R: system_aliases for $local_part@$domain"
allow_fail
allow_defer
data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE `address`='${quote_mysql:$local_part@$domain}' OR$
`address`='${quote_mysql:@$domain}'}}
headers_add = "X-Delivered-To: $local_part@$domain"
# А дальше ступор. Я использую DSPAM для проверки входящей почты. Вот вроде бы этот роутер все делает правильно
# но является типом accept. Т.е. если принял - то все. А как же обрабатываются остальные роутеры?
dspam_spamscan_router:
driver = accept
debug_print = "R: dspam_spamscan_router for $local_part@$domain"
domains = +local_domains
no_verify
condition = "${if and {{!eq {$received_protocol}{spam-scanned}} \
{!eq {$received_protocol}{local}} } {1}{0}}"
transport = dspam_spamcheck_transport
require_files = /usr/bin/dspam
address_test = false
# дальше у меня идут vacation_director
vacation_director:
driver = accept
debug_print = "R: vacation_director for $local_part@$domain"
domains = ${lookup mysql{SELECT domain FROM vacation WHERE \
domain='${quote_mysql:$domain}' AND \
email='${quote_mysql:$local_part@$domain}' AND \
active='1'}{$value}}
transport = vacation_autoreply
unseen
# а дальше передаем dovecot
dovecot_user:
driver = accept
debug_print = "R: dovecot_user for $local_part@$domain"
condition = ${lookup mysql{SELECT `goto` FROM \
`alias` WHERE \
`address`='${quote_mysql:$local_part@$domain}' OR \
`address`='${quote_mysql:@$domain}'}{yes}{no}}
transport = dovecot_delivery
Вопрос вот в чем. У меня 2 роутера типа accept: dspam_spamscan_router и dovecot_user. Если смотреть дебаггинг, то видим, что dspam_spamscan_router обработался и дальше нигде не вижу, что вызывается роутер dovecot_user. Но письма успешно доставляются в ящики пользователей. Если я закомментирую роутер dovecot_user, возникнет ошибка доставки. Коллеги, проясните мне, как обрабатываются роутеры в моем случае. Спасибо.
Re: Exim и правила работы роутеров
Добавлено: 2012-07-23 12:29:28
skeletor
dm07 писал(а):...Если смотреть дебаггинг...
а где он?
Да и вы уверенны, что вы всё логгируете?
Re: Exim и правила работы роутеров
Добавлено: 2012-07-23 18:35:34
dm07
Отладку выполняю так:
Код: Выделить всё
#/etc/init.d/exim4 stop
# exim -bd -d+all > /var/log/exim-debug.log 2>&1
Если по порядку: вот мой текущий перечень роутеров и транспортов:
Код: Выделить всё
begin routers
dnslookup:
driver = dnslookup
debug_print = "R: dnslookup for $local_part@$domain"
domains = ! +local_domains
transport = remote_smtp
pass_on_timeout
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
notlocal_smarthost:
driver = manualroute
debug_print = "R: notlocal_smarthost for $local_part@$domain"
domains = !+local_domains
transport = remote_smtp
route_list = * mail.domen.ru byname
system_aliases:
driver = redirect
debug_print = "R: system_aliases for $local_part@$domain"
allow_fail
allow_defer
data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE `address`='${quote_mysql:$local_part@$domain}' $
`address`='${quote_mysql:@$domain}'}}
# BDS 20120716 добавил заголовок, чтобы было видно, куда конкретно пошло письмо (после алиасинга)
headers_add = "X-Delivered-To: $local_part@$domain"
vacation_director:
driver = accept
debug_print = "R: vacation_director for $local_part@$domain"
domains = ${lookup mysql{SELECT domain FROM vacation WHERE \
domain='${quote_mysql:$domain}' AND \
email='${quote_mysql:$local_part@$domain}' AND \
active='1'}{$value}}
transport = vacation_autoreply
unseen
# unseen - Когда эта опция установленна в истину, маршрутизация не прекращается,
# если роутер принимает адрес. Вместо этого, копия входящего адреса передаётся следующему роутеру,
# перезадавая ложную установку опции .more.
dspam_spamscan_router:
driver = accept
debug_print = "R: dspam_spamscan_router for $local_part@$domain"
domains = +local_domains
no_verify
condition = "${if and {{!eq {$received_protocol}{spam-scanned}} \
{!eq {$received_protocol}{local}} } {1}{0}}"
transport = dspam_spamcheck_transport
require_files = /usr/bin/dspam
# address_test = false
# Для копирования всей входящей и исходящей почты
copy_message:
driver = redirect
debug_print = "R: copy_message for $local_part@$domain"
unseen
domains = +tracker
data = tracker@domen.ru
dovecot_user:
driver = accept
debug_print = "R: dovecot_user for $local_part@$domain"
condition = ${lookup mysql{SELECT `goto` FROM \
`alias` WHERE \
`address`='${quote_mysql:$local_part@$domain}' OR \
`address`='${quote_mysql:@$domain}'}{yes}{no}}
transport = dovecot_delivery
begin transports
remote_smtp:
driver = smtp
headers_add = "X-Bounce-ID: $primary_hostname"
dovecot_delivery:
driver = pipe
debug_print = "T: dovecot_delivery for $local_part@$domain"
command = /usr/lib/dovecot/deliver -d $local_part@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add = false
log_output = true
user = vmail
vacation_autoreply:
driver = autoreply
headers = "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: base64"
user = Debian-exim
group = vmail
to = ${sender_address}
from = "${local_part}@${domain}"
log = /var/log/vacation.log
subject = "=?UTF-8?B?${lookup mysql {SELECT subject FROM vacation \
WHERE domain='${quote_mysql:$domain}' AND \
email='${quote_mysql:$local_part@$domain}'}{$value}}?="
text = ${lookup mysql {SELECT body FROM vacation \
WHERE domain='${quote_mysql:$domain}' AND \
email='${quote_mysql:$local_part@$domain}'}{$value}}
dspam_spamcheck_transport:
driver = pipe
debug_print = "T: dspam_spamcheck_transport for $local_part@$domain"
command = /usr/bin/dspam --deliver=innocent \
--user "$local_part@$domain" -- %u
user = dspam
return_path_add = false
log_output = true
return_fail_output = true
headers_remove = X-DSPAM-Result
Вот кусок отладки, где мы принимаем письмо и начинаются обрабатываться роутеры и транспорты:
Код: Выделить всё
sender user@gmail.com verified ok
Обработался системный фильтр
19:05:28 23614 user@domen.ru: queued for routing
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 routing user@domen.ru
19:05:28 23614 --------> dnslookup router <--------
19:05:28 23614 dnslookup router skipped: domains mismatch
19:05:28 23614 --------> notlocal_smarthost router <--------
19:05:28 23614 notlocal_smarthost router skipped: domains mismatch
19:05:28 23614 --------> system_aliases router <--------
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 Considering: user@domen.ru
19:05:28 23614 unique = \0\user@domen.ru
19:05:28 23614 dbfn_read: key=R:domen.ru
19:05:28 23614 dbfn_read: key=R:user@domen.ru
19:05:28 23614 dbfn_read: key=R:user@domen.ru:<user@gmail.com>
19:05:28 23614 no domain retry record
19:05:28 23614 no address retry record
19:05:28 23614 user@domen.ru: queued for routing
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 routing user@domen.ru
19:05:28 23614 --------> dnslookup router <--------
19:05:28 23614 dnslookup router skipped: domains mismatch
19:05:28 23614 --------> notlocal_smarthost router <--------
19:05:28 23614 --------> system_aliases router <--------
19:05:28 23614 system_aliases router skipped: previously routed user@domen.ru
19:05:28 23614 --------> vacation_director router <--------
19:05:28 23614 vacation_director router skipped: domains mismatch
19:05:28 23614 --------> dspam_spamscan_router router <--------
19:05:28 23614 calling dspam_spamscan_router router
19:05:28 23614 dspam_spamscan_router router called for user@domen.ru
19:05:28 23614 domain = domen.ru
19:05:28 23614 set transport dspam_spamcheck_transport
19:05:28 23614 queued for dspam_spamcheck_transport transport: local_part = user
19:05:28 23614 domain = domen.ru
19:05:28 23614 errors_to=NULL
19:05:28 23614 domain_data=NULL localpart_data=NULL
19:05:28 23614 routed by dspam_spamscan_router router
19:05:28 23614 envelope to: user@domen.ru
19:05:28 23614 transport: dspam_spamcheck_transport
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 After routing:
19:05:28 23614 Local deliveries:
19:05:28 23614 user@domen.ru
19:05:28 23614 Remote deliveries:
19:05:28 23614 Failed addresses:
19:05:28 23614 Deferred addresses:
19:05:28 23614 search_tidyup called
19:05:28 23614 close MYSQL connection: localhost/exim/exim
19:05:28 23614 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
19:05:28 23614 --------> user@domen.ru <--------
19:05:28 23614 --------> user@domen.ru <--------
19:05:28 23614 locking /var/spool/exim4/db/retry.lockfile
19:05:28 23614 locked /var/spool/exim4/db/retry.lockfile
19:05:28 23614 EXIM_DBOPEN(/var/spool/exim4/db/retry)
19:05:28 23614 returned from EXIM_DBOPEN
19:05:28 23614 opened hints database /var/spool/exim4/db/retry: flags=O_RDONLY
19:05:28 23614 dbfn_read: key=T:user@domen.ru
19:05:28 23614 no retry record exists
19:05:28 23614 search_tidyup called
19:05:28 23615 changed uid/gid: local delivery to user <user@domen.ru> transport=dspam_spamcheck_transport
19:05:28 23615 uid=125 gid=133 pid=23615
19:05:28 23615 auxiliary group list: <none>
19:05:28 23615 home=NULL current=/
19:05:28 23615 set_process_info: 23615 delivering 1StKCL-00068o-UV to user using dspam_spamcheck_transport
19:05:28 23615 expanding: T: dspam_spamcheck_transport for $local_part@$domain
19:05:28 23615 result: T: dspam_spamcheck_transport for user@domen.ru
19:05:28 23615 T: dspam_spamcheck_transport for user@domen.ru
19:05:28 23615 dspam_spamcheck_transport transport entered
19:05:28 23615 Writing message to pipe
19:05:28 23617 set_process_info: 23617 reading output from |/usr/bin/dspam --deliver=innocent --user "$local_part@$domain" -- %u
19:05:28 23615 added header line(s):
19:05:28 23615 X-Delivered-To: user@domen.ru
19:05:28 23615 ---
19:05:28 23615 writing data block fd=12 size=3129 timeout=3600
19:05:28 23615 writing data block fd=12 size=1 timeout=3600
19:05:28 23615 dspam_spamcheck_transport transport yielded 0
19:05:28 23614 post-process user@domen.ru (0)
19:05:28 23614 user@domen.ru delivered
19:05:28 23614 user@domen.ru: children all complete
9:05:28 23614 LOG: MAIN
19:05:28 23614 => user <user@domen.ru> F=<user@gmail.com> P=<user@gmail.com> R=dspam_spamscan_router T=dspam_spamcheck_transport S=3180 QT=3s DT=0s
19:05:28 23614 >>>>>>>>>>>>>>>> deliveries are done >>>>>>>>>>>>>>>>
19:05:28 23614 changed uid/gid: post-delivery tidying
19:05:28 23614 uid=123 gid=5000 pid=23614
19:05:28 23614 auxiliary group list: <none>
19:05:28 23614 set_process_info: 23614 tidying up after delivering 1StKCL-00068o-UV
19:05:28 23614 Processing retry items
19:05:28 23614 Succeeded addresses:
19:05:28 23614 user@domen.ru: no retry items
19:05:28 23614 user@domen.ru: no retry items
19:05:28 23614 user@domen.ru: no retry items
19:05:28 23614 Failed addresses:
19:05:28 23614 Deferred addresses:
19:05:28 23614 end of retry processing
19:05:28 23614 LOG: MAIN
19:05:28 23614 Completed QT=3s
19:05:28 23614 end delivery of 1StKCL-00068o-UV
19:05:28 23614 search_tidyup called
19:05:28 23614 search_tidyup called
19:05:28 23614 >>>>>>>>>>>>>>>> Exim pid=23614 terminating with rc=0 >>>>>>>>>>>>>>>>
Мы видим, что обработался dspam роутер, но нет упоминания про dovecot-транспорт, хотя в mainlog мы видим, что используются оба транспорта. Как в моем случае обрабатываются два роутера типа accept - по порядку? Но ведь по-идее, сработать должен только 1 из них, который примет адрес для маршрутизации. Дайте пожалуйста наводку, а то запутался.
Re: Exim и правила работы роутеров
Добавлено: 2012-07-24 13:57:02
skeletor
Ответ просто - у вас срабатывает dspam_spamscan_router. До dovecot_user не доходит. Покажите дебаг, когда закомментирован route dovecot_user.
Re: Exim и правила работы роутеров
Добавлено: 2012-07-24 15:19:02
dm07
Я в дебаге по поиску ищу dovecot, но не нахожу информации ни про вызов роутера dovecot_user, ни про вызов транспорта dovecot_delivery. В заголовках письма вижу вот это:
Код: Выделить всё
Received: from dspam by mail2.domain.ru with local (Exim 4.71)
(envelope-from <dspam@domen.ru>)
id 1St2vH-0006Te-Jc
for user@domen.ru; Mon, 23 Jul 2012 00:38:39 +0400
Received: from mail-lb0-f175.google.com ([209.85.217.175]:48303)
by mail2.domen.ru with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16)
(Exim 4.71)
(envelope-from <user@gmail.com>)
id 1St2vB-0006TV-LD
for user@domen.ru; Mon, 23 Jul 2012 00:38:39 +0400
Т.е. при приеме мы видим 2 заголовка Received, причем в первом заголовке мы видим envelope-from <
dspam@domen.ru>, насколько я понимаю это из-за того, что роутер dspam вызывается пользователем dspam (мне это не нравится, но отменить не могу, если директиву user не указывать - получаю ошибку). Второй заголовок Received - верный. В самом логе mainlog мы видим:
Код: Выделить всё
2012-07-24 16:11:30 [16177] 1StdxU-0004Cv-Gk SA: Action: scanned but message isn't spam: score=-1.9 required=4.0 (scanned in 5/5 secs | Message-Id:
CA+WasyMMDe2joKfiyvt782oGzkeHpb=6o3a+1aMYKwR+4m7YEQ@mail.gmail.com). From <user@gmail.com> (host=mail-lpp01m010-f51.google.com [209.85.215.51])
for user@domen.ru
2012-07-24 16:11:30 [16177] 1StdxU-0004Cv-Gk <= user@gmail.com H=mail-lpp01m010-f51.google.com [209.85.215.51]:64284 I=[46.2.75.1]:25 P=esmtps
X=TLS1.0:RSA_ARCFOUR_SHA1:16 CV=no S=3096 id=CA+WasyMMDe2joKfiyvt782oGzkeHpb=6o3a+1aMYKwR+4m7YEQ@mail.gmail.com T="test 230" from <user@gmail.
com> for user@domain.ru
2012-07-24 16:11:30 [16182] cwd=/var/spool/exim4 3 args: /usr/sbin/exim4 -Mc 1StdxU-0004Cv-Gk
2012-07-24 16:11:30 [16187] cwd=/ 4 args: /usr/sbin/exim -oMr spam-scanned user@domen.ru
2012-07-24 16:11:30 [16187] 1Stdxa-0004D5-44 SA: Debug: SAEximRunCond expand returned: ''
2012-07-24 16:11:30 [16187] 1Stdxa-0004D5-44 SA: Action: Not running SA because SAEximRunCond expanded to false (Message-Id: 1Stdxa-0004D5-44). From
<dspam@domen.ru> (local) for user@domen.ru
2012-07-24 16:11:30 [16187] 1Stdxa-0004D5-44 <= dspam@domen.ru U=dspam P=local S=4123 id=CA+WasyMMDe2joKfiyvt782oGzkeHpb=6o3a+1aMYKwR+4m7YEQ@mail.g
mail.com T="test 230" from <dspam@domen.ru> for user@domen.ru
2012-07-24 16:11:30 [16182] 1StdxU-0004Cv-Gk => user <user@domen.ru> F=<user@gmail.com> P=<user@gmail.com> R=dspam_spamscan_rou
ter T=dspam_spamcheck_transport S=3182 QT=6s DT=0s
2012-07-24 16:11:30 [16182] 1StdxU-0004Cv-Gk Completed QT=6s
2012-07-24 16:11:30 [16188] cwd=/var/spool/exim4 3 args: /usr/sbin/exim4 -Mc 1Stdxa-0004D5-44
2012-07-24 16:11:30 [16188] 1Stdxa-0004D5-44 => user <user@domen.ru> F=<dspam@domen.ru> P=<dspam@domen.ru> R=dovecot_user T=dovecot_del
ivery S=4202 QT=0s DT=0s
2012-07-24 16:11:30 [16188] 1Stdxa-0004D5-44 Completed QT=0s
Т.е. тут в логе мы видим, что вызвался транспорт dspam_spamcheck_transport, видим, что он отработался успешно (1StdxU-0004Cv-Gk Completed QT=6s), потом видим, что вызывается транспорт dovecot_delivery.
Re: Exim и правила работы роутеров
Добавлено: 2012-07-24 17:02:44
skeletor
А вы видите, что у вас разные id писем? Если это одно и тоже письмо, тогда ясно, почему 2 заголовка и в чём проблема: у вас письмо первый раз принимается dspam'om, потом он его передаёт обратно в exim и тот уже в dovecot_delivery.
Почему так? Скорее всего ошибка в интеграции dspam и exim.
Re: Exim и правила работы роутеров
Добавлено: 2012-07-24 17:39:21
dm07
Да, вы правы - это одно и тоже письмо. В конфиге dspam есть опция:
Код: Выделить всё
TrustedDeliveryAgent "/usr/sbin/exim -oMr spam-scanned"
Похоже, когда отрабатывает транспорт dspam_spamcheck_transport:
Код: Выделить всё
driver = pipe
debug_print = "T: dspam_spamcheck_transport for $local_part@$domain"
command = /usr/bin/dspam --deliver=innocent \
--user "$local_part@$domain" -- %u
поскольку он вызывает dspam, далее вызывается exim согласно конфигу dspam и ему передается письмо уже силами dspam'a. Поэтому я в дебаггинге не вижу вызов роутера dovecot'а, который идет сразу за роутером dspam. Собственно что и сподвигло меня написать этот пост. При конфигурировании опирался на статью
http://www.lissyara.su/articles/freebsd ... n_to_exim/. Вопрос вот в чем: возможно ли как-то обработать входящее письмо dspam'ом (не создавая новую сессию SMTP), а дальше, после обработки, передать его нежно и ласково транспорту dovecot?
Re: Exim и правила работы роутеров
Добавлено: 2012-07-24 18:48:35
skeletor
А зачем? Что вы хотите получить?
Почитайте комментарии к статье, может что-то найдёте.
Re: Exim и правила работы роутеров
Добавлено: 2012-07-24 19:00:54
dm07
Да, 2 заголовка Received, причем с разными id - это типовая ситуация, а не ошибочная. Два заголовка по-любому получится, т.к. dspam вызывает exim на доставку письма. Спасибо, разобрался более четче как вызываются роутеры exim, в частности в связке с dspam.