Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> exim + saslauthd + courier-imap

exim + saslauthd + courier-imap + ClamAV + системные пользователи - из /etc/passwd

Автор: lissyara.


    По просьбам трудящихся, решил настругать простенький мануальчик по exim & courier-imap & ClamAV с системными юзерами, вместо всяких БД. Честно говоря, я не вижу причин шарахаться от MySQL - уж 30 мег на диске, и 7 в памяти, на нынешних машинах всегда найдутся. Ну да ладно. Для авторизации отправителей будем использовать saslauthd.
   Итак, ставим из портов, но для начала рихтуем файл /etc/make.conf, надо добавить такие строки:
# директория с портами
PORTSDIR?=      /usr/ports
# EXIM
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
LOG_FILE_PATH?=         syslog
WITH_CONTENT_SCAN=      yes
WITH_DEFAULT_CHARSET?=  koi8-r
WITHOUT_IPV6=           yes
WITH_BDB_VER?=          4
WITH_SASLAUTHD=         yes
.endif

После чего собираем и инсталлим EXIM:
/usr/ports/>cd /usr/home/lissyara/
/usr/home/lissyara/>cd /usr/ports/mail/exim
/usr/ports/mail/exim/>make && make install && make clean

После установки, топаем править файл /etc/mail/mailer.conf до такого состояния:
sendmail        /usr/local/sbin/exim
send-mail       /usr/local/sbin/exim
mailq           /usr/local/sbin/exim -bp
newaliases      /usr/local/sbin/exim -bi
hoststat        /usr/local/sbin/exim
purgestat       /usr/local/sbin/exim

И конфиг экзима, до такого:
#!/bin/sh
# моя конфига экзма. Будь проклят тот день,
# когда мне пришла в голову мысль подписать
# русские поясния ко всем пунктам! :) Хоть и
# делал я это в первую очередь для себя -
# чтоб лучше понять его, но работа эта оказалась
# слишком масштабная и неблагодарная...


# Имя хоста. Используется в EHLO.
# Фигурирует в других пунктах, если они не заданы -
# типа qualify_domain и прочих..
# Если тут ничё не установлено (строка закомметрована)
# то используется то, что вернёт функция uname() 
primary_hostname = mx.lissyara.su

# Делаем список локальных доменов. Далее этот
# список будет фигурировать в виде +local_domains
# В данном случае домены выбираются из БД MySQL. Также
# можно их просто перечислить через двоеточие. Есть интересная
# возможность, можно указать юзер@[хост] - lissyara@[222.222.4.5]
domainlist local_domains = @ 

# делаем список доменов с которых разрешены релеи.
# Далее этот список будет в виде +relay_to_domains
# Можно использовать символы подстановки, типа:
# .... = *.my.domen.su : !spam.my.domen.su : first.su
# тогда пропускается всё, что похоже на *.my.domen.su, но
# от spam.my.domen.su релеится почта не будет.
domainlist relay_to_domains =

# Составляем список хостов с которых разрешён неавторизованый
# релей. Обычно в нём находятся локальные сети, и локалхост...
# ЛокалХост в двух видах был внесён сознательно - пару раз
# сталкивался с кривым файлом /etc/hosts - результатом было
# непонимание `localhost` но пониманием 127.0.0.1/8 
hostlist   relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16

# Вводим названия acl`ов для проверки почты. (В общем-то, это
# необязательно, если вы делаете открытый релей, или хотите
# принимать вообще всю почту с любого хоста для любых
# получателей... Тока потом не жалуйтесь что у Вас спам
# и провайдер выкатывает немеряный счёт :))
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

# Прикручиваем антивирус - при условии, что exim собран
# с его поддержкой. В качестве антивиря юзаем ClamAV,
# ибо - ПО должно быть свободным! :)
# Итак, указываем местоположение сокета clamd.
av_scanner = clamd:/var/run/clamav/clamd

# Адрес куда слать на проверку спама (SpamAssasin), но я
# это не юзаю. Не так много у меня спама... 
# spamd_address = 127.0.0.1 783

# Имя домена добавляемое для локальных отправителей (реальных
# юзеров системы) т.е. почта отправляемая от root, будет от
# root@домен_указанный_здесь. Если пункт незадан, то используется
# имя хоста из `primary_hostname`. Логичней было бы написать здесь
# lissyara.su, но мне удобней иначе:
qualify_domain = mx.lissyara.su

