Инструменты пользователя

Инструменты сайта


mail:mail-howto-p1

Настройка почтовой системы на freebsd. Часть I

Вступление


Данный документ описывает установку и настройку почтовой системы на основе Postfix, Cyrus-SASL, MySQL, Courier-IMAP, postfixadmin, clamav, spamassassin, amavisd-new. При этом нет разницы, сколько почтовых доменов заведено в системе, как называются пользователи, мы будем использовать виртуальных пользователей, которые с системными никак не пересекаются.


Но аналогично построенные системы работают на CentOS и на других RedHat подобных дистрибутивах. Сейчас данная связка у меня работает больше года на СentOS-4.0, пока ни одного сбоя замечено не было. Поэтому не вижу причин, почему бы данной связке не работать на других системах.

Архитектура современных почтовых систем
Перед началом установки почтовой системы настоятельно рекомендую прочитать статью Архитектура современных почтовых систем . Для лучшего понимания принципов работы современных почтовых систем.
Совет всем линуксоидам
Не собирайте ничего из исходников tar.bz2 или tar.gz. Лучше скачайте src.rpm и соберите rpm пакет . Лично я, собираю все пакеты на VMware, а на сервер ставлю уже готовые rpm пакеты. Очень удобно и система не засоряется. Также рекомендую прочитать статью про основы работы с менеджером пакетов rpm .

Обновление системы

Настраивал данную связку на FreeBSD-7.2. Установленную с помощью образа 7.2-RELEASE-i386-bootonly.iso. Поэтому перед началом использования данной симстемы мы ее обновим. Так как система у нас новая, то воспользуемся бинарным обновлением. Для этого выполняем следующие команды

# freebsd-update fetch
# freebsd-update install

После этого перегружаем сервер. В итоге мы должны получить следующую систему:

# uname -a
FreeBSD freebsd7.w3.lan 7.2-RELEASE-p2 FreeBSD 7.2-RELEASE-p2 #0: Wed Jun 24 00:57:44 UTC 2009
[email protected]:/usr/obj/usr/src/sys/GENERIC  i386

А теперь займемся обновление дерева портов. Для начала скачаем самое свежее дерево портов

# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from portsnap2.FreeBSD.org... done.
Fetching snapshot tag from portsnap2.FreeBSD.org... done.
Fetching snapshot metadata... done.
...
...
...
Fetching 11 patches.....10 done.
Applying patches... done.
Fetching 0 new ports or files... done.

Разпаковываем дерево портов

# portsnap extract
/usr/ports/.cvsignore
/usr/ports/CHANGES
/usr/ports/COPYRIGHT
...
...
...
/usr/ports/x11/yeahconsole/
/usr/ports/x11/yelp/
/usr/ports/x11/zenity/
Building new INDEX files... done.

И так у нас полностью обновленная и свежая система, теперь переходим к установке ПО.

Perl


Итак, начнем по порядку. Скорее всего, perl уже стоит у вас в системе, т.к. на него завязано слишком много пакетов. В линуксе он вообще сразу ставится с системой. Если perl не установлен, то ставим его


Некоторые командные процессоры для ускорения поиска выполнимых файлов и команд кэшируют имена программ, доступных для вызова из каталогов, перечисленных в переменной окружения PATH .

Если вы используете один из таких командных процессоров, то перед использованием только что добавленных программ вам может понадобиться вызвать команду rehash после установки порта. Эта команда будет работать с такими оболочками, как, например, tcsh.

При работе с такими командными процессорами, как sh или shells/bash, воспользуйтесь командой hash -r. Дополнительную информацию можно найти в документации к вашему командному процессору

Openssl


Устанавливаем openssl. Он нам понадобится для генерации сертификатов/ключей, а также для поддержки SSL/TLS.

# cd /usr/ports/security/openssl/
# make install clean
# rehash 

Mysql


Устанавливаем и настраиваем MySQL. На unix системах, наверное, одна из самых распространенных СУБД. MySQL необходим для работы postfixadmin. В базе данных мы будем хранить информацию о пользователях и почтовых ящиках.

# cd /usr/ports/databases/mysql50-server/
# setenv BUILD_OPTIMIZED yes
# setenv WITH_OPENSSL yes
# setenv WITH_CHARSET utf8
# make install clean
# rehash

Устанавливаем набор вспомогательных скриптов, которые помогают настроить MySQL.

# cd /usr/ports/databases/mysql50-scripts/
# make install clean
# rehash 

Производим первоначальную настройку MySQL сервера. Настраиваем запуск MySQL вместе с системой

# echo 'mysql_enable="YES"' >> /etc/rc.conf 

Создаем конфигурационный файл, исправляем по своему желанию

# cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf 
#
# /etc/my.cnf
#

[mysqld]
# Указываем log файл, полезно для отладки и поиска проблем
log=/var/log/mysql.log

# Привязываем MySQL к loopback интерфейсу.
bind-address=127.0.0.1 

# Задаем кодировку по умолчанию
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
init-connect="SET NAMES utf8"

Создаем соответствующий файл и выставляем необходимые права

# touch /var/log/mysql.log
# chown mysql:mysql /var/log/mysql.log 

Запускаем MySQL

# /usr/local/etc/rc.d/mysql-server start
Starting mysql.

# cat /var/log/mysql.log
/usr/local/libexec/mysqld, Version: 5.0.85-log (FreeBSD port: mysql-server-5.0.85). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument

А теперь воспользуемся скриптом для настройки безопасности MySQL сервера

# /usr/local/bin/mysql_secure_installation




NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y
New password: *******
Re-enter new password: *******
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
Что делает скрипт mysql_secure_installation
Как видно из названия самого скрипта он предназначен для повышения безопасности MySQL сервера. С помощью этого скрипта мы выполнили следующие действия:
  • задали пароль для супер пользователя root (с системным root он не имеет ничего общего, это абсолютно два разных пользователя), так как по умолчанию для него не установлен пароль;
  • удалили анонимного пользователя, который создается только для тестовых целей;
  • запретили пользователю root входить удаленно. Теперь он сможет заходить только с localhost;
  • удалили тестовую БД test и доступ к ней;

Все, с MySQL мы разобрались, идем дальше.

Cyrus-Sasl

Собираем и настраиваем Cyrus-SASL. Данную библиотеку мы будем использовать для SMTP аутентификации, т.е. проверки логина и пароля по некоторому алгоритму, например PLAIN, LOGIN, CRAM-MD5.

# cd /usr/ports/security/cyrus-sasl2/
# make config 

# make install clean

Courier-authlib


Собираем и настраиваем courier-authlib. Данную библиотеку courier-imap использует для аутентификации пользователей.

