URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 86351
[ Назад ]

Исходное сообщение
"Exim+CourierImap+psql"

Отправлено THE_Beginner , 21-Авг-09 10:09 
Доброго времени суток.
Администраторы Exim'a, помогите пожалуйста решить проблемку.

Есть Exim+CourierImap+psql (устанавливал связку первый раз (взял за пример статью http://www.lissyara.su/?id=1837)).

Ситуация:
Если отправлять почту с локального хоста сервера: "mail -s maitest test@testim.u.ua" - то
все в порядке.
Если же, я настраиваю почтовый клиент на пользовательской машине и пытаюсь оправить почту с test@testim.u.ua на test@testim.u.ua, в лог получаю следующие:
P.S. почта принимается почтовым клиентом нормально.

less mainlog

2009-08-21 09:58:29 no host name found for IP address 192.168.0.38
2009-08-21 09:58:46 DNS list lookup defer (probably timeout) for 38.0.168.192.opm.blitzed.org: assumed not in list
2009-08-21 09:59:06 DNS list lookup defer (probably timeout) for 38.0.168.192.bl.csma.biz: assumed not in list
2009-08-21 09:59:28 DNS list lookup defer (probably timeout) for 38.0.168.192.dynablock.njabl.org: assumed not in list
2009-08-21 09:59:31 1MeN9s-0000JA-QF malware acl condition: unable to connect to sophie UNIX socket (/var/run/sophie). errno=2
2009-08-21 09:59:31 1MeN9s-0000JA-QF H=(AK) [192.168.0.38] F=<test@testim.u.ua> temporarily rejected after DATA

config exima взят полностью из статьи (единственное что я сделал - это знакометарил строчки:
#Здесь мы описываем наш антивирус
#av_scanner = clamd:127.0.0.1 3310
#И spamassasin
#spamd_address = 127.0.0.1 783).

Подскажите пожалуйста как быть? Я только разбираюсь...
Заранее спасибо!
С уважением.

######################################################################
#                  Runtime configuration file for Exim               #
######################################################################

# Здесь мы определяем макросы, описывающие различные пути

CONFIG_PREFIX=/usr/local/etc/exim

# Здесь мы указываем, где находить наш postgresql сервер, соединение
# осуществляется через локальный сокет, команда hide помогает спрятать эту
# настройку при вызове exim -bP, когда exim выводит все конфигурационные опции в
# стандартный вывод. Учтите,
# что сам /usr/local/etc/exim/configure должен иметь владельца root:wheel и
# иметь права доступа 0600, что отличается от того, что принято по умолчанию
# (0644)
#hide pgsql_servers = host/database/db_user/password
hide pgsql_servers = localhost/exim/exim/exim
# Тут мы описываем списки доменов

# Local_domains включает домены, считающиеся локальными, то есть те домены, для
# которых exim делает локальную доставку, для остальных доменов почта
# доставляется по MX записям в DNS.

domainlist local_domains =${lookup pgsql{SELECT domain FROM local_domain}}


# Список хостов, почту на которые мы явно отвергаем

hostlist host_reject = ${lookup pgsql{SELECT domain FROM hostreject}}

#Список доменов куда разрешен прием
domainlist relay_to_domains = ${lookup pgsql{SELECT hosts FROM relaytohosts}}

# Список адресов, с которых разрешена передача почты во внешний мир
hostlist relay_from_hosts =${lookup pgsql{SELECT hosts FROM relayfromhosts}}

# Проверка получателя
acl_smtp_rcpt = acl_check_rcpt
# Проверка mime содержимого
acl_smtp_mime = acl_check_mime
# Проверка на спам и вирусы
acl_smtp_data = acl_check_virus

# Здесь мы описываем наш антивирус
#av_scanner = clamd:127.0.0.1 3310
# И spamassasin
#spamd_address = 127.0.0.1 783
# Настройки пользователя и группы по умолчанию
exim_user = mailnull
exim_group = mail
# Никогда не осуществляем доставку под рутом - root должен быть алиасом на
# другого локального пользователя. Кстати, это _обязательное_ условие, заданное
# еще на этапе компиляции
never_users = root
# Настройки директории для очереди
spool_directory = /var/spool/exim
# Разделяем spool_directory на несколько более маленьких - аналог хеш таблицы,
# ускоряет обработку spool'а
split_spool_directory

# Пытаемся сделать соответствие прямой и обратной зоны dns для каждого хоста.
# Несколько затратно, но весьма полезно
host_lookup = *

# Убираем проверку identd на клиентской стороне. Из-за неправильно настроенных
# firewall'ов это часто вызывает длительные тайм-ауты, кроме того, этот сервис
# поднят не у многих
rfc1413_query_timeout = 0s

# Указываем кое-какие лимиты (их назначение ясно из названия)
smtp_accept_max = 50
smtp_connect_backlog = 40
smtp_accept_max_per_host = 10
smtp_accept_queue = 22
smtp_accept_queue_per_connection = 10
recipients_max = 16
recipients_max_reject = true
message_size_limit = 20M
accept_8bitmime

# Игнорируем сообщения, которые приходят нам же, давность которых более 12-ти часов
ignore_bounce_errors_after = 12h

# Удаляем замороженные сообщения, давность которых больше 3 дней.
timeout_frozen_after = 3d

# Настройки TLS
tls_certificate = CONFIG_PREFIX/mailed.crt
tls_privatekey = CONFIG_PREFIX/mailed.key
tls_advertise_hosts = *
tls_verify_certificates = *
# Следующая опция закомментирована, но весьма полезна, позволяя авторизироваться
# только через безопасный ssl канал
#auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

# Этот список доступа описывает проверки, осуществляемые при вызове любой RCPT
# команды
acl_check_rcpt:

  # принимать сообщения которые пришли с локалхоста,
  # не по TCP/IP
  accept  hosts = :

  # Запрещаем письма содержащие в локальной части
  # символы @; %; !; /; |. Учтите, если у вас было
  # `percent_hack_domains` то % надо убрать.
  # Проверяются локальные домены
  deny    message       = "Недопустимые символы в адресе"
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  # Проверяем недопустимые символы для
  # нелокальных получателей:
  deny    message       = "Недопустимые символы в адресе"
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  # Принимаем почту для постмастеров локальных доменов без
  # проверки отправителя (я закомментировал, т.к. это -
  # основной источник спама с мой ящик).

#  accept  local_parts   = postmaster
#          domains       = +local_domains

  # Запрещщаем, если невозможно проверить отправителя
  # (отсутствует в списке локальных пользователей)
  # У себя я это закоментил, по причине, что некоторые
  # железяки (принтеры, & etc) и программы (Касперский, DrWEB)
  # умеют слать почту, в случае проблем но не умеют ставить
  # нужного отправителя. Такие письма эта проверка не пускает.
#  require verify        = sender

  # Запрещщаем тех, кто не обменивается приветственными
  # сообщениями (HELO/EHLO)
  deny    message       = "HELO/EHLO обязано быть по SMTP RFC"
          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

  # Принимаем сообщения от тех, кто аутентифицировался:
  # Вообще, большинство конфигов в рунете - это один и тот же
  # конфиг написанный Ginger, в котором этот пункт расположен
  # внизу. Но при таком расположении рубятся клиенты с adsl,
  # ppp, и прочие зарезанные на последующих проверках. Но это
  # жа неправильно! Этом мои пользователи из дома! Потому
  # я это правило расположил до проверок.
  accept  authenticated = *

# Рубаем нах, тех, кто подставляет свой IP в HELO
  deny    message       = "Не надо пихать свой IP в качестве HELO!"
          hosts         =  *:!+relay_from_hosts
          condition     = ${if eq{$sender_helo_name}\
                          {$sender_host_address}{true}{false}}


# Рубаем тех, кто в HELO пихает мой IP
  deny    condition     = ${if eq{$sender_helo_name}\
                          {$interface_address}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "Это мой IP-адрес! Пшёл прочь!"

# Рубаем тех, кто в HELO пихает только цифры
# (не бывает хостов ТОЛЬКО из цифр)
  deny    condition     = ${if match{$sender_helo_name}\
                          {\N^\d+$\N}{yes}{no}}
          hosts         = !127.0.0.1:!localhost:*
          message       = "В HELO не могут быть тока цифры!"

  # Рубаем хосты типа *adsl*; *dialup*; *pool*;....
  # Нормальные люди с таких не пишут. Если будут
  # проблемы - уберёте проблемный пункт (у меня клиенты
  # имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
  deny    message       = "Не нравится мне Ваш хост..."
          condition     = ${if match{$sender_host_name} \
                               {adsl|dialup|pool|peer|dhcp} \
                               {yes}{no}}
  # Рубаем тех, кто в блэк-листах. Серваки перебираются
  # сверху вниз, если не хост не найден на первом, то
  # запрашивается второй, и т.д. Если не найден ни в одном
  # из списка - то почта пропускается.
  deny    message       = "host in blacklist - $dnslist_domain \n $dnslist_text"
          dnslists      = opm.blitzed.org : \
                          proxies.blackholes.easynet.nl : \
                          cbl.abuseat.org : \
                          bl.spamcop.net : \
                          bl.csma.biz : \
                          dynablock.njabl.org : \

  # Задержка. (это такой метод борьбы со спамом,
  # основанный на принципе его рассылки) На этом рубается
  # почти весь спам. Единственно - метод неприменим на
  # реально загруженных MTA - т.к. в результате ему
  # приходится держать много открытых соединений.
  # но на офисе в сотню-две человек - шикарный метод.
  #
  # более сложный вариант, смотрите в статье по exim и
  # курьер имап. Т.к. там метод боле умный (просто правил
  # больше :), то можно и на более загруженные сервера ставить)
  warn
        # ставим дефолтовую задержку в 20 секунд
        set acl_m0 = 20s
  warn
        # ставим задержку в 0 секунд своим хостам и
        # дружественным сетям (соседняя контора :))
        hosts = +relay_from_hosts
        set acl_m0 = 0s


  # Проверка получателя в локальных доменах.
  # Если не проходит, то проверяется следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +local_domains
          endpass
          message       = "В этом домене нет такого пользователя"
          verify        = recipient

  # Проверяем получателя в релейных доменах
  # Опять-таки если не проходит -> следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +relay_to_domains
          endpass
          message       = "Моя сервера не знать маршрут на этот хост..."
          verify        = recipient
  # Разрешаем почту от доменов в списке relay_from_hosts
  accept  hosts         = +relay_from_hosts
        deny hosts         =!+relay_from_hosts

  # Реализация нашего бан-листа
  deny   hosts          = +host_reject
         message        = You are banned. Go away.

  # еще боримся со спамом и вирусами
  deny    message       = Мы не принимает ".$found_extension" \
                          незапакованные вложения \
                          Для отправки запакуйте их.
          demime = bat:btm:cmd:com:cpl:dll:exe:lnk:msi:pif:prf:reg:scr:vbs:url


  # Если неподошло ни одно правило - чувак явно ищет
  # открытый релей. Пшёл прочь. :)
  deny    message       = "Свободен. Это тебе не ОпенРелей."

  # Список доступа для проверки mime частей сообщения
acl_check_mime:

  # Произодим декодирование mime сообщений. Полезно для дальнейшей проверки на
  # вирусы
  warn decode = default

  # Можно очень быстро отсеять сообщения, просто запретив некоторые mime
  # вложения, чаще всего содержащие вирусы, хотя, конечно, это не панацея
  deny message = Blacklisted file extension detected
       condition = ${if match \
                        {${lc:$mime_filename}} \
                        {\N(\.wav|\.cpl|\.pif|\.bat|\.scr|\.lnk|\.com)$\N} \
                     {1}{0}}

  # Много ли у нас людей, знающих китайский? А вот китайского спама это поубавит
  # :)
  deny message = Sorry, noone speaks chinese here
       condition = ${if eq{$mime_charset}{gb2312}{1}{0}}

  accept

# Проверка содержимого на вирусы и спам
acl_check_virus:
        # Мы не запрещаем письма со спамом, а просто добавляем заголовок,
        # содержащий количество спамерских очков, а пользователь на своей
        # стороне уже просто настраивает свои фильтры. Так мы исключаем жалобы
        # со стороны пользователей о потерянных письмах
        warn  message = X-Spam-Score: $spam_score ($spam_bar)
                spam = nobody:true

        # Добавляем заголовки, указывающие, что письма были проверены
        # spamasssasin'ом
        warn message = X-Spam-Scanned: Yes
         warn message = X-Spam-Scanner: SpamAssassin running

        # Вот что-что, а вирусы нам не нужны.
        deny  message   = Message rejected: virus found. \
Your message was successfully trashed.
                    hosts       = *
                    malware     = *
        accept

######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################
#     THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!       #
# An address is passed to each router in turn until it is accepted.  #
######################################################################

begin routers

# Роутер, осуществляющий поиск по MX записям в DNS
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# Все останльные роутеры обслуживают доставку локальной почты

# Драйвер алиасов пользователя. Обратите внимание на lookup в pgsql базе. Что
# интересно, этот lookup работает даже для иерархических алиасов
# Также определяются транспорты
# для передачи почты в файл (>/path/to/file) и в pipe
# (|/usr/local/libexec/slocal)
system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup pgsql{select alias from aliases \
           where mail ='$local_part@$domain'}{$value}fail}
  user = mailnull
  group = mail
  file_transport = address_file
  pipe_transport = address_pipe

# Для локальных пользователей также создаем возможность перенаправления почты
# через ~/.forward файл. Если включена директива allow_filter, то в .forward
# файле можно использовать язык sieve фильтров. Для подробностей см.
# документацию на www.exim.org, т.к. на рассмотрение этой темы уйдет слишком
# много времени
userforward:
  driver = redirect
  check_local_user
  file = $home/.forward
  no_verify
  no_expn
  check_ancestor
# allow_filter
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  condition = ${if exists{$home/.forward} {yes} {no} }

# Локальная доставка, если данный пользователь найдем в базе

localuser:
  driver = accept
  condition = ${lookup pgsql {select uid from \
            accounts where login = '$local_part@$domain'}{yes}{no}}
  transport = local_delivery
  cannot_route_message = Unknown user

######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################

begin transports

# Драйвер для доставки через соединения с удаленными smtp серверами
remote_smtp:
  driver = smtp

# Этот транспорт доставляет почту в локальные maildir'ы. Путь к maildir хранится
# опять же в таблице accounts. Разрешения на директорию 0770 для возможности
# работы с данными директориями imap сервера. При этом владельцем является
# группа и пользователь из accounts (потому при вставлении записей в эту таблицу
# надо начинать значения uid с достаточно большого числа, например, 2000 и
# пересекаться с реальными пользователями оно должно только если реальному
# пользователю нужен локальный доступ к maildir'у).
# Также из таблицы accounts извлекается данные о размере квоты, и
# устанавливается порог в 75% от квоты, когда пользователю посылается указанное
# предупреждение об подходе к порогу квоты
local_delivery:
  driver = appendfile
  directory = ${lookup pgsql{select maildir from \
            accounts where login = '$local_part@$domain'}{$value}fail}
  create_directory
  directory_mode = 0770
  maildir_format
  delivery_date_add
  envelope_to_add
  return_path_add
  group = 26
  user = 26
  mode = 0660
  no_mode_fail_narrower
  quota = ${lookup pgsql{select mailquota from \
        accounts where login = '$local_part@$domain'}{$value}fail}M
  quota_warn_message = "\
          To: $local_part@domain\n\
        From: postmaster@test.ru\n\
        Subject: Your maildir is going full\n\
        This message is automaticaly gnerated by your mail server.\n\
        This means, that your mailbox is 75% full. If you would \n\
        override this limit new mail would not be delivered to you!\n"
  quota_warn_threshold = 75%

# Транспорт, осуществляющий доставку в pipe
address_pipe:
  driver = pipe
  return_output

# Транспорт, осуществляющий доставку прямо в файл
address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

# Этот транспорт используется для автоматического ответа на сообщения об ошибках
address_reply:
  driver = autoreply

######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################

begin retry

# Настройки по умолчанию, которые я не трогал, управляют интервала повторной
# передачи сообщений

# This single retry rule applies to all domains and all errors. It specifies
# retries every 15 minutes for 2 hours, then increasing retry intervals,
# starting at 1 hour and increasing each time by a factor of 1.5, up to 16
# hours, then retries every 6 hours until 4 days have passed since the first
# failed delivery.

# Address or Domain    Error       Retries
# -----------------    -----       -------

*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h


######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

# Описания аутентификации

begin authenticators
# CRAM-MD5 аутентификация, требует наличия пароля в открытом виде, имя
# пользователя должно быть в формате user@domain, как оно хранится в таблице
# accounts
lookup_cram:
        driver = cram_md5
        public_name = CRAM-MD5
        server_secret = ${lookup pgsql {select password \
                      from accounts where login='$1'}{$value}fail}
        server_set_id = $1
# LOGIN аутентификация - не требует хранения пароля в открытом виде, однако, по
# сети пароль передается в открытом виде - требуется лишь выполнение условия
# server_condition - $1 - имя пользователя, а $2 - пароль. LOGIN безопасен
# только при установлении ssl соединения.
login:
        driver = plaintext
        public_name = LOGIN
        server_prompts = Username:: : Password::
        server_condition = ${lookup pgsql {select login \
          from accounts where login='$1' and password='$2'}{yes}{no}}
        server_set_id = $1


# End of Exim configuration file


Содержание

Сообщения в этом обсуждении
"Exim+CourierImap+psql"
Отправлено SubGun , 21-Авг-09 10:25 
1. Слишком замудрено. Даже те вещи, которые не надо(domain_list, relay_from_hosts, relay_to_domains) ты берешь из базы. Да еще и из PgSQL. Это все равно, что греть чайник на сопле ракеты.
2. Вот это: "unable to connect to sophie UNIX socket (/var/run/sophie)" говорит, что у тебя сокет антивируса не открыт, а данные из ACL в acl_check_data у тебя туда пытаются передаться.

"Exim+CourierImap+psql"
Отправлено THE_Beginner , 21-Авг-09 10:39 
>1. Слишком замудрено. Даже те вещи, которые не надо(domain_list, relay_from_hosts, relay_to_domains) ты
>берешь из базы. Да еще и из PgSQL. Это все равно,
>что греть чайник на сопле ракеты.
>2. Вот это: "unable to connect to sophie UNIX socket (/var/run/sophie)" говорит,
>что у тебя сокет антивируса не открыт, а данные из ACL
>в acl_check_data у тебя туда пытаются передаться.

Спасибо за ответ.
Я так понимаю что acl_check_data - это должен быть параметр в "конфиге" exim'a?
Если так, то оного я не нашел... (
И все-же, как можно выйти из ситуации? Просто в тупике нахожусь... (

С уважением.


"Exim+CourierImap+psql"
Отправлено SubGun , 21-Авг-09 11:09 
Мне неприятно оттого, что вы не хотите подумать головой. А я, дурак, писал вам ответ.
acl_smtp_data = acl_check_virus
изначально вообще-то выглядела как
acl_smtp_data = acl_check_data

И, как я уже сказал, проблема во включенном ACL для антивируса. Это все потому, что вы втупую скопировали чужую статью, не попытавшись разобраться с основным конфигом.


"Exim+CourierImap+psql"
Отправлено THE_Beginner , 21-Авг-09 11:31 
>Мне неприятно оттого, что вы не хотите подумать головой. А я, дурак,
>писал вам ответ.
>acl_smtp_data = acl_check_virus
>изначально вообще-то выглядела как
>acl_smtp_data = acl_check_data
>
>И, как я уже сказал, проблема во включенном ACL для антивируса. Это
>все потому, что вы втупую скопировали чужую статью, не попытавшись разобраться
>с основным конфигом.

Спасибо за ответ. Вот по ходу дела вникаю в "конфиг" exima ))!

Ошибку устранил так:
av_scanner = clamd:/var/run/clamav/clamd.sock
Хотя и закомментирование ACL для антивируса, тоже помогло. )

Почта с клиентской машины стала отправлятться... Но очень медленно (( Висит в исходящих по несколько минут... Вот разбираюсь теперь с этим )

Еще раз спасибо!
С уважением.


"Exim+CourierImap+psql"
Отправлено THE_Beginner , 21-Авг-09 11:34 
>[оверквотинг удален]
>
>Ошибку устранил так:
>av_scanner = clamd:/var/run/clamav/clamd.sock
>Хотя и закомментирование ACL для антивируса, тоже помогло. )
>
>Почта с клиентской машины стала отправлятться... Но очень медленно (( Висит в
>исходящих по несколько минут... Вот разбираюсь теперь с этим )
>
>Еще раз спасибо!
>С уважением.

Почта с клиентской машины стала отправлятться... Но очень медленно (( Висит в исходящих по несколько минут... Вот разбираюсь теперь с этим )

С этим тоже разобрался! Все! Тема закрыта! Еще раз спасибо Вам SubGun!