Установка и настройка почтовой системы на базе Posfix

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'

Вроде всё, если хорошо читали документацию и всё поняли - должно
заработать с полпинка.

Для первого раза, чтобы проверить свой почтовый ящик, нужно сначала
отправить себе письмо =)

Источник

free-templates.ru