Установка почтового сервера Postfix(MTA) + Dovecot(POP3) + MYSQL и виртуальных доменов
Данное руководство описывает установку почтового сервера Postfix в связке с dovecot и базой данных mysql для хранения данных. По окончанию настройки мы получим почтовый сервер с поддержкой SMTP, POP3, IMAP, поддержку SSL, TLS, работу с виртуальными доменами. Так же данное руководство не является исчерпывающим, и может быть трудным для понимания новичкам, так как описано конкретно как настроить сервисы, но не описано как оно работает и так далее. Конфигурация была проверена и отлично работает на серверах с установленным Linux Ubuntu и Debian GNU Linux, но я думаю она подойдет и для других дистрибутивов. Описание установки приведено на примере Ubuntu, все пакеты взяты из стандартных репозиториев.
При настройке нашего нового сервиса я буду использовать примеры команд, обратите внимание на интерпритатор, их будет использоваться два, обычная командная строка (bash) и mysql, выглядит это так:
bash: $> mysql: mysql>
Так же все действия производятся от имени пользователя root. На этом вступительную часть можно закончить и давайте приступим к установке и настройке нашего почтовика.
Установим все необходимые пакеты
Код:
aptitude install postfix-mysql mysql-server dovecot-pop3d dovecot-mysql dovecot-imapd openssl
Так же в дальнейшем вам может понадобится phpmyadmin и простой веб интерфейс squirrelmail для работы с почтовым ящиком, установить все это можно командой
Код:
aptitude install phpmyadmin squirrelmail
Создадим базу данных для почтового сервера
Код:
mysql> create database mailserver; mysql> grant all on mailserver.* to mailuser@localhost identified by 'mailuser2007'; exit
Затем создайте таблицы в базе данных
Код:
CREATE TABLE `virtual_domains` ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE = InnoDB;
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;
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 }
Сортировщик писем
mail_plugins
- cmusieve - устаревший плпгин
На этом файл можно сохранить. Отредактируйте файл /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 изменив параметр размера почтового ящика, например, на 100 мегабайт
Код:
mailbox_size_limit = 102400
На этом настройка нашего почтового сервера закончена, перезапустите сервисы postfix и dovecot, выполните команду
Код:
postfix check
для проверки правильности настроек и прав доступа на файлы, команда должна отдать пустой результат.
Все ошибки и прочие события из жизни вашего почтовика вы можете найти в логах
/var/log/mail.log /var/log/mail.err /var/log/mail.warn /var/log/mail.info
Конфигурации
- managesieve/sieve - Сортировщик почты