# cd /usr/ports/security/courier-authlib/
# make config 

# make install clean 


Делаем автоматический запуск authdaemond при старте системы

# echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf 


Настраиваем courier-authlib. Для этого редактируем два конфигурационных файла: /usr/local/etc/authlib/authdaemonrc и /usr/local/etc/authlib/authmysqlrc

# cat /usr/local/etc/authlib/authdaemonrc | grep -v ^# | grep -v ^
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=2
DEFAULTOPTIONS="wbnodsn=1"
LOGGEROPTS="" 
# cat /usr/local/etc/authlib/authmysqlrc | grep -v ^# | grep -v ^
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          postfix
MYSQL_SOCKET            /tmp/mysql.sock
MYSQL_OPT               0
MYSQL_DATABASE          postfix
MYSQL_CHARACTER_SET     utf8
MYSQL_USER_TABLE        mailbox
MYSQL_CLEAR_PWFIELD     password
MYSQL_UID_FIELD         '1981'
MYSQL_GID_FIELD         '1981'
MYSQL_LOGIN_FIELD       username
MYSQL_HOME_FIELD        '/var/spool/mail'
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir
MYSQL_QUOTA_FIELD       quota
MYSQL_WHERE_CLAUSE      active='1' 
MYSQL_UID_FIELD и MYSQL_GID_FIELD
Обратите внимание на значения этих полей, здесь необходимо указывать uid и gid пользователя и группы virtual соответственно.
Настройка authmysqlrc
Если MySQL запускается на той же машине, что и courier-authlib вы можете использовать сокет, вместо указания порта и имени сервера. При этом не нужно инициализировать MYSQL_SERVER/MYSQL_PORT.


Запускаем authdaemond

# /usr/local/etc/rc.d/courier-authdaemond start
Starting courier_authdaemond. 


Если вы все правильно настроили, то в log-файле должно быть следующее

# cat /var/log/maillog | grep authdaemond
Sep  7 18:17:24 freebsd7 authdaemond: modules="authmysql", daemons=5
Sep  7 18:17:24 freebsd7 authdaemond: Installing libauthmysql
Sep  7 18:17:24 freebsd7 authdaemond: Installation complete: authmysql

Courier-imap


Устанавливаем и настраиваем courier-imap. Несмотря на название, courier-imap также поддерживает и pop3, хотя основной акцент делается на работу с imap. В качестве альтернативы очень рекомендую посмотреть в сторону dovecot.


Dovecot это IMAP сервер, разработанный для Linux/UNIX подобных систем, написанный прежде всего с учетом безопасности. Несмотря на то, что он написан на C, он использует несколько техник программирования, которые позволяют избежать большинства общих ошибок. Dovecot может работать со стандартными форматами mbox и maildir, а также он полностью совместим с серверами UW-IMAP и Courier IMAP.

# cd /usr/ports/mail/courier-imap/
# make config 

 # make install clean 


В зависимости от того, что вы хотите использовать pop3 или imap, редактируем соответствующие файлы. Лично я использую pop3, поэтому редактируем следующий файл /usr/local/etc/courier-imap/pop3d

# cat /usr/local/etc/courier-imap/pop3d | grep -v ^# | grep -v ^
PIDFILE=/var/run/pop3d.pid
MAXDAEMONS=40
MAXPERIP=4
POP3AUTH="PLAIN LOGIN CRAM-MD5"
POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5"
POP3AUTH_TLS="PLAIN LOGIN CRAM-MD5"
POP3AUTH_TLS_ORIG="PLAIN LOGIN CRAM-MD5"
POP3_PROXY=0
PORT=110
ADDRESS=192.168.127.1
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=courier-imap"
POP3DSTART=YES
MAILDIRPATH=Maildir 
# cat /usr/local/etc/courier-imap/imapd | grep -v ^# | grep -v ^
ADDRESS=0
PORT=143
MAXDAEMONS=40
MAXPERIP=4
PIDFILE=/var/run/imapd.pid
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=imapd"
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
IMAP_KEYWORDS=1
IMAP_ACL=1
IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"
IMAP_PROXY=0
IMAP_PROXY_FOREIGN=0
IMAP_IDLE_TIMEOUT=60
IMAP_MAILBOX_SANITY_CHECK=1
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
IMAP_DISABLETHREADSORT=0
IMAP_CHECK_ALL_FOLDERS=0
IMAP_OBSOLETE_CLIENT=0
IMAP_UMASK=022
IMAP_ULIMITD=65536
IMAP_USELOCKS=1
IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index
IMAP_ENHANCEDIDLE=0
IMAP_TRASHFOLDERNAME=Trash
IMAP_EMPTYTRASH=Trash:7
IMAP_MOVE_EXPUNGE_TO_TRASH=0
SENDMAIL=/usr/sbin/sendmail
HEADERFROM=X-IMAP-Sender
IMAPDSTART=YES
MAILDIRPATH=Maildir
Примечание !!!
Для того чтобы пользователи могли просматривать почту из мира, то в поле ADDRESS необходимо указать 0. В этом случае courier-imap будет слушать на всех активных интерфейсах.

Если вы хотите, чтобы пользователи могли просматривать почту только через веб интерфейс (imp), то в поле ADDRESS необходимо указать 127.0.0.1.

Если у вас в системе много интерфейсов, а вам нужно привязать pop/imap сервер только к некоторым, то это можно сделать так:
ADDRESS=0
PORT=192.168.127.1.110,127.0.0.1.110

Настраиваем автоматический запуск pop/imap сервера при старте системы

# echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf 
# echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf

Запускаем pop/imap сервер

# /usr/local/etc/rc.d/courier-imap-pop3d start
Starting courier_imap_pop3d. 

# /usr/local/etc/rc.d/courier-imap-imapd start
Starting courier_imap_imapd.


Проверяем, запустился ли pop3/imap сервер

# sockstat | grep 143
root     couriertcp 84757 3  tcp4   *:143                 *:*

# sockstat | grep 110
root     couriertcp 84745 3  tcp4   *:110                 *:*

Postfix

Ну а теперь собираем сердце нашей системы - Postfix

# cd /usr/ports/mail/postfix
# make config 

# make install clean
# rehash 

В конце установки на вопрос

Would you like to activate Postfix in /etc/mail/mailer.conf [n]?

Отвечаем y.


Отключаем запуск sendmail при старте системы, иначе postfix и sendmail будут конфликтовать между собой. Для этого добавляем следующие строчки в rc.conf

# cat /etc/rc.conf | grep sendmail
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO" 


Отключаем специфические для sendmail опции

# touch /etc/periodic.conf
# cat /etc/periodic.conf
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO" 

