Установка почтового сервера Postfix + Dovecot + 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-imapd openssl


Так же в дальнейшем вам может понадобится phpmyadmin и простой веб интерфейс squirrelmail для работы с почтовым ящиком, установить все это можно командой

Код:
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 изменив параметр размера почтового ящика, например, на 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


Удачной настройки =)
  • +1
  • 4 января 2010, 23:08
  • Intruder      


Комментарии (14)

RSS свернуть / развернуть
+
0
Серьезный мануал. Кому — то здорово облегчит жизнь. В свое время собирал инфу по данной теме. А тут все в куче
avatar

unkn0wn

  • 5 января 2010, 02:37
+
0
Советову в помощь =), ему оч нужно на вдс почту поднять…
avatar

Intruder

  • 5 января 2010, 02:49
+
0
да я вобщем по нему и делал, щя перепроверять буду все у себя на вдске, может я в конфигах где опечатался…
Спасибо.
avatar

admin

  • 5 января 2010, 10:06
+
0
Команда postfix check покажет ошибки в конфигах если они есть…
avatar

Intruder

  • 5 января 2010, 14:01
+
0
Да, совсем забыл… Мыло мы настроили, оно находится по адресу /squirrelmail.
avatar

Intruder

  • 5 января 2010, 14:00
+
0
Создавать новые ящики для юзеров можно в пхпмайадмине.
avatar

Intruder

  • 5 января 2010, 14:05
+
0
MX записи прописываются элементарно. Если почтовый сервер стоит там-же, куда ведет example.com то можно MX прописать просто:
@ MX 10 example.com.
если можно указать, то вместо домена можно указать @ (@ ведет на сам домен.)
Если сервер стоит на отдельном компе, то можно создать A запись:
mail A 1.2.3.4
или
mail.example.com A 1.2.3.4
и прописать mx запись как:
@ MX 10 mail
или
@ MX 10 mail.example.com.

В MX можно прописать ip
@ MX 10 1.2.3.4

проверить, прописались ли записи на сайте xseo.in/dns.php
avatar

Halfi

  • 19 марта 2010, 14:07
+
0
эх ещёб ты расказал про mx записи для домена, как их крутить или напрямую в mx у домена песать exaple.com?
avatar

admin

  • 5 января 2010, 17:57
+
0
и ещё белкомыло при попытке отправить мыло самому себе орет —
Сообщение не было отправлено. Ответ сервера:
Connection refused
111 Не удалось открыть канал SMTP.
avatar

admin

  • 5 января 2010, 18:01
+
0
:~# postfix check
postfix/postfix-script: warning: group or other writable: /etc/postfix/./smtpd.cert
postfix/postfix-script: warning: group or other writable: /etc/postfix/./postfix-files
postfix/postfix-script: warning: group or other writable: /etc/postfix/./postfix-script
postfix/postfix-script: warning: group or other writable: /etc/postfix/./sasl/smtpd.conf
postfix/postfix-script: warning: group or other writable: /etc/postfix/./master.cf
postfix/postfix-script: warning: group or other writable: /etc/postfix/./smtpd.key
postfix/postfix-script: warning: group or other writable: /etc/postfix/./dynamicmaps.cf
postfix/postfix-script: warning: group or other writable: /etc/postfix/./post-install

avatar

admin

  • 5 января 2010, 18:03
+
0
А у меня почта отлично отправляется, но принимать почту на ящики я не могу, в логах это:
Mar 19 01:19:18 halfi-ext postfix/virtual[20204]: fatal: bad string length 0 < 1: virtual_mailbox_base = 
Mar 19 01:19:19 halfi-ext postfix/master[19821]: warning: process /usr/lib/postfix/virtual pid 20204 exit status 1
Mar 19 01:19:19 halfi-ext postfix/master[19821]: warning: /usr/lib/postfix/virtual: bad command startup -- throttling
avatar

Halfi

  • 18 марта 2010, 22:29
+
0
Почта не приходит, гугл сервера говорят, что мой сервер не отвечает скорее всего из-за неправильных MX записей, либо из-за того, что гугл сервера в грей листах, записи прописаны правильно, ибо яндекс пробивается до постфикса, но дальше почта не идет… Гррей листы вообще не используются… В логах обнаруживаю входящие письма, но во входящих аккаунта их нет. Не понимаю куда девается вся почта… name@yandex.ru — аккаунт на яндексе… В логах больше ничего особо нету, отправляется почта шикарно…
Mar 19 21:27:53 halfi-ext postfix/qmgr[21641]: B315113E059: from=<name@yandex.ru>, size=2783, nrcpt=1 (queue active)
Mar 19 21:27:53 halfi-ext postfix/qmgr[21641]: D410E13E05A: from=<name@yandex.ru>, size=2789, nrcpt=1 (queue active)
avatar

Halfi

  • 19 марта 2010, 20:30
+
0
Нашел ошибку, когда менял размер стер перевод строки и када прописывал virtual_transport через postconf получился следующий конфиг.
mailbox_size_limit = 1048576virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

Все отлично работает)
avatar

Halfi

  • 20 марта 2010, 17:16
+
0
у меня давно заработало *admin =))
avatar

ASovetov

  • 19 марта 2010, 22:44

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.