# Имя хоста для ситуации, обратной предыдущей, - это имя домена
# добавляемое к почте для системных юзеров, ну и вообще для почты
# пришедшей на адрес типа `root`, `lissyara`, & etc... Если этот
# пункт незадан то используется значение полученное из
# предыдущего пункта - `qualify_domain` 
qualify_recipient = mx.lissyara.su

# А это как раз кусок вышеописанного анахронизма - про почту в
# виде user@[222.222.222.222] - принимать её или нет. По дефолту
# (когда строка закомментирована) значение - false. Если захотите
# поставить true то надо будет добавить в список доменов
# комбинацию @[] - она означает `все локальные адреса`
allow_domain_literals = false

# Пользователь от которого работает exim
exim_user = mailnull

# группа в кторой работает exim
exim_group = mail

# запрещаем работу доставки под юзером root - в целях безопасности 
never_users = root

# Проверяем соответствие прямой и обратной зон для всех хостов.
# Тока зачем это нужно - даже и незнаю... Спам на этом не режется...
# Зато возможны проблемы - если сервер зоны скажет `сервер файлед`
# то почту от этого хоста Вы не получите :)
#host_lookup = *

# Тоже анахронизм (на самом деле, не такой уж анахронизм, но все давно
# забили на ident и закрыли файрволлом tcp:113...) Это проверка - Ваш
# хост спрашивает у удалённого, с которого было подключение, а кто
# собстно ко мне подключился на такой-то порт? Если на удалённом хосте
# работает identd - он может ответить (а может и не ответить - как
# настроить), скажет UID пользователя от которого установлено
# соединение, тип ОС, и имя пользователя. Теперь, понимаете, почему
# у всех оно зарублено и файрволлами позакрыто? :) Это же палево :)
# Тока на мой взгляд, если на сервере всё настроено правильно -
# то вовсе это и не страшно.
# Короче - если хостс поставить * то будет проверять все. Таймаут -
# если поставить 0 то не будет ждать ответа ни от кого. По
# вышеописанным причинам - отключаем
#rfc1413_hosts = *
rfc1413_query_timeout = 0s

# По дефолту, экзим отфутболивает все `неквалифицированные` адреса,
# состоящие тока из локальной части. Для того чтобы разрешить такие письма
# определённых хостов используются эти директивы:
# для `неквалифицированных` отправителей
sender_unqualified_hosts = +relay_from_hosts
# для `неквалифицированных` получателей
recipient_unqualified_hosts = +relay_from_hosts

# Интересный пункт, тока я не вполне понимаю его логику.
# Позволяет выполнять что-то типа - пришло сообщение на
# локальный ящик user%test.su@lissyara.su и
# переправляет его на user@test.su. Делается это для
# перечисленного списка доменов (* - все):
# percent_hack_domains = *

# Если сообщение было недоставлено, то генерится соощение
# об ошибке. Если сообщение об ошибке не удалось доставить
# то оно замораживается на указанный в этом пункте срок,
# после чего снова попытка доставить его. При очередной
# неудаче - сообщение удаляется.
ignore_bounce_errors_after = 45m

# Замороженные сообщения, находящиеся в очереди, дольше
# указанного времени удаляются и генерится сообщение
# об ошибке (при условии, что это не было недоставленное
# сообщение об ошибке :))
timeout_frozen_after = 15d

# собсно на этом штатный конфиг кончился, но
# меня-то это не устраивает... Поэтому пошли пункты,
# почёрпнутые из других источников.

# список адресов, через запятую, на которые засылаются
# сообщения о замороженных сообщениях (о замороженых
# уведомлениях о заморозке, сообщения не генерятся. - я
# надеюсь эта строка понятна :))
#freeze_tell = admin@lissyara.su

# Список хостов, почта от которых принимается, несмотря
# на ошибки в HELO/EHLO (тут указана моя подсеть)
helo_accept_junk_hosts = 192.168.0.0/16

# Через какое время повторять попытку доставки
# замороженного сообщения
auto_thaw = 1h

# Приветствие сервера
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"

# Максимальное число одновременных подключений по
# SMTP. Рассчитывать надо исходя из нагрузки на сервер
smtp_accept_max = 50

# максимальное число сообщений принимаемое за одно соединение
# от удалённого сервера (или пользователя). C числом 25
# я имел проблемы тока один раз - когда у меня три дня лежал
# инет и после его подъёма попёрли мессаги. Но у меня не так
# много почты - всего 30 пользователей.
smtp_accept_max_per_connection = 25