Редактируем конфигурационный файл postfix, а именно main.cf

 
#
# /usr/local/etc/postfix/main.cf
#

# LOCAL PATHNAME INFORMATION
#
# Указываем месторасположения директории очереди postfix. Также данная
# директория является корнем, когда postfix запускается в chroot окружении.
queue_directory = /var/spool/postfix

# Задает месторасположение всех postXXX команд (postmap, postconf, postdrop)
command_directory = /usr/local/sbin

# Задаем корень конфигурационных файлов, для более "быстрой навигации".
# Например, теперь можно использовать $base/header_checks вместо
# /usr/local/etc/postfix/header_checks. Мелочь, а приятно.
base = /usr/local/etc/postfix

# Задает месторасположение всех программ демонов postfix. Это программы,
# перечисленные в файле master.cf. Владельцем этой директории должен быть root
daemon_directory = /usr/local/libexec/postfix

# QUEUE AND PROCESS OWNERSHIP
#
# Задает владельца очереди postfix, а также большинства демонов postfix.
# В целях безопасности, необходимо использовать выделенную учетную запись.
# Т.е. от данного пользователя не должны запускаться какие-либо процессы
# в системе, а также он не должен являться владельцем каких-либо файлов.
mail_owner = postfix

# Права по умолчанию, использующиеся local delivery agent. Не указывайте
# здесь привилегированного пользователя или владельца postfix.
default_privs = nobody

# INTERNET HOST AND DOMAIN NAMES
#
# Задает имя хоста в формате FQDN. По умолчанию, используется значение,
# возвращаемой функцией gethostname().
myhostname = mail.sys-adm.org.ua

# Задает имя нашего домена. По умолчанию используется значение $myhostname
# минус первый компонент.
mydomain = sys-adm.org.ua

# SENDING MAIL
#
# Данный параметр указывает имя домена, которое используется при отправлении
# почты с этой машины. По умолчанию, используется имя локальной машины -
# $myhostname. Для согласованности между адресами отправителя и получателя,
# myorigin также указывает доменное имя, которое добавляется к адресу
# получателя для которого не указана доменная часть.
# myorigin = $myhostname (отправлять письма от: "[email protected]")
# myorigin = $mydomain (отправлять письма от: "[email protected]")
myorigin = $mydomain

# RECEIVING MAIL
#
# Указывает адреса сетевых интерфейсов, на которых будет принимать почту
# наша почтовая система. По умолчанию используются все активные интерфейсы
# на машине. При изменении этого праметра необходимо перезапустить postfix
inet_interfaces = all

# Данный параметр указывает список доменов, для которых почта будет доставляться
# локально, а не пересылаться на другой хост. Не указывайте здесь виртуальные
# домены, для этого есть специальный параметр virtual_mailbox_domains
mydestination = $myhostname, localhost.$mydomain, localhost

# REJECTING MAIL FOR UNKNOWN LOCAL USERS
#
# Таблица просмотра со всеми именами и адресами локальных получателей.
local_recipient_maps = unix:passwd.byname $alias_maps

# TRUST AND RELAY CONTROL
#
# Данный параметр задает список "доверенных" клиентов, которые обладают
# некоторыми привилегиями. В частности доверенным SMTP клиентам дозволено
# пересылать почту через postfix. Если вы не доверяете никому, то оставьте
# только 127.0.0.0/8
mynetworks = 127.0.0.0/8

# ALIAS DATABASE
#
# Данный параметр указывает список алиасов, используемый local delivery agent
# После внесения изменений в данный файл необходимо выполнить команду newaliases
# или postalias /etc/mail/aliases
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# SHOW SOFTWARE VERSION OR NOT
#
# Желательно сообщать как можно меньше информации о нашем почтовом сервере.
# Согласно требованиям SMTP протокола вы должны указать $myhostname вначале текста
smtpd_banner = $myhostname ESMTP

# DEBUGGING CONTROL
#
# Задает уровень информативности, когда имя или адрес SMTP клиента
# или сервера соответствует шаблону, заданному в параметре debug_peer_list.
# Следует использовать только во время отладки.
# debug_peer_list = 127.0.0.1, sys-adm.org.ua
debug_peer_level = 2

# RESTRICTIONS
#
# client, helo, sender, recipient, data, end-of-data
#

# Дополнительные ограничения доступа  smtp сервера в контексте
# smtp запроса клиента
smtpd_client_restrictions =  permit_mynetworks,
                             permit_sasl_authenticated,
                             check_client_access hash:$base/client_access,
                             reject_unknown_client_hostname

# Дополнительные ограничения, применяемые сервером Postfix
# в контексте SMTP команды HELO
smtpd_helo_restrictions =       check_helo_access hash:$base/hello_access,
                                permit_mynetworks,
                                permit_sasl_authenticated,
                                reject_invalid_helo_hostname,
                                reject_non_fqdn_helo_hostname,
                                reject_unknown_helo_hostname

# Дополнительные ограничения, применяемые сервером Postfix
# в контексте команды MAIL FROM
smtpd_sender_restrictions =     permit_mynetworks,
                                check_sender_access hash:$base/sender_access,
                                reject_authenticated_sender_login_mismatch,
                                reject_unknown_sender_domain,
                                reject_unlisted_sender,
                                reject_unverified_sender

# Дополнительные ограничения, применяемые сервером Postfix
# в контексте команды RCPT TO
smtpd_recipient_restrictions =  permit_mynetworks,
                                permit_sasl_authenticated,
                                reject_unauth_destination,
                                check_recipient_access hash:$base/recipient_access,
                                reject_unlisted_recipient,
                                reject_unknown_recipient_domain,
                                reject_non_fqdn_recipient,
                                reject_unverified_recipient

# Отклонять команду ETRN
smtpd_etrn_restrictions = reject

# Заставляем отклонять почту с неизвестным адресом отправителя.
# Позволяет бороться с червями и некоторыми вирусами.
smtpd_reject_unlisted_sender = yes

# Отключает SMTP команду VRFY. В результате чего, невозможно определить
# существование определенного ящика. Данная техника (применение команды
# VRFY) используется спамерами для сбора имен почтовых ящиков.
disable_vrfy_command = yes

# Требуем чтобы адреса, передаваемые в SMTP командах MAIL FROM и RCPT TO
# заключались в <>, а также не содержали стилей или фраз RFC 822.
strict_rfc821_envelopes = yes

# Скрываем отображение имени таблицы получателей в ответе "User unknown"
# yes: User unknown in virtual mailbox table
# no: User unknown
show_user_unknown_table_name = no

# Данный адрес будет использоваться при проверки существования адреса отправителя.
address_verify_sender = <>

