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

Замена дефолтового майлера на ISPmanager

Автор: lissyara.


    Холодный субботний день. Сижу плюю в потолок - ничё не хочется делать, да и ничё не надо... Возле часов лезет сообщение в аське - "привет" - понеслось - этого человека я не знаю :)
   Итак. Есть хостинг на типа виртуальном сервере - ISPmanager. По дефолту, майлер там - sendmail, но он не устраивал - первую же проблему решить не удалось - при отправке этот дурик вначале интересовался наличием хоста в DNS-блэклистах, и давал отлуп, не давая авторизоваться для отправки почты. Гениальное решение :) С учётом невнятного конфига и меньшей чем у exim`a гибкости - решение просилось само.
   Итак. Требуется сэмулировать текущий конфиг sendmail, по возможности более полно, чтобы осталось управление с родной админки. Полазив по ФС и повкуривав в конфиги (для чего пришлось создать тестовый домен и пару тестовых юзеров), всё встало на свои места. Ничё особо сложного конфигурация из себя не представляла - да и не могла, с учётом использовавшегося MTA. Что удалось выяснить:
/etc/mail/aliases - файл альясов. Основная работа идёт именно с ним. Формат стандартный, поэтому проблем не возникло.
/etc/mail/local-host-names - список локальных доменов - по одному на строчку. Exim понимает такой формат, поэтому тоже не было проблем.
/etc/mail/mailer.conf - конфигурация почтового враппера - какой почтарь вызывать с какими параметрами
/etc/mail/virtusertable - файл альясов для виртуальных пользователей - сопоставление имён виртуальных, именам реальных системых пользователей. Формат тоже стандартный - тока разделитель - пробел, что не является проблемой, т.к. exim`y монописуально - двоеточие или пробел будет как разделитель. Тут же используются конструкции типа @my-domain.su - для них обработку не писал - не понял их значения - видимо действие для ненайденных юзеров. Exim такое сам обрабатывает.
/usr/local/etc/dovecot.passwd - файл типа системного файла паролей. Формат похожий, тока вместо шелла используется путь к майлбоксу.
   Также используется файл системных паролей, через соответсвующие системные же вызовы - т.е. инфа хорошо продублирована - sendmail авторизуется по системе, а dovecot по своему файлу паролей. Всегда непонимал в таких случаях - почему бы не использовать БД! До кучи используются системные квоты - но опять же - exim умеет, при доставке, распознавать ошибки системной квоты, и генерить соответствующее сообщение. Конечно, это не есть гуд - письмо вначале примется, а потом сгенерится рикошет - но лучше это, чем ничего.
   Ставим exim из портов (которые там, кстати, регулярно обновляются - видимо на уровне реальной машины), для этого пилим /etc/make.conf:
# added by lissyara 2007-09-01 in 17:30 MSK

# директория с портами
PORTSDIR?=      /usr/ports
# EXIM
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
WITH_CONTENT_SCAN=      yes
WITH_DEFAULT_CHARSET?=  koi8-r
WITHOUT_IPV6=           yes
WITH_BDB_VER?=          4
WITH_SASLAUTHD=         yes
.endif

   Пояснения - ввиду кривости моих рук, мне не удалось запустить авторизацию через pam, поэтому использовал sasauthd - хотя честно - жалко память - там её всего 64 выделено...
   Дальше рисуем конфиг - привожу его не целиком, а лишь то что правил, и кое чё по мелочи - чтоб было понятно что к чему относится (иначе можно было бы выложить diff да и всё :)), а остальное - дефолтовый конфиг:
# куски конфигурации exim`a, относящиеся к делу.

# далее - правки главной конфигурации

# список доменов держащих почту на этой машине. Тут просто - тупо
# указываем абсолютное имя файла, и exim построчно его добавляет к списку
domainlist local_domains = @ : /etc/mail/local-host-names

# added by lissyara 2007-09-02 in 02:35 MSK
# пришлось поменять группу exim`a с дефолтовой на wheel, причина - 
# права доступа к перечисленным выше файлам, ISPmanager выставляет
# на них права 640 и root:wheel; а exim некоторые читает не от рута.
exim_group = wheel
#exim_group = mail

# added by lissyara 2007-09-02 in 02:26 MSK
# юзаем сислог и штатную ротацию логов
syslog_timestamp = no
log_file_path = syslog


# далее - правки acl_check_rcpt

# в паре ACL надо закомментить строку:
# control = submission
# иначе начнутся грабли с адресами, вылезут адреса такого
# типа - <"user@domain.su"@domain.su>

# то, ради чего всё и затеяно - блэк листы. Оно же - главная подпорка,
# т.к. их нет в отдельном файле, тока в конфиге sendmail, поэтому они
# оттуда выгребаются скриптом по крону, и складываются в файл.
# надо заметить, что в данной опции, к сожалению, нельзя юзать
# списки хостов, поэтому есть некоторый элемент изврата в построении
# данного списка
  deny    message       = rejected because $sender_host_address is\
  in a black list at $dnslist_domain\n$dnslist_text
          dnslists      = ${lookup{lists}	\
				lsearch{/usr/local/etc/exim/blacklists.txt}}