# чё-то про логи и борьбу с флудом - я так понимаю -
# максимальное число сообщений записываемых в логи
smtp_connect_backlog = 30

# максимальное число коннектов с одного хоста
smtp_accept_max_per_host = 20

# Ход ладьёй - для увеличения производительности,
# директория `spool` внутри, разбивается на
# директории - это ускоряет обработку
split_spool_directory = true

# Если у сообщения много адресатов на удалённых хостах,
# то запускатеся до указанного числа максимально число
# параллельных процессов доставки
remote_max_parallel = 15

# при генерации сообщения об ошибке прикладывать
# не всё сообщение, а кусок (от начала) указанного
# размера (иногда полезно и целиком - в таком случае
# просто закомментируйте эту строку)
return_size_limit = 70k

# размер сообщения. У меня стоит относительно большой
# размер (`относительно` - потому, что на большинстве
# хостов оно ограничено 2-5-10мб, либо стоит анлим.)
message_size_limit = 64M

# разрешаем неположенные символы в HELO (столкнулся
# с этим случайно - имя фирмы состояло из двух слов
# и какой-то раздолбай домен обозвал my_firme_name
# прям с подчёркиваниями... Виндовые клиенты при
# соединении радостно рапортовали о себе
# `vasya.my_firme_name` ну а экзим их футболил :))
helo_allow_chars = _

# Принудительная синхронизация. Если отправитель
# торопится подавать команды, не дождавшись ответа,
# то он посылается далеко и надолго :) Немного,
# спам режется.
smtp_enforce_sync = true

# Выбираем, что мы будем логировать
# + - писать в логи,
# - - Не писать в логи.
# +all_parents - все входящие?
# +connection_reject - разорваные соединения
# +incoming_interface - интерфейс (реально - IP)
# +lost_incoming_connections - потеряные входящие
# соединения
# +received_sender - отправитель
# +received_recipients - получатель
# +smtp_confirmation - подтверждения SMTP?
# +smtp_syntax_error - ошибки синтаксиса SMTP
# +smtp_protocol_error - ошибки протокола SMTP
# -queue_run - работа очереди (замороженные мессаги)
log_selector = \
    +all_parents \
    +connection_reject \
    +incoming_interface \
    +lost_incoming_connection \
    +received_sender \
    +received_recipients \
    +smtp_confirmation \
    +smtp_syntax_error \
    +smtp_protocol_error \
    -queue_run

# Убираем собственную временную метку exim`a из логов, её ставит
# сам syslogd - нефига дублировать
syslog_timestamp = no



### конфигурация ACL для входящей почты
begin acl

# Эти правила срабатывают для каждого получателя
acl_check_rcpt:


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

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

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

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

  accept  local_parts   = postmaster
          domains       = +local_domains

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

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

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

# Рубаем нах, тех, кто подставляет свой IP в HELO
  deny    message       = "Your IP in HELO - access denied!"
          hosts         =  * : !+relay_from_hosts : !81-196.lissyara.su
          condition     = ${if eq{$sender_helo_name}\
    {$sender_host_address}{true}{false}}