# Числовой код ответа SMTP сервера Postfix в случае, когда адрес
# получателя отвергнут ограничением reject_unverified_sender.
unverified_sender_reject_code = 550

# Требуем, чтобы удаленный SMTP клиент представлял себя
# в начале SMTP сессии с помощью команды HELO или EHLO.
smtpd_helo_required = yes

# Всегда отправлять EHLO вначале SMTP сессии
smtp_always_send_ehlo = yes

# Максимальное количество ошибок, которое может сделать удаленный SMTP клиент.
# При превышение данного числа Postfix разорвет соединение.
smtpd_hard_error_limit = 8

# Включаем поддержку sasl аутентификации
smtpd_sasl_auth_enable = yes

# Имя приложения, используемого для инициализации SASL сервера.
# Данный параметр задает имя конфигурационного файла. Имя smtpd
# будет соответсвовать конфигурационному файлу SASL - smtpd.conf.
smtpd_sasl_application_name = smtpd

# Включает функциональную совместимость с SMTP клиентами, которые
# используют устаревшую версию команды AUTH (RFC 2554),
# например, outlook express 4 и MicroSoft Exchange version 5.0.
broken_sasl_auth_clients = yes

# Отвергаем методы, позволяющие анонимную аутентификацию
smtpd_sasl_security_options = noanonymous

# Optional lookup table with the SASL login names
# that own sender (MAIL FROM) addresses
smtpd_sender_login_maps = mysql:$base/mysqlLookupMaps/sender.conf

# Указываем, где postfix должен брать информацию о алиасах
virtual_alias_maps = mysql:$base/mysqlLookupMaps/alias.conf

# Указываем, где postfix должен брать информацию о доменах
virtual_mailbox_domains = mysql:$base/mysqlLookupMaps/domain.conf

# Указываем, где postfix должен брать информацию о почтовых ящиках
virtual_mailbox_maps = mysql:$base/mysqlLookupMaps/mailbox.conf
virtual_mailbox_base = /var/spool/mail

# Настраиваем поддержку квот
virtual_mailbox_limit_maps = mysql:$base/mysqlLookupMaps/quota.conf
virtual_maildir_extended=yes
virtual_mailbox_limit_override=yes
virtual_create_maildirsize = yes
virtual_overquota_bounce = yes
virtual_maildir_limit_message="Sorry, the user's maildir has overdrawn
his diskspace quota, please try again later"

# Ограничиваем максимальный размер письма до 5 Мб
message_size_limit = 5242880

# 1981 - uid и gid пользователя и группы virtual соответственно
virtual_gid_maps = static:1981
virtual_uid_maps = static:1981
virtual_minimum_uid = 1000 

Указываем postfix, как производить аутентификацию пользователей. Для этого создаем файл smtpd.conf со следующим содержимым:

# cat /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: auxprop
mech_list: PLAIN LOGIN CRAM-MD5
auxprop_plugin: sql
sql_usessl: yes
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: postfix
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'
log_level: 3 

Инициализируем базу данных псевдонимов

# /usr/local/bin/newaliases 

Создаем необходимые файлы

# cd /usr/local/etc/postfix
# touch hello_access sender_access
# touch recipient_access client_access
# postmap hello_access
# postmap sender_access
# postmap recipient_access
# postmap client_access

# mkdir /usr/local/etc/postfix/mysqlLookupMaps

# cat /usr/local/etc/postfix/mysqlLookupMaps/alias.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address

# cat /usr/local/etc/postfix/mysqlLookupMaps/domain.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1' and backupmx = '0'

# cat /usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'

# cat /usr/local/etc/postfix/mysqlLookupMaps/quota.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'

# cat /usr/local/etc/postfix/mysqlLookupMaps/sender.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = username
where_field = username
additional_conditions = and active = '1' 

Создаем папку, где у нас будет храниться почта, и выставляем необходимые права.

# chown -R root:postfix /usr/local/etc/postfix/mysqlLookupMaps/
# chmod 440 /usr/local/etc/postfix/mysqlLookupMaps/*.conf
# chmod 550 /usr/local/etc/postfix/mysqlLookupMaps/

# pw group add virtual -g 1981
# pw user add virtual -g virtual -s /sbin/nologin -u 1981

# mkdir /var/spool/mail
# chown virtual:virtual /var/spool/mail/
# chmod 740 /var/spool/mail/ 

Настраиваем запуск postfix вместе с системой.

# echo 'postfix_enable="YES"' >> /etc/rc.conf

# /usr/local/etc/rc.d/postfix start
postfix/postfix-script: starting the Postfix mail system 

Если все правильно настроено, то в log-файле должно быть следующее

# cat /var/log/maillog | grep postfix
Sep  7 19:04:44 freebsd7 postfix/postfix-script[92841]: starting the Postfix mail system
Sep  7 19:04:45 freebsd7 postfix/master[92842]: daemon started -- version 2.6.5, configuration /usr/local/etc/postfix

Apache

Устанавливаем веб сервер apache, он нам понадобится для postfixadmin.

# cd /usr/ports/www/apache13-modssl/
# make install clean
# rehash


Настраиваем автоматический запуск apache сервера при старте системы

 # echo 'apache_enable="YES"' >> /etc/rc.conf 

Php


Устанавливаем php, также необходим для работы postfixadmin.

 # cd /usr/ports/lang/php5
# make config 

 # make install clean 


В самом конце установки обращаем внимание на следующие строчки

 ***************************************************************

Make sure index.php is part of your DirectoryIndex.

You should add the following to your Apache configuration file:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

*************************************************************** 


И вносим соответствующие параметры в /usr/local/etc/apache/httpd.conf


Создаем php.ini и изменяем под свои нужды.

# cd /usr/local/etc
# cp php.ini-dist php.ini 

Php-extentions


Теперь устанавливаем необходимые расширения для php. Список конкретных расширений зависит от специфики сервера. Так как перечень поддерживаемых расширений очень большой, то я не буду приводить их всех, а лишь укажу те, которые я включил. Все расширения кроме выбранных, отключены, но вы в любой момент можете установить любое необходимое вам расширение.

# cd /usr/ports/lang/php5-extensions/
# make config 
[X] BZ2
[X] DOM
[X] GD
[X] GETTEXT
[X] ICONV
[X] IMAP
[X] MBSTRING
[X] MYSQLI
[X] PCRE
[X] POSIX
[X] SESSION
[X] SPL
[X] XML
[X] ZLIB 
# make install clean
# rehash 


Проверяем нашу связку apache + php. Для этого создаем тестовый файл, со следующим содержимым.

# touch /usr/local/www/data/test.php
# cat /usr/local/www/data/test.php
<?
   phpinfo();
?> 


Запускаем apache

# /usr/local/etc/rc.d/apache.sh start
Starting apache.

