Вы здесь

Postfix

Переход на Postfix с sendmail в CentOS осуществляется почти автоматически.
Устанавливаем postfix
yum install postfix
Правим конфигурационные файлы в каталоге /etc/postfix, удаляем Sendmail, cтроим hash для файла aliases, стартуем Postfix и добавляем его в список загружаемых при старте демонов

vi /etc/postfix/main.cf
rpm -e sendmail
newaliases
/sbin/service postfix start
/sbin/chkconfig postfix on

Замечательные русские инструкции по настройке Postfix можно найти здесь: http://sergeysl.pnz.ru/freebsd/mailsystem.php
Данная страница посвящена решению некоторых специфических задач конфигурации.

Альтернативные программы

В CentOS используется специальный механизм выбора версии программы, имеющей несколько реализаций. К таким программам относятся почтовые серверы, принт серверы, различные варианты java. В каталоге /etc/alternatives/ сделаны символические линки на реально установленные программы например, /etc/alternatives/mta изначально является символическим линком на /usr/lib/sendmail.sendmail. При удалении Sendmail происходит замена и /etc/alternatives/mta становится символическим линком на /usr/lib/sendmail.postfix. Файл /usr/sbin/sendmail является в свою очередь линком на /etc/alternatives/mta. Т.к. Postfix обрабатывает те же опции при запуске, что и Sendmail, подмену никто не заметит. Аналогичная ситуайия с mailq, newaliases, rmail.

Борьба со спамом и вирусами

Желательно установить Greylisting, clamav, spamassasin и/или mimedefang

yum install postgrey clamav clamd spamassassin mimedefang

Чтобы установка прошла атоматически, надо подключить к списку репозиториев yum'а Dag RPM Repository ( http://dag.wieers.com/rpm/ )
Возможны некоторые проблемы с зависимостями mimedefang с sendmail. (Похоже там явно прописана зависимость от rpm-пакета sendmail).
Подключение этих программ к Postfix будет описано ниже, при описании конфигурационных файлов.

Mimdefang подключится если у нас Postfix версии 2.4

Правим права доступа

В файле /etc/sysconfig/mimedefang (Проверить)
MX_USER=postfix

chown -R postfix.postfix /var/spool/MIMEDefang

MIMEDefang ожидает что сокет clamd расположен в /var/spool/MIMEDefang/clamd.sock, причем это прошито в коде /usr/bin/mimedefang.pl. Clamd по умолчанию помещает свой сокет в /tmp/clamd.socket. Попробуем сделать линк (Проверить)

ln -s /tmp/clamd.socket /var/spool/MIMEDefang/clamd.sock

По умолчанию MIMEDefang запускает Spamassassin с конфигурационным файлом /etc/mail/sa-mimedefang.cf, а пакет spamassassin устанавливает свой конфиг в /etc/mail/spamassassin/local.cf. Чтобы не было путаницы удаляем /etc/mail/sa-mimedefang.cf, MIMEDefang переключится на /etc/mail/spamassassin/local.cf автоматически.

Для postgrey прописываем белые листы:

Пользователи которым нельзя задерживать доставку почты ни под каким видом
Файл /etc/postfix/postgrey_whitelist_recipients

abuse@
quickaccess@

Локальные сети
Файл /etc/postfix/postgrey_whitelist_clients.local

192.168.100

К сожалению маска сети не предусмотрена. Если ваша подсеть больше или меньше стандартного класса, то придется перечислять все подсети или IP адреса (может получиться до 128 строк на подсеть)

Теперь надо включить postgrey, clamd, spamassassin и mimedefang в автозапуск.
/sbin/chkconfig clamd on
/sbin/chkconfig spamassassin on
/sbin/chkconfig mimedefang on

Файл /etc/postfix/main.cf
Основной конфигурационный файл Postfix'а описывающий «политические» параметры (контроль доступа, виртуальные домены и т.п.).
Полный список параметров и их значения по умолчанию можно посмотреть в main.cf.default
Ограничения на пересылку почты
Перед первым запуском правим имя хоста. Скорее всего оно определится из hostname, но лучше подстраховаться.

myhostname = mail.my.net
myorigin = $mydomain

myorigin подменяет почтовый домен для почты отправляемой с локальной машины. Нынче многие почтовые серверы проверяют наличие MX записи для адреса отправителя. В приведенном примере MX запись для my.net скорее всего существует, а для mail.my.net не существует. Почта с локальной системы, например диагностические сообщения, без установки myorigin будет блокироваться.