# Рубаем тех, кто в HELO пихает мой IP (2500 мудаков за месяц!)
  deny    condition     = ${if eq{$sender_helo_name}\
    {$interface_address}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "main IP in your HELO! Access denied!"

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

  # Рубаем хосты типа *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}}

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

                          
  # Проверка получателя в локальных доменах.
  # Если не проходит, то проверяется следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +local_domains
          endpass
          message       = "In my mailserver not stored this user"
          verify        = recipient

  # Проверяем получателя в релейных доменах
  # Опять-таки если не проходит -> следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +relay_to_domains
          endpass
          message       = "main server not know how relay to this address"
          verify        = recipient

  # Рубаем тех, кто в блэк-листах. Серваки перебираются
  # сверху вниз, если не хост не найден на первом, то
  # запрашивается второй, и т.д. Если не найден ни в одном
  # из списка - то почта пропускается.
  deny    message       = you in blacklist: $dnslist_domain --> $dnslist_text
          dnslists      = opm.blitzed.org : \
                          cbl.abuseat.org : \
                          bl.csma.biz : \
                          dynablock.njabl.org

  # Разрешаем почту от доменов в списке relay_from_hosts
  accept  hosts         = +relay_from_hosts

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




# Тут идут ACL проверяющие содержимое (тело) письма.
# Без них будут пропускаться все сообщения.

acl_check_data:

  # Проверяем письмо на вирусы
  deny malware = *
  message = "In e-mail found VIRUS - $malware_name"

  # Если есть необходимость - тут проверки на спам

  # Пропускаем остальное
  accept


# чё делаем с почтой
begin routers

# Поиск маршрута к хосту в DNS. Если маршрут не найден в DNS -
# то это `унроутабле аддресс`. Не проверяются локальные
# домены, 0.0.0.0 и 127.0.0.0/8
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# В качестве файла альясов используется стандартный файл альясов.
# Ребилдить БД командой newaliases не надо - т.к. в данном случае
# используется не БД а именно текстовый файл.
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

# Это специфический транспорт для адресов сгенерённых форвардингом для
# доставки в файл, pipe или для авто-ответов... Используется файло в
# хомяке, для перенаправления почты...
userforward:
  driver = redirect
  check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
  file = $home/.forward
# allow_filter
  no_verify
  no_expn
  check_ancestor
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  condition = ${if exists{$home/.forward} {yes} {no} }


# Этот роутер проверяет локальный юзер или нет. Если в нём будет
# ошибка (юзер не найден) то он выдаст мессагу "Unknown user".
localuser:
  driver = accept
  check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
  transport = local_delivery
  cannot_route_message = Unknown user

# начинаются транспорты - как доставляем почту
begin transports

# Доставка на удалённые хосты - по SMTP
remote_smtp:
  driver = smtp

# Транспорт для доставки почты локальным адресатам. Ввиду отсутствия в файле
# /etc/passwd поля для указания пути к почте, используется хомяк.
local_delivery:
  driver = appendfile
  check_string = ""
  create_directory
  delivery_date_add
  directory = /usr/home/${local_part}/Maildir
#  directory = /var/mail/${local_part}
  directory_mode = 770
  envelope_to_add
  group = mail
  maildir_format
  maildir_tag = ,S=$message_size
  message_prefix = ""
  message_suffix = ""
  mode = 0660


# Это транспорт для доставки через трубу по адресам сгенерённым
# форвардингом или альясингом. Если эта pipe генерит стандартный вывод,
# возвращается отправителью с руганью в виде этого вывода. Установив
# return_fail_output вместо return_output можно добиться чтобы отлупы
# шли тока в случае ошибок, а не просто ругани.
address_pipe:
  driver = pipe
  return_output

# Транспорт для доставки сгенерённой альясингом или форвардингом.
address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

# Транспорт для автоответов
address_reply:
  driver = autoreply


# Начинаются повторы недоставленных писем.
begin retry

# Этот кусок я не трогал. Думаю разработчики лучше знают,
# какие тут должны быть цифирьки. Если же вы это знаете
# лучше их - меняйте. Хотя... А какого, если Вы такой
# умный, читаете этот мануал? Может ну, их, цифирьки, а? :)
# Address or Domain  Error   Retries
# -----------------  -----   -------
*                    *       F,2h,15m; G,16h,1h,1.5; F,4d,6h


# преобразование адресов. У меня такого нету.
begin rewrite


# Секция авторизации при отправке писем. Ввиду того,
# что почтовых клиентов много, и все всё делают
# по-своему, то и механизмов авторизации три...
begin authenticators

# следующие два пункта написаны мною, и ручаться могу тока за один - который
# оутлук авторизует. 
plain:
  driver                = plaintext
  public_name           = PLAIN
  server_prompts        = :
  server_condition      = ${if saslauthd{{$auth2}{$auth3}}{1}{0}}
  server_set_id         = $auth2

login:
  driver = plaintext
  public_name = LOGIN
  server_prompts = "Username:: : Password::"
  server_condition = ${if saslauthd{{$auth1}{$auth2}}{1}{0}}
  server_set_id = $auth1

# есть ещё така хрень - но она тока для нешифрованных паролей.
# А системные - зашифрованы. Летучая мышь - пролетает...
#cram_md5:
#  driver = cram_md5
#  public_name = CRAM-MD5
#  server_secret = "тут кондишен :)"
#  server_set_id = $1

После чего можно запускать сам exim, тока снаружи почты не будет - т.к. ещё не установлен антивирь, но с локалхоста можно отправить - должна ходить, и демона занимающегося авторизацией:
/usr/home/lissyara/>echo 'exim_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>echo 'saslauthd_enable="YES"' >> /etc/rc.conf
/usr/home/lissyara/>echo 'saslauthd_flags="-a getpwent"' >> /etc/rc.conf
/usr/home/lissyara/>echo 'sendmail_enable="NONE"' >> /etc/rc.conf
/usr/home/lissyara/>killall -9 sendmail
/usr/home/lissyara/>killall -9 sendmail
No matching processes were found
/usr/home/lissyara/>/usr/local/etc/rc.d/saslauthd.sh start
Starting saslauthd.
/usr/home/lissyara/>/usr/local/etc/rc.d/exim.sh start
Starting exim.
/usr/home/lissyara/>ps -axj | grep exim
mailnull 62198     1 62198 62198  0 Ss  ??  0:00,03 /usr/local/sbin/exim -bd -q
root     62201   482 62200   479  2 S+  p0  0:00,03 grep exim
root     20937 20935 20937 20932  1 I+  p1  0:00,09 more /usr/ports/mail/exim/M
/usr/home/lissyara/>sockstat | grep sasl
root     saslauthd  62189 3  dgram  -> /var/run/logpriv
root     saslauthd  62189 5  stream /var/run/saslauthd/mux
root     saslauthd  62188 3  dgram  -> /var/run/logpriv
root     saslauthd  62188 5  stream /var/run/saslauthd/mux
root     saslauthd  62187 3  dgram  -> /var/run/logpriv
root     saslauthd  62187 5  stream /var/run/saslauthd/mux
root     saslauthd  62186 3  dgram  -> /var/run/logpriv
root     saslauthd  62186 5  stream /var/run/saslauthd/mux
root     saslauthd  62185 3  dgram  -> /var/run/logpriv
root     saslauthd  62185 5  stream /var/run/saslauthd/mux
root     saslauthd  20758 3  dgram  -> /var/run/logpriv
root     saslauthd  20758 5  stream /var/run/saslauthd/mux
root     saslauthd  20757 3  dgram  -> /var/run/logpriv
root     saslauthd  20757 5  stream /var/run/saslauthd/mux
root     saslauthd  20756 3  dgram  -> /var/run/logpriv
root     saslauthd  20756 5  stream /var/run/saslauthd/mux
root     saslauthd  20755 3  dgram  -> /var/run/logpriv
root     saslauthd  20755 5  stream /var/run/saslauthd/mux
root     saslauthd  20754 3  dgram  -> /var/run/logpriv
root     saslauthd  20754 5  stream /var/run/saslauthd/mux
/usr/home/lissyara/>

Пробуем отправить себе письмецо:
/usr/local/etc/exim/>mail -s root root < /etc/rc.conf 

и в /var/log/maillog пронаблюдать ткие строки:
Jun 18 10:01:41 bsd-6-etalon exim[34814]: 2006-06-18 10:01:41 1FrqLt-00093W-Ad <= root@mx.lissyara.su U=root P=local S=1469 from <root@mx.lissyara.su> for root
Jun 18 10:01:41 bsd-6-etalon exim[34817]: 2006-06-18 10:01:41 1FrqLt-00093W-Ad => lissyara <root@mx.lissyara.su> R=localuser T=local_delivery
Jun 18 10:01:41 bsd-6-etalon exim[34817]: 2006-06-18 10:01:41 1FrqLt-00093W-Ad Completed

У меня уже прописан альяс рутовой почты на меня - потому оно мне и упало. Теперь можно ставить антивирь:
/usr/home/lissyara/>cd /usr/ports/security/clamav
/usr/ports/security/clamav/>make && make install && make clean

Тут же лезет синее окошко, где ничё не выбираем:
         Options for clamav 0.88.2_4

[ ] MILTER    Compile the milter interface
[ ] CURL      Support URL downloading
[ ] LIBUNRAR  Support for external Unrar library
[ ] STDERR    Print logs to stderr instead of stdout

После установки запускаем антивирь, и обновляем его:
/usr/local/etc/>echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
/usr/local/etc/>rc.d/clamav-clamd.sh start
Starting clamav_clamd.
LibClamAV Warning: **************************************************
LibClamAV Warning: ***  The virus database is older than 7 days.  ***
LibClamAV Warning: ***        Please update it IMMEDIATELY!       ***
LibClamAV Warning: **************************************************
/usr/local/etc/>freshclam
freshclam: Command not found.
/usr/local/etc/>rehash
/usr/local/etc/>freshclam
ClamAV update process started at Sun Jun 18 10:22:59 2006
Downloading main.cvd [-]
Downloading main.cvd [\]
Downloading main.cvd [*]
main.cvd updated (version: 39, sigs: 58116, f-level: 8, builder: tkojm)
Downloading daily.cvd [*]
daily.cvd updated (version: 1549, sigs: 1941, f-level: 8, builder: sven)
Database updated (60057 signatures) from database.clamav.net (IP: 62.181.41.8)
Clamd successfully notified about the update.
/usr/local/etc/>

Также не забываем запихнуть обновление антивируса в планировщик, хотябы раз в сутки.
Теперь надо поставить courier-imap - он будет раздавать почту клиентам по протоколам IMAP и POP3:
/usr/home/lissyara/>cd /usr/ports/mail/courier-imap/
/usr/ports/mail/courier-imap/>make && make install && make clean

           Options for courier-imap 4.1.1,1

[X] OPENSSL      Build with OpenSSL support
[X] FAM          Build in fam support for IDLE command
[X] TRASHQUOTA   Include deleted mails in the quota
[ ] GDBM         Use gdbm db instead of system bdb
[ ] IPV6         Build with IPv6 support
[ ] AUTH_LDAP    LDAP support
[ ] AUTH_MYSQL   MySQL support
[ ] AUTH_PGSQL   PostgreSQL support
[ ] AUTH_USERDB  Userdb support
[ ] AUTH_VCHKPW  Vpopmail/vchkpw support

После установки, можно смело запускать всё это - в настройке оно не нуждается:
/usr/local/etc/>echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
/usr/local/etc/>echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf
/usr/local/etc/>echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
/usr/local/etc/>rc.d/courier-authdaemond.sh start
Starting courier_authdaemond.
/usr/local/etc/>rc.d/courier-imap-pop3d.sh start
Starting courier_imap_pop3d.
/usr/local/etc/>rc.d/courier-imap-imapd.sh start
Starting courier_imap_imapd.
/usr/local/etc/>sockstat | grep courie
root     couriertcp 59437 3  tcp4   *:143                 *:*
root     courierlog 59436 4  dgram  -> /var/run/logpriv
root     couriertcp 59424 3  tcp4   *:110                 *:*
root     courierlog 59423 4  dgram  -> /var/run/logpriv
root     courierlog 59406 4  dgram  -> /var/run/logpriv
/usr/local/etc/>

Пробуем отправить письмо, авторизовавшись, должно пройти, а влогах примерно следующее:
Jun 18 10:37:30 bsd-6-etalon exim[59450]: 2006-06-18 10:37:30 1FrquX-000FSs-W1 <= admin@lissyara.su H=(mainkomp) [192.168.254.1] I=[192.168.254.250]:25 P=esmtpa A=login:lissyara S=2204 id=002201c692a8$ae3cf7b0$01fea8c0@mainkomp from <admin@lissyara.su> for root@mx.lissyara.su
Jun 18 10:37:30 bsd-6-etalon exim[59451]: 2006-06-18 10:37:30 1FrquX-000FSs-W1 => lissyara <root@mx.lissyara.su> R=localuser T=local_delivery
Jun 18 10:37:30 bsd-6-etalon exim[59451]: 2006-06-18 10:37:30 1FrquX-000FSs-W1 Completed
Jun 18 10:37:34 bsd-6-etalon pop3d: LOGIN, user=lissyara, ip=[192.168.254.1]
Jun 18 10:37:34 bsd-6-etalon pop3d: LOGOUT, user=lissyara, ip=[192.168.254.1], top=0, retr=2284, rcvd=34, sent=2509, time=0

P.S. Надо заметить что оно работает вообще практически без настроек - т.е. курьер можно не настраивать вообще, а exim, - тока добавить авторизацию, хосты с которых можно слать неавторизованным и поменять формат и путь к директории почты (дефолт - /var/mail с форматом mailbox, а надо ~/Maildir с форматом maildir).
P.S.2 Не забываем оставить вход по ssh только себе, ставить всем пользователям /sbin/nologin как шелл, сделать chroot всем пользователям FTP. И вообще почесаться обо всех открытых сервисах, куда можно зайти с системной учёткой. (FTP не пустит с таким шелом на сервер, если тока не добавить его - nologin в спиок разрешённых шеллов. Тока не стоит так делать.)



размещено: 2006-06-18,
последнее обновление: 2010-11-24,
автор: lissyara


slant, 2006-06-19 в 21:51:24

Поднимал сегодня же экзим, наткнулся на статейку - конфиг почти один в один! Статья рульная. Зачот. Поболее хороших статей.

nik, 2006-08-25 в 10:41:46

Молодец

chinga, 2006-08-29 в 10:16:18

pardon, это касяк в статье про
echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
или у меня скрипт не доустановился. курьер 4.1.1 , в .../courier-imap/files этого скрипта тоже нет.

chinga, 2006-10-27 в 10:21:13

# Рубаем тех, кто не пишет отправителя
#  deny    condition     = ${if eq{$sender_address}{}{yes}{no}}
#          hosts         = !127.0.0.1 : !localhost : *
#          message       = "А какого HELO пустое?! Не по RFC..."

Почему это повторяется дважды?

Askon, 2007-02-01 в 11:18:00

never_users = root
Не обязательно указывать, т.к. root идет в fixed_never_users:
"When Exim is built, an option called FIXED_NEVER_USERS can be set to a list of users that must not be used for local deliveries. This list is fixed in the binary and cannot be overridden by the configuration file. By default, it contains just the single user name 'root'. The
"never_users" runtime option can be used to add more users to the fixed list."
Поэтому на рута он никогда не отправит почту, сразу для cron и прочей ерунды нужно прописать alias для пользователя root на кого-то другого.

Kolesya, 2007-02-13 в 19:52:36

при компиляции exim'a на 6.2 была такая ругань
================================
awk '{ print ($1+1) }' cnumber.h > cnumber.temp
rm -f cnumber.h; mv cnumber.temp cnumber.h
cc version.c
rm -f exim
cc -o exim
lookups/lookups.a(nis.o)(.text+0xb): In function `nis_open':
: undefined reference to `yp_get_default_domain'
lookups/lookups.a(nis.o)(.text+0x4f): In function `nis_find':
: undefined reference to `yp_match'
lookups/lookups.a(nis.o)(.text+0xa5): In function `nis0_find':
: undefined reference to `yp_match'
*** Error code 1

Stop in /usr/ports/mail/exim/work/exim-4.66/build-FreeBSD-i386.
*** Error code 1

Stop in /usr/ports/mail/exim/work/exim-4.66.
*** Error code 1

Stop in /usr/ports/mail/exim.
root#
================================

Решилось таким макаром
/etc/make.conf
# EXIM
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
WITH_MYSQL=             yes
LOG_FILE_PATH?=         syslog
WITH_CONTENT_SCAN=      yes
WITH_DEFAULT_CHARSET?=  koi8-r
WITHOUT_IPV6=           yes
WITH_BDB_VER?=          4
WITHOUT_NIS=            yes
.endif

jeweller, 2007-04-15 в 11:30:15

подскаите как для cron менять alias для пользователя root на кого-то другого?
я сменил в /etc/crontab
root pereodic daily
root pereodic weekly
root pereodic monthly
на
user pereodic daily
user pereodic weekly
user pereodic monthly

теперь почта должна ходить в ящик user?

n/a, 2007-05-22 в 15:01:34

Спасибо за статью, зело полезна!

ashgdw, 2007-05-30 в 16:35:41

Спасибо! А то лень возиться с БД ради почтовика на 30 пользователей.

sash_gor, 2007-07-02 в 22:53:57

Сегодня потратил кучу времени на решение вопроса с неработой доставки почты. Заключается это в ошибке от имени pop3d что мол не находит директорию Maildir.

Итог потраченого времени:
Если в конфиге вы используете для указания пути к почте параматр directory = /usr/home/${local_part}/Maildir то для того, чтобы курьер знал где это находится надо в конфиге курьеровского pop3d и imap закомментировать строку MAILDIRPATH=Maildir. В таком случает pop3d будет искать директорию Maildir в домашнем каталоге пользователя.

PS Папка Maildir будет создана экзимом самостоятельно после получения первого письма для данного юзверя.

bonh, 2007-07-13 в 8:01:59

/usr/ports/>cd /usr/home/lissyara/
/usr/home/lissyara/>cd /usr/ports/mail/exim

Что за манёвры? ЫЫЫ

lissyara, 2007-07-13 в 8:49:18

Заблудился :)))