# cat /var/log/httpd-error.log
[Sun Feb 10 02:01:26 2008] [notice] Apache/1.3.39 (Unix) PHP/5.2.5 with Suhosin-Patch mod_ssl/2.8.30
OpenSSL/0.9.8g configured -- resuming normal operations
[Sun Feb 10 02:01:26 2008] [notice] Accept mutex: flock (Default: flock)


Открываем в любимом интернет проводнике test.php. Если все правильно настроено, то мы должны увидеть подобную страничку .

Postfixadmin


Устанавливаем веб интерфейс для администрирования почтовых ящиков.

# cd /usr/ports/mail/postfixadmin
# make config 

# make install clean 


Внимательно читаем файл /usr/local/www/postfixadmin/INSTALL.TXT. После этого следуем инструкциям и настраиваем postfixadmin. Лично я делаю отдельный виртуалхост для postfixadmin. Для этого добавляем следующую директиву в httpd.conf.

NameVirtualHost 212.42.65.100:80
<VirtualHost 212.42.65.100:80>
    ServerAdmin [email protected]
    DocumentRoot /usr/local/www/postfixadmin
    ServerName postfix-admin.sys-adm.org.ua
    <Directory "/usr/local/www/postfixadmin">
        Options Indexes
        AllowOverride All
        DirectoryIndex index.php
    </Directory>
</VirtualHost>


В целях безопасности изменяем стандартный пароль администратора postfixadmin.

# cd /usr/local/www/postfixadmin/admin/
# htpasswd -b .htpasswd admin 1234567
Updating password for user admin 


Так как postfixadmin хранит все данные в БД, то нам необходимо создать саму БД и соответствующие таблицы. К счастью эту работу за нас уже сделали разработчики. Вместе с postfixadmin поставляется sql скрипт, который создает БД и все таблицы. Этот скрипт располагается в корневой директории postfixadmin. Нам лишь необходимо выполнить его.

# cd /usr/local/www/postfixadmin
# mysql -u root -p < DATABASE_MYSQL.TXT
Enter password: ****** 
Примечание !!!
Перед применением скрипта настоятельно рекомендую поменять пароли в файле DATABASE_MYSQL.TXT для пользователей postfix и postfixadmin. После изменения пароля не забываем также поменять его в следующих файлах:
/usr/local/lib/sasl2/smtpd.conf
/usr/local/etc/authlib/authmysqlrc
/usr/local/etc/postfix/mysqlLookupMaps/alias.conf
/usr/local/etc/postfix/mysqlLookupMaps/domain.conf
/usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf
/usr/local/etc/postfix/mysqlLookupMaps/quota.conf
/usr/local/etc/postfix/mysqlLookupMaps/sender.conf
/usr/local/www/postfixadmin/config.inc.php

Редактируем файл /usr/local/www/postfixadmin/config.inc.php .

#
# /usr/local/www/postfixadmin/config.inc.php
#

//Указываем, где у нас установлен postfixadmin
$CONF['postfix_admin_url'] = 'http://postfix-admin.sys-adm.org.ua/';
$CONF['postfix_admin_path'] = '/usr/local/www/postfixadmin/';

// Язык интерфейса. Список всех языков можно посмотреть в папке './languages'
$CONF['default_language'] = 'ru';

// Параметры БД. Здесь необходимо указать тип БД (MySQL или PostgreSQL),
// имя пользователя и пароль, использующиеся при подключении, а также имя БД.
// mysql - MySQL 3.23 and 4.0
// mysqli - MySQL 4.1+
// pgsql - PostgreSQL
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';

// Здесь необходимо указать email, от имени которого будет посылаться
// письмо пользователю при создании нового почтового ящика.
// Это т.н. null адрес, согласно RFC вы должны принимать почту с такого адреса.
$CONF['admin_email'] = '<>';

// Имя хоста в формате FQDN (Fully Qualified Domain Name) где находится
// почтовый сервер postfix. Эти данные будут использоваться при отправке
// email для создания почтовых ящиков.
$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';

// Тип шифрования пароля.
// md5crypt - внутренний алгоритм шифрования postfix admin
// system - используется метод шифрования установленный по умолчанию в php
// cleartext - в чистом виде, т.е. без шифрования.
$CONF['encrypt'] = 'cleartext';

// Если вы хотите, чтобы postfix admin автоматически генерировал и отображал
// пароль при создании почтового ящика установите значение YES
$CONF['generate_password'] = 'NO';

// Количество записей, одновременно отображаемых на странице
$CONF['page_size'] = '20';

// Алиасы, создаваемые при создании домена
$CONF['default_aliases'] = array (
        'abuse' => '[email protected]',
        'hostmaster' => '[email protected]',
        'postmaster' => '[email protected]',
        'webmaster' => '[email protected]'
);

// Использовать имя домена в пути к почтовому ящику.
// YES: /var/spool/mail/sys-adm.org.ua/alex
// NO: /var/spool/mail/alex
$CONF['domain_path'] = 'YES';

// Включать имя домена в имя почтового ящика
// YES: /var/spool/mail/[email protected]
// NO: /var/spool/mail/alex
$CONF['domain_in_mailbox'] = 'YES';

// $CONF['domain_in_mailbox'] = 'YES' + $CONF['domain_path'] = 'YES'
// /var/spool/mail/sys-adm.org.ua/[email protected]/

// Значения по умолчанию при создании домена. Количество алиасов,
// почтовых ящиков и максимальная квота в Мб. Я специально указал квоту
// равную 0, т.е. анлим, иначе себе вы тоже не сможете задать размер
// ящика больше этого значения.
$CONF['aliases'] = '10';
$CONF['mailboxes'] = '50';
$CONF['maxquota'] = '0';

// Позволяет задавать квоты при создании почтового ящика
$CONF['quota'] = 'YES';

// Вы можете использовать '1024000' или '1048576'
$CONF['quota_multiplier'] = '1024000';

// Позволяет устанавливать дополнительные параметры транспорта для домена
$CONF['transport'] = 'NO';

// Следующих два параметра используются для организации DNS.
// Лучше их не использовать.
$CONF['vacation'] = 'NO';
$CONF['vacation_domain'] = 'autoreply.sys-adm.org.ua';

// Управления алиасами, которые создает postfix для каждого ящика
$CONF['alias_control'] = 'YES';

// Зарпещает администраторам домена изменять стандартные алиасы
$CONF['special_alias_control'] = 'YES';

// Позволяет вести лог действий работы с postfix admin, т.е. вы сможете
// посомтреть кто создавал, редактировал и удалял почтовые ящики и т.п.
$CONF['logging'] = 'YES';