Ограничения на пересылку почты определяютя так
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 168.100.189.0/24, 127.0.0.0/8
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
check_policy_service unix:postgrey/socket

Результат ограничений – разрешаем пересылку почты из локальных сетей. Из остального мира после аутенификации и прохождения greylisting'а, либо для наших пользователей из списка почтовых доменов mydestination и прохождения greylisting'а. (есть еще список виртуальных пользователей, но оних ниже).
(Неприятный вопрос, будеть ли greylisting пропускать аутенифицированных пользователей?)
Пример других ограничений http://www.opennet.ru/tips/info/813.shtml

Подключение mimedefang для Postfix версии >= 2.4. Postfix 2.3.3 параметр воспринял, но Mimedefang выдал ошибки протокола при попытке отправить письмо.
smtpd_milters = unix:/var/spool/MIMEDefang/mimedefang.sock
milter_default_action = tempfail

В этом варианте spamassassin и антивирус запустятся через MIMEDefang.

Доставка почты

Почта предназначенная для локальных пользователей может доставляться
в классический файл формата mailbox

mail_spool_directory = /var/mail

или в каталог Maildir

home_mailbox = Maildir/

или с помощью внешней программы (если надо проверять на вирусы только входящую почту, то здесь можно вставить антивирусный фильтр)

mailbox_command = /usr/bin/procmail

или по протоколу lmtp если Postfix используется в связке с Cyrus IMAPD

mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp

Можно описать собственный транспорт в файле /etc/postfix/master.cf

Файл /etc/postfix/master.cf

Конфигурационный файл, описывающий «технические» параметры (запускаемые почтовые службы и их настройки).

Подключение spamassassin и антивируса для Postfix версии < 2.4.
Проверяем только SMTP

#smtp inet n - n - - smtpd
smtp inet n - n - - smtpd -o content_filter=avfilter:dummy
...
avfilter unix - n n - - pipe
flags=R user=clamav argv=/usr/local/sbin/avfilter.sh -f ${sender} -- ${recipient}

Файл /usr/local/sbin/avfilter.sh может быть таким

#!/bin/sh
INSPECT_DIR=/tmp #Каталог куда будут сохраняться письма для сканирования
SENDMAIL="/usr/sbin/sendmail -i"
VIRUSADMIN="root@my.net" # адрес для уведомлениий

EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# строка для запуска spamassassin
FILTER_SPAMC="/usr/bin/spamc"
#FILTER_SPAMC="/usr/bin/spamc -u spamfilter -U /var/run/spamd.sock"
# строка для запуска clamav
FILTER_CLAMAV="/usr/bin/clamdscan -v --no-summary --stdout"

trap "rm -f $INSPECT_DIR/in.$$ $INSPECT_DIR/vr.$$ $INSPECT_DIR/vr1.$$" 0 1 2 3 15

# Проверка на спам
cat | $FILTER_SPAMC > $INSPECT_DIR/in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Проверка на вирусы
$FILTER_CLAMAV ${INSPECT_DIR}/in.$$>$INSPECT_DIR/vr.$$

# Результат проверки
AV_RESULT=$?