bonh, 2007-07-13 в 10:07:12

# ставим дефолтовую задержку в 20 секунд
       set acl_m0 = 30s

Banzaj, 2007-09-22 в 17:31:01

настроил вроде как по доке работает нормально но засёк что
самому себе и остальным юзерам можно без авторизации письма  
слать! Может чёто и накрутил не спорю, но поправил так:
acl_check_rcpt:
........
deny senders = $primary_hostname
message = "rellay not permited"
verify = sender
accept  domains       = +local_domains
         endpass
         message       = "In my mailserver not stored this user"
         verify        = recipient
................

torki, 2007-09-23 в 16:56:46

Всем огромный привет!!
От чайника: за статью 5 баллов, за сайт 100 раз по 5 баллов! Все работает! наружу почта не ходит наверное потому что все в Vmware делал, надо кое-чего подправить, "never_users" победил рассказав в файлике aliases мол root: admin и незабываем про make aliases иначе работать не будет.
Автору: Земной поклон, при жизни памятник, и по больше интересных мыслей!!!
Даа. Совсем забыл, а к этой пьянке можно приарутить DSPAM?

varlioud, 2007-11-16 в 1:21:51

sitc4tr

Michael, 2007-11-21 в 13:47:21

Заметил момент - в конфиге exim пишем