// Отображать текст вверху страницы и его содержимое
$CONF['show_header_text'] = 'NO';
$CONF['header_text'] = ':: Postfix Admin ::';

// Аналогично, только текст будет отображаться внизу всех страниц
$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Вернуться на главную страницу';
$CONF['footer_link'] = 'http://postfix-admin.sys-adm.org.ua/';

// Текст письма привествия. Это письмо будет высылаться на каждый
// создаваемый почтовый ящик.
$CONF['welcome_text'] = <<<EOM
С уважением, системный администратор.
EOM; 


Перегружаем apache и пробуем открыть главную страницу postfixadmin - http://postfix-admin.sys-adm.org.ua/.

# /usr/local/etc/rc.d/apache.sh restart
Stopping apache.
Waiting for PIDS: 1810.
Starting apache. 


Если мы производим настройку первый раз, то нам предлагают перейти по ссылке setup. Если все правильно настроенно, то мы увидим следующую страницу .


Переходим по ссылке admin section (логин и пароль по умолчанию - admin/admin). Создаем домен (в моем случае sys-adm.org.ua) и три почтовыx ящика, например, [email protected], [email protected] и [email protected] (этот ящик пригодится для проверки антивируса). Для ящика [email protected] задаем маленькую квоту, например, 2 Мб. При этом у вас должна быть примерно такая структура .


При создании ящика в log-файле должно быть такое:

# cat /var/log/maillog | grep 51F94B851
Feb 10 13:40:58 freebsd postfix/smtpd[1967]: 51F94B851: client=localhost.sys-adm.org.ua[127.0.0.1]
Feb 10 13:40:58 freebsd postfix/cleanup[1969]: 51F94B851: message-id=<[email protected]>
Feb 10 13:40:58 freebsd postfix/qmgr[1964]: 51F94B851: from=<>, size=404, nrcpt=1 (queue active)
Feb 10 13:40:58 freebsd postfix/virtual[1970]: 51F94B851: to=<[email protected]>, relay=virtual, delay=0.22, delays=0.13/0.06/0/0.03, dsn=2.0.0, status=sent (delivered to maildir)
Feb 10 13:40:58 freebsd postfix/qmgr[1964]: 51F94B851: removed 
# cat /var/log/maillog | grep 739C4B83B
Feb 10 13:42:36 freebsd postfix/smtpd[1967]: 739C4B83B: client=localhost.sys-adm.org.ua[127.0.0.1]
Feb 10 13:42:36 freebsd postfix/cleanup[1969]: 739C4B83B: message-id=<[email protected]>
Feb 10 13:42:36 freebsd postfix/qmgr[1964]: 739C4B83B: from=<>, size=406, nrcpt=1 (queue active)
Feb 10 13:42:36 freebsd postfix/virtual[1970]: 739C4B83B: to=<[email protected]>, relay=virtual, delay=0.1, delays=0.08/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Feb 10 13:42:36 freebsd postfix/qmgr[1964]: 739C4B83B: removed 
# cat /var/log/maillog | grep C5ED3B842
Feb 10 13:42:41 freebsd postfix/smtpd[1967]: C5ED3B842: client=localhost.sys-adm.org.ua[127.0.0.1]
Feb 10 13:42:41 freebsd postfix/cleanup[1969]: C5ED3B842: message-id=<[email protected]>
Feb 10 13:42:41 freebsd postfix/qmgr[1964]: C5ED3B842: from=<>, size=416, nrcpt=1 (queue active)
Feb 10 13:42:41 freebsd postfix/virtual[1970]: C5ED3B842: to=<[email protected]>, relay=virtual, delay=0.04, delays=0.03/0/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Feb 10 13:42:41 freebsd postfix/qmgr[1964]: C5ED3B842: removed 


После настройки удаляем файл setup.php


Если все правильно настроено, то в /var/spool/mail/ должны появиться следующие папки:

# ls -l /var/spool/mail/
total 2
drwx------  5 virtual  virtual  512 Feb 10 13:42 sys-adm.org.ua

# ls -l /var/spool/mail/sys-adm.org.ua/
total 6
drwx------  5 virtual  virtual  512 Feb 10 13:40 [email protected]
drwx------  5 virtual  virtual  512 Feb 10 13:42 [email protected]
drwx------  5 virtual  virtual  512 Feb 10 13:42 [email protected]


Эти папки появляются только после создания почтовых ящиков в postfixadmin. При создании домена в postfixadmin никакие папки не создаются.

Тестирование почтовой системы


Отправка письма с аутентификацией

# cat maillog
Feb 10 14:11:48 freebsd postfix/smtpd[2200]: connect from alex.sys-adm.local[192.168.127.111]
Feb 10 14:11:48 freebsd postfix/cleanup[2204]: B6FBAB865: message-id=<[email protected]>
Feb 10 14:11:48 freebsd postfix/qmgr[2198]: B6FBAB865: from=<>, size=260, nrcpt=1 (queue active)
Feb 10 14:11:48 freebsd postfix/virtual[2205]: B6FBAB865: to=<[email protected]>, relay=virtual, delay=0.08, delays=0.02/0.04/0/0.01, dsn=2.0.0, status=deliverable (delivers to maildir)
Feb 10 14:11:48 freebsd postfix/qmgr[2198]: B6FBAB865: removed
Feb 10 14:11:51 freebsd postfix/smtpd[2200]: AFD8AB866: client=alex.sys-adm.local[192.168.127.111], sasl_method=CRAM-MD5, [email protected]
Feb 10 14:11:51 freebsd postfix/cleanup[2204]: AFD8AB866: message-id=<[email protected]>
Feb 10 14:11:51 freebsd postfix/qmgr[2198]: AFD8AB866: from=<[email protected]>, size=778, nrcpt=1 (queue active)
Feb 10 14:11:51 freebsd postfix/virtual[2205]: AFD8AB866: to=<[email protected]>, relay=virtual, delay=3.1, delays=3.1/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Feb 10 14:11:51 freebsd postfix/qmgr[2198]: AFD8AB866: removed
Feb 10 14:11:51 freebsd postfix/smtpd[2200]: disconnect from alex.sys-adm.local[192.168.127.111] 


Обращаем внимание на следующее строчки:

  • sasl_method=CRAM-MD5 - метод аутентификации;
  • [email protected] - имя пользователя в почтовом клиенте необходимо указывать вместе с именем домена


Получение письма по протоколу pop3

 Feb 10 14:08:38 freebsd authdaemond: Authenticated: sysusername=<null>, sysuserid=1981, sysgroupid=1981, homedir=/var/spool/mail, [email protected], fullname=sysadmin, maildir=sys-adm.org.ua/[email protected]/, quota=10240000, options=<null>
