{{tag>server mail mta pop3 smtp postfix dovecot}}

====== Установка почтового сервера 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 - устаревший плпгин
  * [[http://habrahabr.ru/post/173041/|sieve]]

На этом файл можно сохранить.
Отредактируйте файл /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

===== Конфигурации =====

  * [[system:dovecot:dovecot.conf|dovecot.conf]]
  * [[system:dovecot:dovecot-sql.conf|dovecot-sql.conf]]
  * [[system:dovecot:managesieve|managesieve/sieve]] - Сортировщик почты
