18 мая 2008 02:03 пп
Установка почтового сервера Postfix + Dovecot + MYSQL и виртуальных доменов

Данное руководство описывает установку почтового сервера Postfix в связке с dovecot и базой данных mysql для хранения данных. По окончанию настройки мы получим почтовый сервер с поддержкой SMTP, POP3, IMAP, поддержку SSL, TLS, работу с виртуальными доменами. Так же данное руководство не является исчерпывающим, и может быть трудным для понимания новичкам, так как описано конкретно как настроить сервисы, но не описано как оно работает и так далее. Конфигурация была проверена и отлично работает на серверах с установленным Linux Ubuntu версий 6.10-8.04 и Debian GNU Linux, но я думаю она подойдет и для других дистрибутивов. Описание установки приведено на примере Ubuntu, все пакеты взяты из стандартных репозиториев.
При настройке нашего нового сервиса я буду использовать примеры команд, оратите внимание на интерпритатор, их будет использоваться два, обычная командная строка (bash) и mysql, выглядит это так:
bash: $>
mysql: mysql>
Так же все действия производятся от имени пользователя root. На этом вступительную часть можно закончить и давайте приступим к установке и настройке нашего почтовика.
Установим все необходимые пакеты
Код:
aptitude install postfix-mysql mysql-server dovecot-pop3d dovecot-imapd openssl
Так же в дальнейшем вам может понадобится phpmyadmin и простой веб интерфейс для работы с почтовым ящиком, установить все это можно командой
Код:
aptitude install phpmyadmin squirrelmail
Создадим базу данных для почтового сервера
Код:
mysql>
create database mailserver;
mysql>
grant all on mailserver.* to mailuser@localhost identified by 'mailuser2007';
exit
Затем создайте таблицы в базе данных
Код:
mysql>
CREATE TABLE `virtual_domains` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE = InnoDB;
mysql>
CREATE TABLE `virtual_users` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
user VARCHAR(40) NOT NULL,
password VARCHAR(32) NOT NULL,
CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE = InnoDB;
mysql>
CREATE TABLE `virtual_aliases` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
source VARCHAR(40) NOT NULL,
destination VARCHAR(80) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;
Дальше необходимо создать файлы конфигурации для Postfix’a с информацией о базе данных.
Создадим файл /etc/postfix/mysql-virtual-mailbox-domains.cf и впишем в него следующее содержание
Код:
user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
Этот файл содержит запрос к базе данных из которого сервер извлекает виртуальный домен.
Теперь внесем изменения в конфигурацию самого сервера Postfix
Код:
$>
postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Внесем в нашу базу данных запись о виртуальном домене, в примере указан домен example.com
Код:
$>
mysql -p mailserver
mysql>
INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com');
exit
Венитесь в обратно в шелл bash и проверьте правильность настроек виртуального домена командой, не забудьте сменить домен с example.com на свой.
Код:
$>
postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Вы должны увидеть цифру 1 если все правильно настроено.
Перейдем к настройке почтовых ящиков, за них у нас будет отвечать отдельный пользователь и группа, давайте создадим их
Код:
$>
groupadd -g 5000 vmail
$>
useradd -g vmail -u 5000 vmail -d /home/vmail -m
Внесем изменения в конфигурацию Postfix’a
Код:
$>
postconf -e virtual_uid_maps=static:5000
$>
postconf -e virtual_gid_maps=static:5000
Создадим первый тестовый почтовый ящик, например john@example.com с паролем summersun
Код:
mysql>
INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, 'john', MD5('summersun'));
Потом нам необходимо создать view в базе данных для нормальной работы сервера Postfix
Код:
mysql>
CREATE VIEW view_users AS
SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email,
virtual_users.password
FROM virtual_users
LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
Проверим результат командой
Код:
mysql>
SELECT * FROM view_users;
Вы должны увидеть это:
+------------------+----------------------------------+
| email | password |
+------------------+----------------------------------+
| john@example.com | 14cbfb845af1f030e372b1cb9275e6dd |
+------------------+----------------------------------+
Создадим еще один файл конфигурации для Postfix’a в котором укажем даные для работы с почтовыми ящиками нащих юзеров, создайте файл /etc/postfix/mysql-virtual-mailbox-maps.cf и впишите в него это
Код:
user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM view_users WHERE email='%s'
Внесем измения в главный файл конфига Postfix
Код:
$>
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Проверьте результат командой
Код:
$>
postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Вы должны увидеть цифру 1 если все правильно настроено.
Настроим альясы (для пересылки почты с одного ящика на другой, или с нескольких на один)
Добавим в базу данных тестовый альяс для нашего польователя john@example.com, вся почта пришедшая на его ящик будет дополнительно пересылаться на ящик jmiller@gmail.com
Код:
mysql>
INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, 'john', 'john@example.com'),
(2, 1, 'john', 'jmiller@gmail.com');
Создадим view для альясов по аналогии с view для пользователей
Код:
mysql>
CREATE VIEW view_aliases AS
SELECT CONCAT(virtual_aliases.source, '@', virtual_domains.name) AS email,
destination
FROM virtual_aliases
LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;
Проверим результат
Код:
mysql>
SELECT * FROM view_aliases;
Вы должны увидеть это
+------------------+-------------------+
| email | destination |
+------------------+-------------------+
| john@example.com | john@example.com |
| john@example.com | jmiller@gmail.com |
+------------------+-------------------+
Дополним конфигурацию Postfix, создайте файл /etc/postfix/mysql-virtual-alias-maps.cf и впишите в него
Код:
user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view_aliases WHERE email='%s'
Проверим правильность настроек
Код:
$>
postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Вы увидите это
john@example.com,jmiller@gmail.com
Создадим следующий файл, /etc/postfix/mysql-email2email.cf впишем в него
Код:
user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view_users WHERE email='%s'
Запишем настройки в главный файл конфига Postfix
Код:
$>
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
Выставим правильные права доступа на файлы конфигкрации почтового сервера, ведь в них хранятся пароли от базы данных
Код:
$>
chgrp postfix /etc/postfix/mysql-*.cf
$>
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Далее настроим dovecot в качестве локального агента доставки писем, для этого отредактируйте файл /etc/postfix/master.cf добавив в конец это
Код:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
Перезагрузите Postfix командой postfix reload, и добавьте информацию о виртуальном транспорте в главный конфиг Postfix
Код:
$>
postconf -e virtual_transport=dovecot
$>
postconf -e dovecot_destination_recipient_limit=1
Перейдем к настройкам dovecot, все файлы его конфигурации хранятся в папке /etc/dovecot, начнем настройку с файла /etc/dovecot/dovecot.conf
Найдите строку protocols и смените на
Код:
protocols = imap imaps pop3 pop3s
Так же найдите и измените строку disable_plaintext_auth до состояния disable_plaintext_auth = no
Далее измените параметр mail_location
Код:
mail_location = maildir:/home/vmail/%d/%n
Найдите строку namespace private и измените до
Код:
namespace private {
separator = .
prefix = INBOX.
inbox = yes
}
Перейдите к секции «auth default» и отредактируйте разрешенные механизмы аутентификации
Код:
mechanisms = plain login
В этой же секции измените
Код:
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
Измените так же параметр userdb static
Код:
userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
Перейдите к секции socket listen сдесь мы укажем файлы сокета для аутентификации dovecot
Код:
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
Перейдите к секции protocol lda, не забудьте сменить адрес постмастера на реальный
Код:
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
mail_plugins = cmusieve
global_script_path = /home/vmail/globalsieverc
}
На этом файл можно сохранить.
Отредактируйте файл /etc/dovecot/dovecot-sql.conf, измените настройки на приведенные ниже
Код:
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuser2007
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM view_users WHERE email='%u';
Перезапустите dovecot командой /etc/init.d/dovecot restart и загляните в лог файл /var/log/mail.log, там вы должны увидеть
Код:
dovecot: Dovecot v1.0.rc15 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)
Теперь выставим права доступа к файлам конфигурации dovecot
Код:
$>
chgrp vmail /etc/dovecot/dovecot.conf
$>
chmod g+r /etc/dovecot/dovecot.conf
Настроим TLS/SSL
Код:
$>
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem
Ответьте на несколько вопросов и сертификат будет создан, не забудьте указать правльно все параметры вместо примеров привеленных ниже
Код:
Generating a 1024 bit RSA private key
.........++++++
............................++++++
writing new private key to '/etc/ssl/certs/dovecot.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Russia
Locality Name (eg, city) []:Russia
Organization Name (eg, company) [Internet Widgits Pty Ltd]:example.com
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:mail.example.com
Email Address []:postmaster@example.com
Выставим права доступа на файл
Код:
$>
chmod o= /etc/ssl/private/dovecot.pem
Создадим еще один сертификат по аналогии с предыдущим
Код:
$>
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \
-keyout /etc/ssl/private/postfix.pem
Сменим права доступа
Код:
chmod o= /etc/ssl/private/postfix.pem
Внесите изменения в конфиг Postfix’a
Код:
$>
postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem
$>
postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem
$>
postconf -e smtpd_use_tls=yes
Теперь настроим аутентификацию SMTP, внесите следующие изменения в конфиг Postfix’a, не забудьте сменить примеры на реальные адреса сетей! В примере используется сеть 192.168.50.0/24 ей разрешено отправлятиь почту без SMTP авторизации.
Код:
$>
postconf -e mynetworks=192.168.50.0/24
$>
postconf -e smtpd_sasl_type=dovecot
$>
postconf -e smtpd_sasl_path=private/auth
$>
postconf -e smtpd_sasl_auth_enable=yes
$>
postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
Отредактируйте файл /etc/postfix/main.cf ищменив параметр размера почтового ящика например на 10 мегабайт
Код:
mailbox_size_limit = 102400
На этом настройка нашего почтового сервера закончена, перезапустите сервисы postfix и dovecot, выполните команду postfix check для проверки правильности настроек и прав доступа на файлы, команда должна отдать пустой результат.
Все ошибки и прочие события из жизни вашего почтовика вы можете найти в логах
/var/log/mail.log
/var/log/mail.err
/var/log/mail.warn
/var/log/mail.info
Удачной настройки =)
215 комментариев »
215 комментариев to “Установка почтового сервера Postfix + Dovecot + MYSQL и виртуальных доменов”
Leave a Reply
You must be logged in to post a comment.
Здравствуйте, настроил все строго по вашей инструкции, однако у меня проблема, я создал пользователяdenis@pmail.loc , в the bat отправляю сообщение самому себе чтобы проверить возможность отправки. На сервер уходит без проблем, однако обратно возвращаться не желает.
В логах увидел вот такое:
postfix/pipe[5769]:match_list_match: pmail.loc: no match, однако стоит мне прописать в mydestination pmail.loc, как сразу же в логах появляется warning: do not list domain pmai.loc in BOTH mydestination and Virtual_mailbox_domains. как поступить?
еще в логах нашел вот такую запись:
postfix/local [5932]: E1E9E23256: to=, relay=local, delay=0.09, delays=0.05/0.01/0/0.03, dsn=5.1.1, status=bounced (unknown user: «denis»)
Сервер с почтой доступен локально?
да, локально. в virtual box-е у меня ubuntu server с настройками по вашей инструкции (ip 192.168.0.106). С основная ОС windows XP (192.168.0.102) соединен в режиме сетевой мост. между интернетом и локалкой стоит роутер (192.168.0.1). в файле /etc/hosts были следующие записи:
127.0.0.1 localhost
127.0.1.1 mydlp.medratech.com mydlp
я дописал 192.168.0.102 mail.pmail.loc.
в правильном ли я направлении мыслю, и что я мог упустить?
еще в логах очень много информации подобного вида:
postfix/pipe: dovecot_socket: wanted_atribute:
и там очень много параметров, например original_recipient, queue_name, log_client_address
и еще один попутный вопрос, в вашей инструкции, вы создаете /etc/ssl/certs/dovecot.pem и /etc/ssl/private/dovecot.pem, однако в настройках dovecot про их подключение у вас ни слова. В одном из комментариев в файле dovecot.conf они присутствуют. Я правильно понимаю, что они должны быть?
вопрос немного не в тему, стоит почта по статье выше изложенной, как можно ее бэкапнуть? чтобы после установки не прописывать все заного, файлы настройки только надо? или лучше все файлы слить?
Бэкап конфигов postfix, dovecot, дамп mysql базы. Бэкап почты по желанию.
как это сделать? или вообще образ всего как? чтобы развернуть и понеслось дальше почтить
Спросите у гугла например 😉
спросил, конкретики мало, а сам в никсах деревянный)
tar mysqldump решат проблему
[…] Статья по настройке почтового сервера на sudouser.com […]
хорошая статья… помню когда то давно по ней делал сервер и все сразу заработало…..
но вот недавно опять настраивал сервер…..
и ввиду того что с момента написания статьи с 2008го года, прошло много времени и версии, всего чего можно, обновились и в следствии чего после всех настроек появляется ошибка….
в логах /home/vmail/dovecot-deliver.log
2013-03-14 22:04:36 deliver(user@exemple.com): Fatal: Plugin cmusieve not found from directory /usr/lib/dovecot/modules/lda
в логах mail.log
типа что то такого….
Mar 14 23:53:39 cmail postfix/pipe[10331]: 80B42BE4178: to=, relay=dovecot, delay=410, delays=410/0.01/0/0.01, dsn=4.3.0, status=deferred (temporary failure)
Это произошло по причине обновления dovecot с версии 1.0 до версии 1.2
и поменялось имя плагина с cmusieve на sieve …
Заходим в /etc/dovecot/dovecot.conf и ищем строку:
mail_plugins = cmusieve
заменяем на:
mail_plugins = sieve
Перезапускаем dovecot
так что опишите это в статье в настройках dovecont в разделе lda
еще вот на форуме нашел подобное объяснение…
The correct syntax is now:
mail_plugins = sieve
because the file was renamed from:
/usr/lib/dovecot/modules/lda/lib90_cmusieve_plugin.so (karmic)
to:
/usr/lib/dovecot/modules/lda/lib90_sieve_plugin.so (lucid)
А какие логин и пароль вводить для входа в squirrelmail? Вроде все сделала по инструкции, но ничего не работает