Feb 10 14:08:38 freebsd authdaemond: Authenticated: clearpasswd=123, passwd=<null>
Feb 10 14:08:38 freebsd courier-imap: LOGIN, [email protected], ip=[192.168.127.111], port=[1280]
Feb 10 14:08:38 freebsd courier-imap: LOGOUT, [email protected], ip=[192.168.127.111], port=[1280], top=0, retr=477, rcvd=40, sent=706, time=0 


Проверим поддержку квот. Для этого отправим пользователю [email protected], у которого квота 2Мб, письмо с вложением ~3МБ

# cat maillog
Feb 10 14:22:54 freebsd postfix/smtpd[2237]: connect from alex.sys-adm.local[192.168.127.111]
Feb 10 14:22:54 freebsd postfix/smtpd[2237]: D7AD2B822: client=alex.sys-adm.local[192.168.127.111], sasl_method=CRAM-MD5, [email protected] Feb 10 14:22:54 freebsd postfix/cleanup[2240]: D7AD2B822: message-id=<[email protected]>
Feb 10 14:22:55 freebsd postfix/qmgr[2198]: D7AD2B822: from=<[email protected]>, size=4422958, nrcpt=1 (queue active)
Feb 10 14:22:55 freebsd postfix/smtpd[2237]: disconnect from alex.sys-adm.local[192.168.127.111]
Feb 10 14:22:56 freebsd postfix/virtual[2241]: D7AD2B822: to=<[email protected]>, relay=virtual, delay=1.3, delays=1.1/0.05/0/0.24, dsn=5.2.3, status=bounced (maildir delivery failed: "Sorry, the user's maildir has overdrawn his diskspace quota, please try again later")
Feb 10 14:22:56 freebsd postfix/cleanup[2240]: 2A834B826: message-id=<[email protected]>
Feb 10 14:22:56 freebsd postfix/bounce[2242]: D7AD2B822: sender non-delivery notification: 2A834B826
Feb 10 14:22:56 freebsd postfix/qmgr[2198]: 2A834B826: from=<>, size=2577, nrcpt=1 (queue active)
Feb 10 14:22:56 freebsd postfix/qmgr[2198]: D7AD2B822: removed
Feb 10 14:22:56 freebsd postfix/virtual[2241]: 2A834B826: to=<[email protected]>, relay=virtual, delay=0.03, delays=0.02/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Feb 10 14:22:56 freebsd postfix/qmgr[2198]: 2A834B826: removed 


