From: Sergey Levashev (aka Chek) <chek@alt.ru.>
Newsgroups: email
Date: Mon, 23 May 2005 18:21:07 +0000 (UTC)
Subject: Установка и настройка почтовой системы на базе Postfix
Установка и настройка Postfix + PostgreSQL + Courier-Authlib +
Courier-Imap + SqWebMail + Maildrop + ClamAV + SpamAssassin + AWStats
- Postfix (http://postfix.org) - MTA
- PostgreSQL (http://postgresql.org) - БД
- Courier-Authlib (http://www.courier-mta.org) - Демон и библиотека аутентификации
- Courier-Imap (там же) - IMAP и POP демон
- Maildrop (там же) - MDA
- SqWebMail (там же) - Веб-интерфейс для работы с почтовыми ящиками
- ClamAV (http://www.clamav.net/) - Фриварный антивирус
- SpamAssassin (http://spamassassin.apache.org/) - Убийца и маркировщик спама
- AWStats (http://awstats.sourceforge.net/) - Генератор статистики.
Intro
Есть: старый-старый сервер (FreeBSD 4.2, Sendmail, Courier-Imap), часто
падающий из-за перегрузок (ну как же без SpamAssassin'a и ClamAV'a?), с
загаженной базой пользователей (ну очень) и с очень загаженным винтом
(похлеще будет), притом пользователи (все 3000) созданы локально.
Также имеется база пользователей в PostgreSQL.
Хотим: перенести это с минимумом усилий и с учётом дальнейшего
разрастания пользовательской базы.
После двух недель блуждания по далёким серверам и надоедания гуглу
вопросом как связать PostgreSQL с сендмейлом без перестройки формата базы я
нашел патчик для связки с базой. http://blue-labs.org/software/sm-pgsql/
Принцип работы не понравился.
Решение: виртуальные почтовые ящики.
PostgreSQL
описание установки и настройки пропущу - читаем документацию
Courier-Authlib
Читаем документацию. Думаем. Устанавливаем.
В /etc/authlib/authdaemonrc пишем:
authmodulelist="authpgsql"
daemons=5
DEBUG_LOGIN=0
DEFAULTOPTIONS=""
В /etc/authlib/authpgsqlrc пишем:
PGSQL_HOST хост.где.находится.база
PGSQL_PORT 5432
PGSQL_USERNAME имя
PGSQL_PASSWORD пароль
PGSQL_CRYPT_PWFIELD crypt
PGSQL_CLEAR_PWFIELD clear
PGSQL_DATABASE база данных с пользователями и их паролями
#Так как база у меня в своём формате
PGSQL_SELECT_CLAUSE SELECT c.login as username,'' as cryptpw, \
c.pass as clearpw,506 as uid, \
506 as gid,'/mailboxes/'||substring(c.login from 1 for 1)||'/'||c.login as home,\
'' as maildir, \
30 as quota,con.nameorg as fullname, \
'disableimap' as options from cusers as c, \
contracts as con where c.cid=con.cid and c.tid in (1,2) and c.deleted='-' and c.login = '$(local_part)';
#'/mailboxes/'||substring(c.login from 1 for 1)||'/'||c.login as home -- пользовательские ящики с путями /mailboxes/первая_буква_логина/логин
#gid 506 и uid 506 - пользователь vmail, которому будет принадлежать вся почта
Читаем документацию. Запускаем.
Courier-Imap
Читаем документацию. Думаем. Устанавливаем. Если надо - исправляем
дефолтные настройки. Читаем документацию. Запускаем.
Maildrop
Читаем документацию. Думаем. Устанавливаем.
в /etc/maildroprc пишем:
`test -f $HOME/.mailfilter`
if ( $RETURNCODE == 0 )
{
include '.mailfilter'
if ( $QUIT )
REASON="users's filter"
}
to 'Maildir/.'
SpamAssassin
Читаем документацию, устанавливаем все необходимые перловые модули и DCC
с Razor2.
Пишем скрипт запуска:
#!/bin/sh
case "$1" in
start)
spamd -d -u clamav -m 7 -i 127.0.0.1 \
--max-conn-per-child=5 -r /home/clamav/spamd.pid
;;
stop)
kill `cat /home/clamav/spamd.pid`
;;
restart)
$0 stop
$0 start
;;
esac
Правим конфиг /etc/mail/spamassassin/local.cf:
report_contact me@myhost.ru
rewrite_subject 1
report_safe 0
whitelist_from *@myhost.ru
lang ru
ok_languages ru en
ok_locales ru en
rewrite_header Subject SPAM(_SCORE_)
auto_whitelist_path /etc/mail/spamassassin/auto_whitelist
bayes_path /etc/mail/spamassassin/bayes
bayes_auto_learn 0
auto_learn 0
use_bayes 0
use_bayes_rules 0
use_auto_whitelist 0
use_razor2 1
use_dcc 1
use_pyzor 0
score FROM_ILLEGAL_CHARS 0.5
score HEAD_ILLEGAL_CHARS 0.5
score SUBJ_ILLEGAL_CHARS 1.0
score HTML_FONTCOLOR_RED 3.0
score MIME_HTML_ONLY 2.0
score HTML_FONT_BIG 1.5
score RAZOR2_CF_RANGE_51_100 2.0
score BAYES_99 3
score RCVD_IN_NJABL_DUL 5.5
score URIBL_SBL 3
score RCVD_IN_SORBS_DUL 6.2
score DCC_CHECK 4.9
score RCVD_IN_XBL RBL 8.1
score DNS_FROM_AHBL_RHSBL 8.1
score RAZOR2_CHECK 8.7
#score HTML_FONT_INVISIBLE
required_hits 8
ClamAV
Заводим пользователя clamav, создаём директорию /var/clamav/{log,tmp} и
назначаем владельцем clamav
Читаем документацию. Думаем. Устанавливаем.
Правим /usr/local/etc/clamd.conf:
LogFile /var/clamav/clamav.log
LogFileMaxSize 2M
LogTime
LogClean
LogSyslog
LogFacility LOG_MAIL
LogVerbose
PidFile /var/clamav/clamd.pid
TemporaryDirectory /var/clamav/tmp
DatabaseDirectory /var/clamav
LocalSocket /var/clamav/clamd.sock
FixStaleSocket
MaxConnectionQueueLength 30
StreamMaxLength 400k
MaxThreads 100
IdleTimeout 5
SelfCheck 100
User clamav
ScanHTML
ScanArchive
ScanRAR
ArchiveMaxFileSize 400k
Правим /usr/local/etc/freshclam.conf:
DatabaseDirectory /var/clamav
UpdateLogFile /var/clamav/freshclam.log
PidFile /var/clamav/freshclam.pid
DatabaseOwner clamav
DatabaseMirror database.clamav.net
Checks 24
Переходим к самому интересному.
Postfix
Читаем документацию, из неё видим:
For example:
% make tidy
% make -f Makefile.init makefiles \
'CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql' \
'AUXLIBS=-L/usr/local/lib -lpq'
Then just run 'make'.
собираем, устанавливаем.
Заводим пользователя vmail.
Перенаправляем всю почту на наш хост в виртуал, правим /etc/postfix/transport:
почтовый.сервер.ru virtual:
В /etc/postfix/access разрешаем хостам отправлять почту через нас
В /etc/postfix/virtual у нас теперь и алиасы и виртуальные пользователи,
alias_maps и alias_database не возымеют на виртуальными пользователями никакой власти,
а локальных у нас теперь нет =)
Необходимые нам параметры в /etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
mynetworks = hash:/etc/postfix/access
virtual_transport = maildrop
virtual_mailbox_maps = pgsql:/etc/postfix/mailbox.pgsql
virtual_uid_maps = static:506 #пользователь vmail
virtual_gid_maps = static:506 #пользователь vmail
virtual_alias_maps = hash:/etc/postfix/virtual
mynetworks_style = host
relay_domains =
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings
smtpd_sender_restrictions =
permit_mynetworks,
reject_non_fqdn_sender,
reject_rbl_client list.dsbl.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client combined.njabl.org,
reject_rbl_client rhsbl.ahbl.org,
reject_rbl_client multi.surbl.org,
reject_rbl_client relays.ordb.org,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_invalid_hostname,
reject_unknown_sender_domain
smtpd_client_restrictions =
permit_mynetworks,
reject_non_fqdn_sender,
reject_rbl_client list.dsbl.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client combined.njabl.org,
reject_rbl_client rhsbl.ahbl.org,
reject_rbl_client multi.surbl.org,
reject_rbl_client relays.ordb.org,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_invalid_hostname,
reject_unknown_sender_domain
smtpd_recipient_restrictions =
reject_unlisted_recipient,
permit_mynetworks,
permit_mx_backup,
reject_non_fqdn_recipient,
reject_unauth_destination
остальное правим на свой вкус и цвет.
в /etc/postfix/master.cf:
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/etc/postfix/test -d ${user}
#test - научит постфикс автоматом создавать ящик для maildrop
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
Если не поняли - читаем http://www.nixp.ru/cgi-bin/go.pl?q=articles;a=clamav_postfix
Создаём /etc/postfix/test
#!/bin/bash
if ! test -d /mailboxes/${2:0:1}/$2; then
mkdir /mailboxes/${2:0:1}/$2 && /usr/local/bin/maildirmake /mailboxes/${2:0:1}/$2/Maildir ;
fi
#echo $2 >> /mailboxes/test
/usr/local/bin/maildrop $@
делаем его исполняемым
Запускаем mkdir /mailboxes/{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} && chown vmail.vmail -R /mailboxes
SpamAssassin можно теперь сделать индивидуально или глобально, также
пользователи могут иметь свои white и black листы (читаем документацию)
для глобальной проверки почты spamassassin'om в /etc/maildroprc
Добавляем в начало:
if ( $SIZE < 256000 ) # Filter if message is less than 250k
{
log " running message through spamc"
exception {
xfilter '/usr/bin/spamc -u $LOGNAME'
}
}
#Если хотим, чтобы спам зарезался на месте:
if ( /^X-Spam-Status: *Yes/)
{
to "/dev/null"
}
Для проверки индивидуально - делаем тоже самое в файле /mailboxes/firs_char_of_user/user/.maildroprc
Если хотим сделать красивее, то создаём файлик /mailboxes/scheck, в него пишем:
if ( $SIZE < 256000 ) # Filter if message is less than 250k
{
log " running message through spamc"
exception {
xfilter '/usr/bin/spamc -u $LOGNAME'
}
}
Создаём файлик /mailboxes/sdrop:
if ( /^X-Spam-Status: *Yes/)
{
to "/dev/null"
}
И теперь .maildroprc будет выглядеть:
#для проверки
include '/mailboxes/scheck'
#для удаления спама
include '/mailboxes/sdrop'
Вроде всё, если хорошо читали документацию и всё поняли - должно
заработать с полпинка.
Для первого раза, чтобы проверить свой почтовый ящик, нужно сначала
отправить себе письмо =)
Disclamer
Статью писал в первый раз, в обеденный перерыв, если что забыл - по ушам
не пинать =) поносить меня можно в icq 263665548
Источник