# далее - правки раздела конфигурации роутеров

# тут роутер dnslookups

# роутер по файлу системных альясов - отличие от штатного - лишь одно,
# последняя строка - добавлена для ограничения его обрабоки
# только локальными системными пользователями
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
  # added by lissyara 2007-09-01 in 21:28 MSK
  domains = $primary_hostname

# added by lissyara 2007-09-01 in 21:09 MSK
# роутер обработки альясов с виртуальных юзеров на реальных системных
# практически полная копия системных альясов, но для поиска
# используется полностью квалифицированные адреса по другому файлу
ispmanager_aliases:
  driver       = redirect
  allow_fail
  allow_defer
  data         = ${lookup{$local_part@$domain}	\
			lsearch{/etc/mail/virtusertable}}
  user         = mailnull
  group                = mail
  file_transport = address_file
  pipe_transport = address_pipe

# тут роутер userforward

# роутер локаюзер. Отличие от дефолтвого лишь одно - добавлен
# добавлен домен для ограничения обработки лишь системными пользователями
localuser:
  driver = accept
  check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
  # added by lissyara 2007-09-01 in 21:31 MSK
  domains = $primary_hostname
  transport = local_delivery
  cannot_route_message = Unknown user


# далее - секция транспортов. Показаны лишь транспорты, которые менялись
# пришлось поменять юзера от которого работает транспорт - иначе
# не запускалось vacation - уведомление о получении (или о отпуске)
# кстати - я так и не уверен, что оно работает, но по крайней мере добился
# чтобы не было ругани при приёме сообщения... :(
address_pipe:
  driver = pipe
  return_output
  # next 2 lines added by lissyara 2007-09-02 in 00:33 MSK
  user = mailnull
  group = mailnull


# секция аутентификаторов - целиком

# единственное отличие от дефолтовых аутентификаторов с использованием
# saslauthd - это поиск и подстановка имени реального юзера, с
# использованием имени виртуального, как ключа. Оператор sg используется
# для удвоения возможных двоеточий в паролях

PLAIN:
  driver                     = plaintext
  server_set_id              = $auth2
  server_prompts             = :
  server_condition           = ${if saslauthd{{${lookup{$auth2}         \
                                lsearch{/etc/mail/virtusertable}}}      \
                                {${sg{$auth3}{:}{::}}}{smtp}} {yes}{no}}

LOGIN:
  driver                     = plaintext
  server_set_id              = $auth1
  server_prompts             = <| Username: | Password:
  server_condition           = ${if saslauthd{{${lookup{$auth1}         \
                                lsearch{/etc/mail/virtusertable}}}      \
                                {${sg{$auth2}{:}{::}}}{smtp}} {yes}{no}}

   Ну и самая главная, и единственная подпорка - это скрипт для выгребания блэклистов DNS из конфига sendmail, поскольку вносимые через админку, фигурируют только в нём. Данный скрипт запускаем кроном, с нужной частотой. Если будете прописывать в рутовый крон - то тока кроном с админки, посколько она перезапишет ваши строки при удобном случае... Можно запускать от другого пользователя, лишь бы прав хватало, на запись, ибо на чтение - они есть - конфиг читается всеми:
cat /etc/mail/blacklists.sh
#!/bin/sh

# variables
blacklist_file="/usr/local/etc/exim/blacklists.txt"
sendmail_config="/etc/mail/sendmail.cf"
grep="/usr/bin/grep"
awk="/usr/bin/awk"

# очищаем файл, заодно всовываем в него ключ по которому ищем
echo -n "lists" > ${blacklist_file}
# extract blacklists domain
# изврат - '\.\$' - используется для удаления символа точки на конце
# имени домена. В таком виде, exim не может их обработать...
${grep} "DNS based IP address spam list" ${sendmail_config} \
        | ${awk} '{print $8}' | ${awk} -F '\.\$' '{print $1}'|
        {
        while read list
        do
                # добавляем домены
                echo -n " : ${list}" >> ${blacklist_file}
        done
        }

# валим
exit 0;

   Ещё косяк - по умолчанию, директория с сокетом saslauthd ограничена на чтение-запись:
03% ll /var/run/saslauthd/mux 
srwxrwxrwx  1 root  mail  0 Sep  2 02:38 /var/run/saslauthd/mux
03# ll /var/run | grep saslauthd
drwxrwx---  2 cyrus   mail      512 Sep  2 02:38 saslauthd

   И у exim, в момент аутентификации, не хватает прав добраться до сокета. Как вариант, я сделал так:
chown mailnull /var/run/saslauthd

   Далее, добавляем-удаляем такой набор строк в /etc/rc.conf:
# next 2 lines commented by lissyara 2007-09-02 in 02:23 MSK
#sendmail_enable="YES"
#sendmail_msp_queue_enable="NO"
# added by lissyara 2007-09-02 in 02:23 MSK
sendmail_enable="NONE"
exim_enable="YES"
saslauthd_enable="YES"

   И правим конфиг враппера:
more /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

   Ну и всё. Останавливаем sendmail, запускаем saslauthd и exim - готово:
/etc/rc.d/sendmail forcestop
/usr/local/etc/rc.d/saslauthd start
/usr/local/etc/rc.d/exim start

P.S. Что касается автоответа - не уверен, что он работает, а ман читать лениво. По крайней мере, в такой же конфигурации с sendmail он не приходит, а что в админке надо сделать чтоб приходил - я не понял...
P.S.2 Для отладки работы в сети, юзаем:
/usr/local/sbin/exim -bd -d+all

  Для первых данных:
/usr/local/sbin/exim -d+all local@user < /etc/rc.conf

P.S.3 По результатам первых тестов - вроде работает автоответчик... Короче - ну и хрен с ним :)



размещено: 2007-09-02,
последнее обновление: 2007-11-22,
автор: lissyara


Влад., 2007-09-03 в 1:31:28

Этот пост говорит о нежелании разбираться в sendmail'e.
Все ошибки надуманные.

ispsystem, 2007-09-03 в 7:21:05

А зачем такой изврат?
ISPmanager умеет прекрасно работать и с exim и еще много c чем. В доке есть подробное описание как его связать с нужным вам MTA.

lissyara, 2007-09-03 в 8:45:50

Нежелаю. А кто бы отрицал - нафиг он мне сдался?
Что касается документации - на сайте не нашёл, ссылка из админки - битая. Тратить МОЁ время на изучение продукта, который МНЕ не интереен - не желаю. Лучше я потрачу время на изучение того, что мне интересно - exim. Что и описано :)

dvg_lab, 2007-09-03 в 9:18:32

сертификация по FreeBSD предполагает знание sendmail, это так к слову :)

lissyara, 2007-09-03 в 9:22:05

Что понимать под знанием? :)
Года три назад я его настраивал, и он у меня даже работал майлером. Нормально работал. Тока функционала нехватало, да реализация виртуальных юзеров как была кривая, так и не опрямела...
Но это не значит, что не надо стремиться к лучшему. Что я и делаю :)

PuzzleW, 2007-09-03 в 15:23:15

привязка exim'a к ispmanager'y по документации не прошла. exim даже не стартовал.

более того, задача которая стояла - предавторизация для открывания рилея даже для ip из *BL - на exim'e решается проще чем в sendmail

текщее решение проблеимы - по статье - практически идеально, разве что BL приходиться извращенным образом выковыривать :)

offtop:
кстати, подтверждаю кривость прикрученности вирутальных пользователей в панели(не тут конечно надо, ну да бог с ним)
создаю в ispmanager домен, завожу пользователя, СРАЗУ вписываю к нему два алиаса. СОЗДАЕТЬСЯ виртуальный пользователь и к нему ТРИ АЛИСА. это еще бы ничего...
НО ПОЧТА в его папку НЕ ДОСТАВЛЯЕТЬСЯ.

Yspex, 2007-09-03 в 21:26:28

Да простит меня Лисс и другие! Вспомните Шерлок Холмса, он говорил, у меня есть моск, есть полочки, и у меня по полочкам разложено то, что мне нужно, а вот то что мне не нужно увы... извольте. Согласен с Лисом!

alik, 2007-09-03 в 22:20:21

Спасибо от имени заказчика :)
Быстрый и качественный результат.
Я уж было разочаровался, что либо все так плохо, либо у меня требования завышенные.
По крайней мере несколько админов (включая службу поддержки minivds) отвечали что на базе sendmail это сделать невозможно.  
В любом случае спасибо за результат, какая разница что там внутри:)

serge, 2007-11-22 в 1:44:13

Респект и увага автору!!! Почта пошла влет.
Только domains = $primary_hostname все таки убрал из конфига.
З.Ы. sendmail может и мощная программа, но порой действительно нет времени разбираться в его конфигах. И дело не в отсутствии желания это сделать.

serge, 2008-01-03 в 23:03:18

Изменился файл конфигурации sendmail под ISPManager. Теперь конфиг лежит в /etc/mail/имя_сервера.cf . Соответственно скрипт для выковыривания "Списков блокировки dnsbl" перестает отрабатывать. Для исправление, правим переменную sendmail_config в файле /etc/mail/blacklists.sh на свое значение.

ashgdw, 2008-03-07 в 16:15:52

# последняя строка - добавлена для ограничения его обрабоки
# только локальными системными пользователями.

Имеется ввиду - для СНЯТИЯ ограничения??? а то когда читаю, мозг вскипает ;))

Irka, 2008-05-11 в 6:46:02

Сиди дальше плюй в паталок!
-1 =(



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1774 секунд
Из них PHP: 31%; SQL: 69%; Число SQL-запросов: 77 шт.
Исходный размер: 41930; Сжатая: 11357