Как видно из log-файла - «status=bounced (maildir delivery failed: «Sorry, the user's maildir has overdrawn his diskspace quota, please try again later»)», поддержка квот работает. Текст сообщения можно задать в main.cf в параметре virtual_maildir_limit_message .


На RHEL системах поддержка квот отсутствует, чтобы ее использовать вам необходимо пересобрать postfix и применить патч , который добавляет данный функционал.


А теперь попробуем отправить письмо в мир, без аутентификации.

# telnet 192.168.127.1 25
Trying 192.168.127.1...
Connected to freebsd.sys-adm.local.
Escape character is '^]'.
220 freebsd.sys-adm.org.ua ESMTP
helo alex.sys-adm.local
250 freebsd.sys-adm.org.ua
mail from:<[email protected]>
250 2.1.0 Ok
rcpt to:<[email protected]>
554 5.7.1 <[email protected]>: Relay access denied
quit
221 2.0.0 Bye
Connection closed by foreign host. 


При этом в log-файле должно быть следующее:

# cat maillog
Feb 10 14:35:12 freebsd postfix/smtpd[2287]: connect from alex.sys-adm.local[192.168.127.111]
Feb 10 14:35:18 freebsd postfix/smtpd[2287]: NOQUEUE: reject: RCPT from alex.sys-adm.local[192.168.127.111]: 554 5.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=SMTP helo=<alex.sys-adm.local>
Feb 10 14:35:20 freebsd postfix/smtpd[2287]: disconnect from alex.sys-adm.local[192.168.127.111] 


Как видно из сообщения - «Relay access denied». Релей почты для пользователей, не прошедших аутентификацию запрещен.


Теперь попробуем отправить почту с несуществующего ящика внутри домена.

# telnet 192.168.127.1 25
Trying 192.168.127.1...
Connected to freebsd.sys-adm.local.
Escape character is '^]'.
220 freebsd.sys-adm.org.ua ESMTP
helo alex.sys-adm.local
250 freebsd.sys-adm.org.ua
mail from:<[email protected]>
250 2.1.0 Ok
rcpt to:<[email protected]>
550 5.1.0 <[email protected]>: Sender address rejected: User unknown
quit
221 2.0.0 Bye
Connection closed by foreign host. 


Как видно из сообщения, наш сервер не разрешает отправлять почту с несуществующих адресов. А теперь проверим, что будет, когда почту будут нам отправлять с внешних почтовых серверов с несуществующих адресов. Для этого нам необходимо отправить почту с удаленного сервера от имени несуществующего пользователя.

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.somedomain.org.ua.
Escape character is '^]'.
220 mail.somedomain.org.ua ESMTP
helo localhost
250 mail.somedomain.org.ua
mail from:<[email protected]>
250 2.1.0 Ok
rcpt to:<[email protected]>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Hello world
.
250 2.0.0 Ok: queued as B9E0EB833
quit
221 2.0.0 Bye
Connection closed by foreign host. 
# cat /var/log/maillog | grep B9E0EB833
Feb 10 19:28:01 mail postfix/smtpd[1058]: B9E0EB833: client=localhost.somedomain.org.ua[127.0.0.1]
Feb 10 19:28:05 mail postfix/cleanup[1060]: B9E0EB833: message-id=<[email protected]>
Feb 10 19:28:05 mail postfix/qmgr[1056]: B9E0EB833: from=<[email protected]>, size=376, nrcpt=1 (queue active)
Feb 10 19:28:08 mail postfix/smtp[1061]: B9E0EB833: to=<[email protected]>, relay=freebsd.sys-adm.org.ua[212.42.65.100]:25, delay=7.8, delays=4.6/0/0.01/3.1, dsn=5.1.7, status=bounced (host freebsd.sys-adm.org.ua[212.42.65.100] said: 550 5.1.7 <[email protected]>: Sender address rejected: undeliverable address: host mail.somedomain.org.ua[217.20.223.100] said: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown (in reply to RCPT TO command) (in reply to RCPT TO command))
Feb 10 19:28:08 mail postfix/bounce[1075]: B9E0EB833: sender non-delivery notification: 45DACB835
Feb 10 19:28:08 mail postfix/qmgr[1056]: B9E0EB833: removed 


А теперь посмотрим log-файл на нашем почтовом сервере

# cat maillog
Feb 10 19:28:15 freebsd postfix/smtpd[1306]: connect from mail.somedomain.org.ua[217.20.223.100]
Feb 10 19:28:15 freebsd postfix/cleanup[1388]: 3EA3CB825: message-id=<[email protected]>
Feb 10 19:28:15 freebsd postfix/qmgr[773]: 3EA3CB825: from=<>, size=260, nrcpt=1 (queue active)
Feb 10 19:28:15 freebsd postfix/smtp[1390]: 3EA3CB825: to=<[email protected]>, relay=mail.somedomain.org.ua[217.20.223.100]:25, delay=0.17, delays=0.06/0.09/0.02/0.01, dsn=5.1.1, status=undeliverable (host mail.somedomain.org.ua[217.20.223.100] said: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown (in reply to RCPT TO command))
Feb 10 19:28:15 freebsd postfix/qmgr[773]: 3EA3CB825: removed
Feb 10 19:28:18 freebsd postfix/smtpd[1306]: NOQUEUE: reject: RCPT from mail.somedomain.org.ua[217.20.223.100]: 550 5.1.7 <[email protected]>: Sender address rejected: undeliverable address: host mail.somedomain.org.ua[217.20.223.100] said: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown (in reply to RCPT TO command); from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<mail.somedomain.org.ua>
Feb 10 19:28:18 freebsd postfix/smtpd[1306]: disconnect from mail.somedomain.org.ua[217.20.223.100] 


Как видно из сообщения, наш почтовый сервер не принимает почту, если ящик отправителя не существует.


Но здесь также есть свои подводные камни. Например, yandex отправляет открытки с несуществующего адреса, а mxs.mail.ru всегда говорит, что ящик существует. Так что подобные домены/серверы необходимо вносить в исключения.


А теперь попробуем, аутентифицировавшись под пользователем [email protected], отправить почту от имени [email protected].

# telnet 192.168.127.1 25
Trying 192.168.127.1...
Connected to freebsd.sys-adm.local.
Escape character is '^]'.
220 freebsd.sys-adm.org.ua ESMTP
ehlo alex.sys-adm.local
250-freebsd.sys-adm.org.ua
250-PIPELINING
250-SIZE 5242880
250-ETRN
250-AUTH LOGIN PLAIN CRAM-MD5
250-AUTH=LOGIN PLAIN CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth plain
334
AGFsZXhAc3lzLWFkbS5vcmcudWEAMTIz
235 2.0.0 Authentication successful
mail from:<[email protected]>
250 2.1.0 Ok
rcpt to:<[email protected]>
553 5.7.1 <[email protected]>: Sender address rejected: not owned by user [email protected]
quit
221 2.0.0 Bye
Connection closed by foreign host. 


Для того, чтобы сгенерировать ответ для PLAIN аутентификации выполните следующую команду:

# perl -MMIME::Base64 -e 'print encode_base64("\0alex\@sys-adm\.org\.ua\000123")'
AGFsZXhAc3lzLWFkbS5vcmcudWEAMTIz 


На этом базовую настройку МТА можно считать завершенной.


После настройки MTA рекомендую проверить систему на http://test.nettools.ru/, на возможность использования почтового сервера в качестве пересыльщика почты (mail relay). В поле Mail Relay вводим ip или dns имя своего почтового сервера и нажимаем на кнопку ОК. После некоторого времени система напишет результат. Если все настроено правильно, то мы должны увидеть следующую страницу.


Если у вас такое же сообщение, то поздравляю вас, ваша почтовая система готова к работе.

Примечания

reject_unverified_sender и подводные камни
Применять данную опцию следует с умом. Так как на очень нагруженных серверах она может создать проблемы. Смысл ее заключается в проверке существования адреса отправителя.


Проверка осуществляется путем анализа кода ответа на сервере отправителя. Например, если нам пришло письмо от пользователя [email protected] с сервера mx1.domain.com. То после команды mail from: наш сервер подсоединится к mx1.domain.com и проверит код ответа после команды rcpt to:.


Если mx1.domain.com ответит 2xx, то наш сервер считает, что ящик существует (deliverable) и smtp сессия продолжится, если же mx1.domain.com вернет 550, то наш сервер будет считать, что ящик отсутствует (undeliverable) и не примет это письмо. Если по каким либо причинам не удалось связаться с mx1.domain.com, то наш сервер отвергнет письмо с результатом 450, даже не смотря на то, что unverified_sender_reject_code установлен в 550.


Для некоторых доменов данная проверка вообще не имеет смысла, например для домена mail.ru, ответ всегда будет положительным. Так что для снижения нагрузки следует вносить в исключения домены, которым вы доверяете или для которых адрес отправителя нельзя проверить.


Так же для снижения нагрузки можно кешировать результаты проверок и сохранять их в файл. По умолчанию результаты хранятся в памяти и при перезагрузке postfix теряются. Для этого используйте следующий параметр: address_verify_map = btree:/var/spool/postfix/verified_sender

reject_authenticated_sender_login_mismatch
Если вам необходимо сделать так, чтобы некоторые пользователи могли отправлять почту не только от своего имени, но и от других, то необходимо изменить параметр smtpd_sender_login_maps .
smtpd_sender_login_maps = hash:$base/sender_logins_maps
/usr/local/etc/postfix/sender_logins_maps
[email protected] sasl_login_name1, sasl_login_name2, ... sasl_login_namex

При таких настройках адрес [email protected] в поле mail from, смогут указывать пользователи, прошедшие аутентификацию под именами sasl_login_name1, sasl_login_name2 и т.д.

Postfixadmin и MySQL 4.1.х
Несколько раз сталкивался с такой проблемой. Если в системе установлен MySQL 4.1.x, то согласно документации необходимо установить $CONF['database_type'] = 'mysqli'. Но после этого при попытке зайти в postfixadmin выдается следующее сообщение:


DEBUG INFORMATION:
MySQL 4.1 functions not available!
database_type = 'mysqli' in config.inc.php, are you using a different database?


Please check the documentation and website for more information.

Исправляется данная ошибка путем установления $CONF['database_type'] = 'mysql';

Postfixadmin и русский язык
Если вы выбрали русский язык, то придется немного подправить файл /templates/admin_menu.tpl , т.к. иначе меню будут «налезать» друг на друга. Да и качество перевода на русский язык мне не очень понравилось. Поэтому, я немного подрправил эти файлы, берем два исправленных файла и копируем поверх существующих.
При размещении данного материала у себя на сайте, просьба указывать ссылку на оригинальный сайт - sys-adm.org.ua.
mail/mail-howto-p1.txt · Последние изменения: 2009/09/11 15:58 (внешнее изменение)