# запрещаем работу доставки под юзером root - в целях безопасности
never_users = root

и потом пытаемся отправить почту :) - у меня не заработало :)

Пробуем отправить себе письмецо:
/usr/local/etc/exim/>mail -s root root < /etc/rc.conf





lissyara, 2007-11-21 в 13:48:55

Вообще-то, те кто думает о безопасности, сразу делают альяс с рута на юзера.
Поэтому, данный момент даже не освящён - считается по дефолту что так.

udaff, 2008-01-15 в 14:29:32

респект и уважуха :-)
добавь плз к статье борьбу со спамом.

rrr, 2008-03-14 в 14:26:57

Стремно заводить около сотни системных пользователей. %)) Вариант в один файл забить виртуальных пользователей типо: user{plain}password. А прокатит ли так настроить exim с курьером?

jeweller, 2008-03-14 в 16:15:04

А почему нет? есть же стятья на эту тему помойму даже

Михаил, 2008-06-19 в 11:56:09

Народ а где можно поставить чтобы системному юзверю admin соотвествовал ящик admin_instor@ukr.net
/etc/aliases?
Еще раз извиняюсь за беспокойство

Михаил, 2008-06-19 в 12:32:48

Народ мне в логах экзим пишет failed to open db-file, ведь экзим дб не юзает тогда чего он ругается и письмо доставить не может отправляю на себя тобишь admin_instor@ukr.net а он мне  - failed to open db-file