case "$AV_RESULT" in
0)
# Проверено. Мин нет :)
$SENDMAIL "$@" <${INSPECT_DIR}/in.$$
exit 0
;;
1)
# Обнаружен вирус. Посылаем уведомление админу
echo "Subject: VIRUS FOUND" >> $INSPECT_DIR/vr1.$$
echo >> $INSPECT_DIR/vr1.$$
echo "************************************************" >> $INSPECT_DIR/vr1.$$
echo "* MAIL *" >> $INSPECT_DIR/vr1.$$
echo "************************************************" >> $INSPECT_DIR/vr1.$$
echo >> $INSPECT_DIR/vr1.$$
# Включаем в отчет реальные адреса релеев
grep Received $INSPECT_DIR/in.$$ >> $INSPECT_DIR/vr1.$$
echo "Mail from: $2 (may be forget)" >> $INSPECT_DIR/vr1.$$
echo "To: $4" >> $INSPECT_DIR/vr1.$$
grep Subject $INSPECT_DIR/in.$$ >> $INSPECT_DIR/vr1.$$
echo >> $INSPECT_DIR/vr1.$$
echo "************************************************" >> $INSPECT_DIR/vr1.$$
echo "* Virus(es) *" >> $INSPECT_DIR/vr1.$$
echo "************************************************" >> $INSPECT_DIR/vr1.$$
# Включаем в отчет список вирусов
cat $INSPECT_DIR/vr.$$ >> $INSPECT_DIR/vr1.$$
$SENDMAIL -f $VIRUSADMIN -r $VIRUSADMIN -F "Antivirus" $VIRUSADMIN < $INSPECT_DIR/vr1.$$
exit 0
;;
*)
# Произошла ошибка в работе антивируса. Сообщим об ошибке админу
echo "Subject: ANTIVIRUS FAILED" >> $INSPECT_DIR/vr1.$$
echo >> $INSPECT_DIR/vr1.$$
echo "************************************************" >> $INSPECT_DIR/vr1.$$
echo "* Antivirus Failed with next problem *" >> $INSPECT_DIR/vr1.$$
echo "************************************************" >> $INSPECT_DIR/vr1.$$
case "$AV_RESULT" in
40)
echo "* Unknown option passed. *" >> $INSPECT_DIR/vr1.$$
;;
50)
echo "* Database initialization error. *" >> $INSPECT_DIR/vr1.$$
;;
52)
echo "* Not supported file type. *" >> $INSPECT_DIR/vr1.$$
;;
53)
echo "* Can't open directory. *" >> $INSPECT_DIR/vr1.$$
;;
54)
echo "* Can't open file. (ofm) *" >> $INSPECT_DIR/vr1.$$
;;
55)
echo "* Error reading file. (ofm) *" >> $INSPECT_DIR/vr1.$$
;;
56)
echo "* Can't stat input file / directory. *" >> $INSPECT_DIR/vr1.$$
;;
57)
echo "* Can't get absolute path name of current *" >> $INSPECT_DIR/vr1.$$
echo "* working directory. *" >> $INSPECT_DIR/vr1.$$
;;
58)
echo "* I/O error, please check your filesystem. *" >> $INSPECT_DIR/vr1.$$
;;
59)
echo "* Can't get information about current user *" >> $INSPECT_DIR/vr1.$$
echo "* from /etc/passwd. *" >> $INSPECT_DIR/vr1.$$
;;
60)
echo "* Can't get information about user *" >> $INSPECT_DIR/vr1.$$
echo "* clamav (default name) from /etc/passwd. *" >> $INSPECT_DIR/vr1.$$
;;
61)
echo "* Can't fork. *" >> $INSPECT_DIR/vr1.$$
;;
63)
echo "* Can't create temporary files/directories *" >> $INSPECT_DIR/vr1.$$
echo "* (check permissions). *" >> $INSPECT_DIR/vr1.$$
;;
64)
echo "* Can't write to temporary directory (please *" >> $INSPECT_DIR/vr1.$$
echo "* specify another one). *" >> $INSPECT_DIR/vr1.$$
;;
70)
echo "* Can't allocate and clear memory (calloc). *" >> $INSPECT_DIR/vr1.$$
;;
71)
echo "* Can't allocate memory (malloc). *" >> $INSPECT_DIR/vr1.$$
;;
*)
echo "Unknown error $AV_RESULT" >> $INSPECT_DIR/vr1.$$
;;
esac
echo "************************************************" >> $INSPECT_DIR/vr1.$$
$SENDMAIL -f $VIRADMIN -r $VIRADMIN -F "Antivirus" "$VIRADMIN" < $INSPECT_DIR/vr1.$$
exit $EX_TEMPFAIL
;;
esac
exit 0

Виртуальные домены

В Postfix используются несколько способов задания имен локальных почтовых ящиков.
1. Имена пользователей зарегистрированных в системе. Т.е. в файле /etc/passwd
2. Имена перечисленные в файле /etc/aliases
3. Почтовые ящики перечисленные в файле /etc/postfix/virtual
4.Имена, определяемые локальной программой доставки

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

Основное идеологическое отличие между /etc/aliases и /etc/postfix/virtual в том, что aliases предназначены для локальных имен (например postmaster->root->adminuser или root->root@remote.com), а файл virtual предназначен для отображения имен пользователей различных почтовых доменов, обслуживаемых данным сервером, в имена локальных или удаленных почтовых ящиков (например user@virtual.net ->user_virtual_net).
Другими словами aliases нужны для корректной доставки почты на компьютере не являющемся выделенным почтовым сервером, а virtual это средство для развертывания почтовой системы массового обслуживания.
Если используются оба файла, то вначале для определения маршрута доставки почты используется virtual, а затем, если почта должна быть доставлена в локальный почтовый ящик, aliases.

Яндекс.Метрика