Ключевые слова:dbmail, mail, sendmail, (найти похожие документы)
From: fantom <tolik@dataxp.net.>
Newsgroups:
Date: Mon, 17 Nov 2006 14:31:37 +0000 (UTC)
Subject: Почтовый сервер на основе sendmail и dbmail.
Вступление.
Достался мне внаследство почтовик, проработавший 3 года практически без изменений.
И крутился на нем sendmail, каждый почтовый ящик - отдельный
пользователь (а ящиков примерно 2000 :) ).
Произошло ЧП - сломался сервер, но жесткий диск остался цел и невредим.
В связи с этим было закуплено новое железо. Можно конечно банально
воткнуть старый винт - и пусть все крутиться дальше, как и было до
поломки, но это решение показалось неправильным по нескольким причинам:
1. Винту 4 года, может и посыпалься ненароком.
2. В случае выхода из строя винта как быть с пользовательской почтой? логинами-паролями?
3. Давно была мысль обновить ПО на сервере.
В результате усиленных поисков в инете наткнулся на руководство по настройке связки
Exim+dbmail+SpamAssasin+Антивирус (http://www.opennet.dev/docs/RUS/dbmail/)
Именно это руководство и послужило отправной точной для дальнейших действий и поисков.
Почему...
1. Почему sendmail?
Из почтовых серверо Qmail, Sendmail, Postfix и Exim мне больше всего
понравился Qmail: прост в настройке, по всем отзывам и по собственным
впечатлениям - быстр, надежен, наименьшее количество обнаруженых
уязвимостей (если не сказать - полное их отсутствие); но и давно не
обновлялся, большинство функционала реализуется сторонними утилитами,
т.е. требует довольно существенного "обвеса" для дастижения
необходимого уровня.
Postfix - сам его не "щупал", порасспрашивал знакомых (и неочень) людей,
оказалось, что Postfix практически никто не применяет на почтовых
серверах, обслуживающих хотя-бы 1000 ящиков и 10-15 доменов (просьба не
возмущаться поклонников Postfix-а, верю что это хороший МТА, но это - не
мой выбор).
Exim - мне тут сложно что-либо сказать, имею только косвенные данные -
по моим опросам примерно 3 из 10 используют Exim, причины - проще
настроить, чем sendmail; меньшее количество уязвимостей, чем в sendmail.
Sendmail - несмотря на регулярные проблемы с безопасностью и сложность
настройки почему все-таки Sendmail?
1.1. Сложность конфига компенсируется относительной простотой xxxxx.mc
файла из которого с помошью m4 получаем конфиг, помоемому xxxxx.mc
выглядит не сложнее, чем конфиг Exim-а.
1.2. как сказал один знакомый "Sendmail может ВСЕ! на что только
способна почта".
2. Почему dbmail?
Очень заманчива идея хранить в базе данных не только логин-пароль, но и
сами письма. Сразу есть поддержка обьема почтового ящика. Можно держать
базу на отдельном серваке.Быстро восстановить работу сервера при сбое из
дампа базы. Поиском иных вариантов не занимался, возможно существуют
альтернативы dbmail (даже наверняка существуют), но меня вполне
устраивает dbmail.
DBMail - Установка и настройка.
-------------------------------
Официальный сайт http://www.dbmail.org/.
На момент написания последний стабильный релиз был dbmail-2.0.10.
Скачиваем архив dbmail-2.0.xx.tar.gz
распаковываем tar -zxf dbmail-2.0.xx.tar.gz
cd dbmail-2.0.xx
Можно (и желательно) внимательно прочитать INSTALL
Далее говорим, что наша база - PostgreSQL (ну или MySQL - кому как надо)
./configure --with-pgsql (или --with-mysql)
И далее хорошо знакомое
make
Если были ошибки - выявляем причины и устраняем.
make check
make install
Желательно для dbmail специально создать пользователя, хотя и
необязательно (я создал и обозвал dbmail)
Далее необходимо создать собственно базу данных.
Для этого читаем файлик INSTALL.dbmail в котором и описана эта процедура.
Конкретно для PostgreSQL необходимо проделать следующее:
создаем пользователя с именем dbmail (имя можно любое)
createuser -U postgres dbmail
Теперь надо присвоить пользователю пароль
psql postgres postgres
Присваиваем пароль
ALTER USER dbmail WITH PASSWORD '<password>';
\q
Теперь создаем базу
createdb -U dbmail dbmail
И создаем таблицы в базе:
psql -U dbmail dbmail < sql/postgresql/create_tables.pgsql
Теперь копируем конфигурационный файл в /etc
cp dbmail.conf /etc/
Правим конфиг...
Параметры говорят сами за себя, и у человека хоть немного знакомого с английским
вопросов вызывать недолжны.
Какие возникли проблемы - поумолчанию в конфиге указано довольно большое
количество подключений к базе данных, при запуске dbmail-pop3d база
перестала принимать подключения для начала стоит выбрать числа поменьше
(MAXCHILDREN и MAXCONNECTS я для начала уменьшил в 10 раз)
Теперь база данных готова для использования.
Добавление пользователей можно делать с помощью консольной утилиты
dbmail-users dbmail-users -a username -w secret -g 0 -m 25M -s
username@domain.org username1@domain.net
-a username - имя пользователя
-s username@domain.org - алиас (можно несколько через пробел) почта ДЛЯ этих адресов будет складываться
в ящик username
-m 25M - обьем ящика (поумолчанию - в байтах, K - килобайты, M - мегабайты) 25Мегабайт
-w secret - пароль
Прочие опции желающие могут поизучать прочтя вывод команды
dbmail-users --help
Еще в INSTALL.dbmail рекомендуют добавить в cron следующую строку:
0 3 * * * /usr/local/sbin/dbmail-util -cturpd -l 24h -qq
Для обслуживания базы данных.
DBmail предоставляет в наше распоряжение 2 транспорта для передачи писем
в базу данных dbmail-lmtp и dbmail-smtp.
Если MTA поддерживает lmtp то рекомендуется использовать именно его.
Запуск:
dbmail-lmtpd
и
dbmail-pop3d (или dbmail-imapd - кому что нравиться)
Осталось состыковать наш MTA с dbmail.
На сайте http://www.dbmail.org/ имеется wiki с описанием стыковки dbmail
с Qmail, Exim, Postfix и Sendmail.
Подключение к Sendmail.
Для того, чтобы sendmail понял, чего мы от него хотим, надо сначала
создать 2 m4 макроса: /usr/share/sendmail/cf/mailer/dbmail.m4
PUSHDIVERT(-1)
ifdef(`DBMAIL_MAILER_PATH',,
`ifdef(`DBMAIL_PATH',
`define(`DBMAIL_MAILER_PATH', DBMAIL_PATH)',
`define(`DBMAIL_MAILER_PATH', /usr/sbin/dbmail-smtp)')')
_DEFIFNOT(`DBMAIL_MAILER_FLAGS', `SPhnu9')
ifdef(`DBMAIL_MAILER_ARGS',,
`define(`DBMAIL_MAILER_ARGS', `dbmail -d $u')')
POPDIVERT
Mdbmail, P=DBMAIL_MAILER_PATH, F=_MODMF_(CONCAT(`DFM', DBMAIL_MAILER_FLAGS), `DBMAIL'),
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
ifdef(`DBMAIL_MAILER_MAX', `M=DBMAIL_MAILER_MAX, ')T=DNS/RFC822/X-Unix,
A=DBMAIL_MAILER_ARGS
и
/usr/share/sendmail/cf/mailer/dbmail-lmtp.m4
PUSHDIVERT(-1)
ifdef(`DBMAIL_MAILER_PATH',,
`ifdef(`DBMAIL_PATH',
`define(`DBMAIL_MAILER_PATH', DBMAIL_PATH)',
`define(`DBMAIL_MAILER_PATH', [IPC])')')
_DEFIFNOT(`DBMAIL_MAILER_FLAGS', `AhmXz5@/:|')
ifdef(`DBMAIL_MAILER_ARGS',,
`define(`DBMAIL_MAILER_ARGS', `TCP $h 24')')
POPDIVERT
Mdbmail-lmtp, P=DBMAIL_MAILER_PATH, F=_MODMF_(CONCAT(`DFM', DBMAIL_MAILER_FLAGS), `DBMAIL'),
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
ifdef(`DBMAIL_MAILER_MAX', `M=DBMAIL_MAILER_MAX, ')T=DNS/RFC822/X-Unix,
A=DBMAIL_MAILER_ARGS
На этом этапе возникла только одна проблемка, поумолчанию у меня
dbmail-smtp стал в /usr/local/sbin, а макрос ищет его в /usr/sbin/
ситуацию можно поправить создав ссылку
ln -s /usr/local/sbin/dbmail-smtp /usr/sbin/dbmail-smtp
или поправив исходник макроса.
Теперь в sendmail.mc (или его эквивалент)
добавляем строчки:
FEATURE(`mailertable')dnl
MAILER(dbmail)dnl
MAILER(dbmail-lmtp)dnl
в /etc/mail/mailertable (именно его задает "FEATURE(`mailertable')" )
указываем домены, почта для которых будет передаваться в dbmail
domain.org dbmail-lmtp:[127.0.0.1]
domain.net dbmail-lmtp:[127.0.0.1]
Незабыть убрать эти домены из /etc/mail/local-host-names (или его
эквивалента), иначе письма для этих доменов в dbmail непопадут, а будут
доставлены локальным пользователям.
Пересобрать конфиг sendmail-а и перезапустить sendmail.
Теоретически ВСЕ! почта должна складываться в базу даных и отдаваться по
протоколу pop3 или imap в зависимости от того, какой демон
(dbmail-pop3d или dbmail-imapd) запущен.
ВАЖНО! При рестарте ОЧЕНЬ желательно, чтобы dbmail-lmtpd запускался
раньше sendmail-а.
Теперь осталось настрить sendmail для отбивания спама.
Проверка адреса отправителя.
Воспользуемся фильтрами, работающими посредствам Milter API в sendmail.
Т.к. milter-sender теперь платный, воспользуемся фильтром smf-sav
http://smfs.sourceforge.net/smf-sav.html выполняющим те же функции.
Качаете, распаковываете, правите Makefile (сценария ./configure там не
предусмотрено), затем
make
make install
Правим конфиг /etc/mail/smfs/smf-sav.conf
и запускаем:
/usr/local/sbin/smf-sav
или
/usr/local/sbin/smf-sav -c /etc/mail/smfs/smf-sav.conf
Теперь в sendmail.mc добавляем строчки для smf-sav,
dnl Проверка Адреса отправителя
define(`confMILTER_MACROS_HELO', confMILTER_MACROS_HELO`, {verify}')dnl
INPUT_MAIL_FILTER(`smf-sav', `S=unix:/var/run/smfs/smf-sav.sock, T=S:30s;R:4m')dnl
Далее в папке /etc/mail
make all install && ../rc.d/sendmail restart
Если все впорядке, то в логе /var/log/maillog можно увидеть строчки вида
smf-sav[528]: sender check succeeded: <72stocknews@totallytitanium.com.>, 84.168.240.99,
p54A8F063.dip.t-dialin.net, [00:00:03]
(адрес существует)
или
smf-sav[528]: recipient check failed: <duncan@kr.dataxp.net.>, 84.168.240.99,
p54A8F063.dip.t-dialin.net, <72stocknews@totallytitanium.com.>, [00:00:01]
(адрес несуществует)
ВАЖНО! При рестарте НЕОБХОДИМО, чтобы smf-sav запускался раньше
sendmail-а, иначе проверка небудет выполняться.
Можно прикрутить еще проверку на зомбированые хосты.
Например при помощи smf-zombie, в механизмах его работы я не разбирался,
могу только сказать, что это дает определенный эффект.
Качаете там же, где и smf-sav, распаковываете, правите Makefile
(сценария ./configure там не предусмотрено), затем
make
make install
Конфигов для него никаних ненужно.
Запускаем:
/usr/local/sbin/smf-zombie
Теперь в sendmail.mc добавляем строчки для smf-zombie
dnl Убивание спама от зомбированых хостов
dnl Этот фильтр должен быть ПЕРВЫМ среди остальных фильтров
define(`confMILTER_MACROS_HELO', confMILTER_MACROS_HELO`, {verify}')dnl
define(`confMILTER_MACROS_ENVFROM', confMILTER_MACROS_ENVFROM`, {msg_size}')dnl
INPUT_MAIL_FILTER(`smf-zombie', `S=unix:/var/smfs/smf-zombie.sock, T=S:30s;R:1m')dnl
define(`confPRIVACY_FLAGS', `goaway,noetrn,nobodyreturn,noreceipts')dnl
define(`confTO_COMMAND', `1m')dnl
define(`confTO_IDENT', `0s')dnl
define(`confTO_RESOLVER_RETRANS', `7s')dnl
define(`confTO_RESOLVER_RETRY', `4')dnl
define(`confMAX_DAEMON_CHILDREN',`256')dnl
define(`confCONNECTION_RATE_THROTTLE',`8')dnl
define(`confBAD_RCPT_THROTTLE', `1')dnl Sendmail v8.12+
Далее в папке /etc/mail
make all install && ../rc.d/sendmail restart
ВАЖНО! Этот фильтр должен быть ПЕРВЫМ среди остальных фильтров в конфиге sendmail-а
ВАЖНО! При рестарте НЕОБХОДИМО, чтобы smf-sav запускался раньше sendmail-а.
Послесловие.
Все вышеуказаное было проделано на FreeBSD 6.1 и успешно заработало
практически с первой попытки.
Писано это было скорее как шпаргалка, а не как подробное пошаговое руководство.
Врядли настройка ответственного сервера будет доверена человеку
неумеющему создать нового пользователя в системе; например о
первоначальной настройке sendmail-а ничего не сказано, считается что
читатель самостоятельно проделает первоначальную настройку.
На момент "опубликования" произошли некоторые изменения - ветка
dbmail-2.2 стала стабильной.
Ради любопытства проделал все вышеперечисленное на другой машине с
FreeBDS 6.1, - разницы в установке никакой, различаются только структуры
базы данных.
>Postfix - сам его не "щупал", порасспрашивал >знакомых (и неочень) людей,
>оказалось, что Postfix практически никто не >применяет на почтовых
>серверах, обслуживающих хотя-бы 1000 ящиков и 10->15 доменов (просьба не
>возмущаться поклонников Postfix-а, верю что это >хороший МТА, но это - не мой выбор).
просто плакал.
>1.2. как сказал один знакомый "Sendmail может >ВСЕ! на что только
>способна почта".
ровно такие же костыли как и в qmail - левые демоны рабтающие через milter, в то время как нормальные MTA реализуют одной строкой в конфе.
и не зря его начали переписывать с нуля.
Ставя из исходников я всегда знаю с какими параметрами что собирал,
При необходимости перестановки (например на другую систему) ненадо гадать какие
параметры там поумолчанию.
>>это что болезнь такая из исходников ставить?
>
>Ставя из исходников я всегда знаю с какими параметрами что собирал,
>При необходимости перестановки (например на другую систему) ненадо гадать какие
>параметры там поумолчанию.
научитесь пользоватся портами. и не превращайте систему в slackware.
P.S. про постфикс еще раз. freebsd.org пользует постфикс со всеми мэйлистами и прочей шелухой. догадайтесь какой там трафик.
и опеннет тоже Ж)
так что категоричных утверждений не надо.
>>>это что болезнь такая из исходников ставить?
>>
>>Ставя из исходников я всегда знаю с какими параметрами что собирал,
>>При необходимости перестановки (например на другую систему) ненадо гадать какие
>>параметры там поумолчанию.
>
>
>научитесь пользоватся портами. и не превращайте систему в slackware.
>P.S. про постфикс еще раз. freebsd.org пользует постфикс со всеми мэйлистами и
>прочей шелухой. догадайтесь какой там трафик.
>и опеннет тоже Ж)
>так что категоричных утверждений не надо.
а в портах уже есть эти фильтры?
или раз в портах нет, то из исходников компилять это зазорно?
>>>>это что болезнь такая из исходников ставить?
>>>
>>>Ставя из исходников я всегда знаю с какими параметрами что собирал,
>>>При необходимости перестановки (например на другую систему) ненадо гадать какие
>>>параметры там поумолчанию.
>>
>>
>>научитесь пользоватся портами. и не превращайте систему в slackware.
>>P.S. про постфикс еще раз. freebsd.org пользует постфикс со всеми мэйлистами и
>>прочей шелухой. догадайтесь какой там трафик.
>>и опеннет тоже Ж)
>>так что категоричных утверждений не надо.
>а в портах уже есть эти фильтры?
>или раз в портах нет, то из исходников компилять это зазорно?
а пропатчить порт и сделать это достоянием общественности никак (man send-pr)? или вы привыкли работать только для себя? с большой вероятностью это еще кому-то потребуется, да вам же при повторной инсталляции скаже на secondary MX.
P.S. я именно так и делаю.
>>>>>это что болезнь такая из исходников ставить?
>>>>
>>>>Ставя из исходников я всегда знаю с какими параметрами что собирал,
>>>>При необходимости перестановки (например на другую систему) ненадо гадать какие
>>>>параметры там поумолчанию.
>>>
>>>
>>>научитесь пользоватся портами. и не превращайте систему в slackware.
>>>P.S. про постфикс еще раз. freebsd.org пользует постфикс со всеми мэйлистами и
>>>прочей шелухой. догадайтесь какой там трафик.
>>>и опеннет тоже Ж)
>>>так что категоричных утверждений не надо.
>>а в портах уже есть эти фильтры?
>>или раз в портах нет, то из исходников компилять это зазорно?
>
>
>а пропатчить порт и сделать это достоянием общественности никак (man send-pr)? или
>вы привыкли работать только для себя? с большой вероятностью это еще
>кому-то потребуется, да вам же при повторной инсталляции скаже на secondary
>MX.
>P.S. я именно так и делаю.
1. Работай я только на себя - не утруждался бы написанием подобных заметок, лично мне хватило бы описания раза в 3 короче.
2. Не на всех системах есть порты!
Есть например линукс - и там уже лезть надо в исодник пакета и ковыряться в нем.
Иксы или какой-нить ОпенОфис незадумываясь полезу ставить из портов, а вот что-нить типа apach или dbmail предпочитаю из исходников.
А никто и не делал категоричных утверждений :)
Всего лишь среди опрошеных мною людей (примерно 30 человек) ниукого небыло
сервера на postfix-е крупнее 100 ящиков...
>А никто и не делал категоричных утверждений :)
>Всего лишь среди опрошеных мною людей (примерно 30 человек) ниукого небыло
>сервера на postfix-е крупнее 100 ящиков...
вот сразу наскидку 2 человека :)
опять же посмотрите в хедера любого письма пришедего вам с крупного релея, там тоже найдется достаточно постфиксов :))
Перенос пользователей в базу еще незакончен.
примерно 50% юзеров заводились специальным скриптом и их пароли остались в логах.
Ну а остальных придется вылавливать снифером.
>Ясно.
>Просто хотелось бы как-нибудь автоматически провести этот перенос, т.к. у меня подобная
>проблема, и пользователей довольно много.
>
>Почитал доки, так и не понял, как он хранит пароли в базе,
>помоему открытыми.
при заведении можно указать
-p pwtype password type may be one of the following:
plaintext, crypt, md5-hash, md5-digest, md5-base64
each type may be given a '-raw' suffix to indicate
that the password argument has already been encoded.