bonh, 2008-06-20 в 15:25:29

Мишаня, по поводу первого: юзай аллиасы, по поводу второго видимо у демона нет прав открыть фаил /etc/passwd

Shvapsss, 2008-07-09 в 13:03:06

Админ зацени плиз набоор ссылок и может навояешь из них что нить рульное, если что подпомогну.

MAILGRAPH + exim

Все компоненты я ставил из портов ИБО все ставлю из портов :)
По вот этой ссылки написаны все нюансы установки http://xgu.ru/wiki/Mailgraph

вот по этой примерное описание одной из моих проблем у меня графики не отображались.
http://www.opennet.ru/openforum/vsluhforumID1/71150.html

Решил все таки я это проблему копированием mailgraph-init из /usr/ports/mail/mailgraph/work/mailgraph-1.14 в /usr/local/etc/rc.d и соответственно права на запуск и сам запуск. После чего все графики у меня начали работать.

Pasha, 2010-10-17 в 22:40:18

Всем привет, сделал все по статье, создал пользователя и отправил с майл ру письмо, оно не пришло, в логах написано: FROZEN - что это значит? Заранее спасибо, я навичок, и если моно по подробнее. И ещё установил чистую фряху, поставил все по статье, что ещё надо поднять для работы почтового сервера, если он в локалке, и должен смотреть в мир, через щлюз... извините за беспокойство...

Виталий, 2011-11-30 в 10:48:07

Если используются системные пользователи, необходимо использовать метод pam, а не getpwent.

fitnes_pool, 2014-03-06 в 9:40:02

В этой статье опечатка, которую все как один копируют с этой статьи.
В строке {adsl|dialup|pool|peer|dhcp} надо заменить "pool" на "poll". У меня были из-за этого проблемы с получением писем от glavpooltorg.ru



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0702 секунд
Из них PHP: 61%; SQL: 39%; Число SQL-запросов: 77 шт.
Исходный размер: 95707; Сжатая: 23480