Установка и настройка почтового сервера Postfix + Dovecot2 из репозитария

Дата Автор cdb29 комментариев

Выдалась свободная минутка, напишу пост о том, как поставить почтовый сервер в Ubuntu. Мануалов в интернете тучи, поэтому я взял один и маленько переписал для более быстрого разворота сервера в полевых условиях. Все нижеизложенное не претендует на звание истины в последней инстанции *-)
Итак, мануал для скоростной установки почты в связке postfix + dovecot2 с виртуальными юзерами/доменами, доступом по SMTP/POP3/IMAP и шифрованием SSL/TLS. Данный мануал предполагает что были выполнены предыдущие шаги из цикла статей про VDS сервер, а именно — уже установлен MySQL (если нет то его придется доставить).

Начнем с того, что в системе должен быть объявлен hostname и FQDN. Проверить имя хоста можно так:

hostname

Проверить FQDN можно так:

hostname -f

Они должны быть валидными и скорее всего отличаться друг от друга. У меня это koteika для хоста и koteika.koteika.ru для FQDN. Если у вас эти параметры не настроены, далее продолжать не имеет смысла. Как задать имя хоста и FQDN в Ubuntu я уже писал.

Установка компонентов сервера

Cтавим необходимые компоненты со всеми зависимостями (если у вас не стоит сервер MySQL — придется сначала установить MySQL):

sudo apt-get install postfix postfix-mysql dovecot-mysql dovecot-common dovecot-pop3d dovecot-imapd openssl

Во время установки запустится упрощенный конфигуратор пакета postfix.

  • Create a self-signed SSL certificate? — No (создадим сертификат позже)
  • General type of mail configuration — Internet Site
  • System mail name — koteika.koteika.ru (если FQDN у вас указан правильно, то визард подставит сам)

Далее в визард завершается.

Создание пользователя и таблиц для работы почтового сервера с MySQL
Входим в MySQL client:

mysql -uroot -p -h localhost

Создаем БД для почты и аккаунт для работы с этой БД в MySQL:

CREATE DATABASE `mailserver` /*!40100 CHARACTER SET utf8 COLLATE 'utf8_general_ci' */;
grant all on mailserver.* to mailuser@localhost identified by 'mysql_mailuser_password';

Здесь mysql_mailuser_password надо заменить на пароль для учетной записи юзера почты.
Выбераем созданную БД для работы:

USE mailserver;

Создадим таблицы, необходимые для работы почтового сервера:

CREATE TABLE `virtual_domains` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET=utf8;

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 DEFAULT CHARSET=utf8;

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 DEFAULT CHARSET=utf8;

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;

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;

Теперь добавим наш виртуальный домен (у меня это koteika.ru):

INSERT INTO virtual_domains (id, name) VALUES (1, 'koteika.ru');

и нашего виртуального пользователя почты (у меня это postmaster, адрес почты получится postmaster@koteika.ru):

INSERT INTO virtual_users (id, domain_id, user, password) VALUES (1, 1, 'postmaster', MD5('postmaster_password'));

Где postmaster_password надо заменить на пароль пользователя ящика postmaster@koteika.ru.
Выходим из MySQL клиента:

exit;

Конфигурация почтового сервера postfix.
Конфиги postfix находятся в папке /etc/postfix. Если вы вдруг потеряли или испортили конфиг, то его исходник можно скопировать отсюда — /usr/share/postfix.
Создаем файл /etc/postfix/mysql-virtual-mailbox-domains.cf с содержимым (не забываем менять пароль на пароль MySQL пользователя почты):

user = mailuser
password = mysql_mailuser_password
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

По аналогии создаем файл /etc/postfix/mysql-virtual-mailbox-maps.cf:

user = mailuser
password = mysql_mailuser_password
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM view_users WHERE email='%s'

Создаем файл /etc/postfix/mysql-virtual-alias-maps.cf:

user = mailuser
password = mysql_mailuser_password
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view_aliases WHERE email='%s'

Создаем файл /etc/postfix/mysql-email2email.cf:

user = mailuser
password = mysql_mailuser_password
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view_users WHERE email='%s'

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

sudo chgrp postfix /etc/postfix/mysql-*.cf
sudo chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

Потребуется пользователь с домашней директорией под почту и отдельная группа для него:

sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m

Визард конфигурации postfix создал нам упрощенный конфиг. Переконфигурируем его нормально:

sudo dpkg-reconfigure postfix

Далее в визарде выбираем:

  • General type of mail configuration — Internet Site
  • System mail name — koteika.koteika.ru (если FQDN у вас указан правильно, то визард подставит сам)
  • Root and postmaster mail recipient — Адрес postmaster заполняем на свой вкус, ящик надо будет создать на этом домене. (Например postmaster@koteika.ru)
  • Other destinations to accept mail for — оставляем пустым (все равно это перекрывается виртуальными обработчиками)
  • Force synchronous updates on mail queue — Форсировать синхронное обновление почты — нет
  • Local networks — 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 (подсеть адресов, отправка почты с которых будет идти без авторизации)
  • Mailbox size limit — 0 (без ограничений)
  • Local address extension character — пустое поле
  • Internet protocols to use — All

Вносим дополнительные изменения в основной конфиг postfix:

sudo postconf -e virtual_uid_maps=static:5000
sudo postconf -e virtual_gid_maps=static:5000

sudo postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
sudo postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
sudo postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf

sudo postconf -e virtual_transport=dovecot
sudo postconf -e dovecot_destination_recipient_limit=1

Редактируем файл /etc/postfix/master.cf
В конец дописываем:

dovecot unix - n n - - pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Два пробела перед «flags=» обязательны!! Далее перезапускаем postfix:

sudo service postfix restart

Настройка виртуального транспорта dovecot

Конфиги dovecot находятся в папке /etc/dovecot. Если вы потеряли или испортили конфиг, то исходник можно взять отсюда — /usr/share/dovecot. Приступаем к редактированию конфигов:

/etc/dovecot/dovecot-sql.conf.ext (не забываем менять юзера\пароль на юзера\пароль MySQL пользователя почты):

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mysql_mailuser_password
default_pass_scheme = MD5
password_query = SELECT email as user, password FROM view_users WHERE email='%u';
user_query = SELECT 5000 AS uid, 5000 AS gid, '/home/vmail/%d/%n' AS home

/etc/dovecot/conf.d/10-auth.conf — правим, чтобы было то что ниже, остальное закоменчиваем.

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ext

/etc/dovecot/conf.d/auth-sql.conf.ext

# Look up user passwords from a SQL database as 
# defined in /etc/dovecot/dovecot-sql.conf.ext
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
# Look up user information from a SQL database as 
# defined in /etc/dovecot/dovecot-sql.conf.ext
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/home/vmail/%d/%n

namespace {

  type = private
  separator = .
  prefix = INBOX.
  inbox = yes

}

mail_uid = vmail
mail_gid = vmail

/etc/dovecot/conf.d/10-master.conf — правим секцию auth, остальное не трогаем

service auth {

	unix_listener auth-userdb {
		mode = 0600
		user = vmail
		group = vmail
	}

	unix_listener /var/spool/postfix/private/auth {
		mode = 0660
		user = postfix
		group = postfix
	}
}

/etc/dovecot/conf.d/10-ssl.conf

ssl = yes
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem

/etc/dovecot/conf.d/15-lda.conf — указываем адрес админа почты

postmaster_address = postmaster@daily-notes.ru

Выставляем права на конфиги

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

Настройка TLS/SSL сертификатов
Создаем сертификат для dovecot:

sudo openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem

При создании старайтесь указывать реальные данные:

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Novosibirskaya oblast
Locality Name (eg, city) []:Novosibirsk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyOrg
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:MyName
Email Address []:postmaster@koteika.ru

Выставим права на полученый сертификат:

sudo chmod o= /etc/ssl/private/dovecot.pem

Создаем сертификат для postfix:

sudo openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \
-keyout /etc/ssl/private/postfix.pem
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Novosibirskaya oblast
Locality Name (eg, city) []:Novosibirsk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CCS
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Codeblight
Email Address []:postmaster@koteika.ru

Выставим права на полученый сертификат:

sudo chmod o= /etc/ssl/private/postfix.pem

Теперь еще немного подкрутим postfix и добавим информацию о сертификатах и настройках авторизации:

sudo postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem
sudo postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem
sudo postconf -e smtpd_use_tls=yes

sudo postconf -e smtpd_sasl_type=dovecot
sudo postconf -e smtpd_sasl_path=private/auth
sudo postconf -e smtpd_sasl_auth_enable=yes
sudo postconf -e smtpd_helo_required=yes
sudo postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unknown_client,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_hostname,reject_non_fqdn_sender,reject_unknown_sender_domain,reject_non_fqdn_recipient,reject_unauth_pipelining,reject_unauth_destination,reject_unlisted_recipient,permit

Перезапускаем postfix и dovecot:

sudo service postfix restart
sudo service dovecot restart

Информацию об ошибках и прочих событиях можно найти в лог-файлах, располагающихся здесь:
/var/log/mail.log
/var/log/mail.err
/var/log/mail.warn
/var/log/mail.info

Если Dovecot не запускается, то с консоли можно поглядеть на проблемы в конфиге:

dovecot -n

Как настраивать DNS ?
На VDS в Hetzner, при использовании Nameserver Robot, настройка DNS генерируется автоматически и выглядит примерно так:

$TTL 86400
@   IN SOA ns1.first-ns.de. postmaster.robot.first-ns.de. (
    2011080200   ; serial
    14400        ; refresh
    1800         ; retry
    604800       ; expire
    86400 )      ; minimum

@                        IN NS      robotns3.second-ns.com.
@                        IN NS      robotns2.second-ns.de.
@                        IN NS      ns1.first-ns.de.

@                        IN A       78.47.88.87
localhost                IN A       127.0.0.1
mail                     IN A       78.47.88.87
www                      IN A       78.47.88.87
@                        IN AAAA    2a01:4f8:d16:4346::2
mail                     IN AAAA    2a01:4f8:d16:4346::2
www                      IN AAAA    2a01:4f8:d16:4346::2
ftp                      IN CNAME   www
imap                     IN CNAME   www
loopback                 IN CNAME   localhost
pop                      IN CNAME   www
relay                    IN CNAME   www
smtp                     IN CNAME   www
@                        IN MX 10   mail
@                        IN TXT     "v=spf1 +mx +a +include:gmail.com -all"

Подробнее про синтакс SPF можно прочитать тут.

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

  1. Здравствуйте! Хороший мануал, правда не завелась почта. В логе mail.info письмо приходит

    Apr 8 22:04:03 yahydeu postfix/smtpd[3087]: connect from mail-pz0-f49.google.com[209.85.210.49]
    Apr 8 22:04:04 yahydeu postfix/smtpd[3087]: AB7C485C2: client=mail-pz0-f49.google.com[209.85.210.49]
    Apr 8 22:04:35 yahydeu postfix/smtpd[3087]: disconnect from mail-pz0-f49.google.com[209.85.210.49]

    Только при тестировании подключения через Thunderbird не подключается. В mail.err ничего по теме нет. Может быть у вас есть соображения где может быть ошибка.

  2. Причина кроется в конфиге dovecot .
    Вот что выдал файл /home/vmail/dovecot-deliver.log .

    2012-04-08 22:30:01 deliver(root@example.com): Error: namespace configuration error: list=yes requires prefix=INBOX to end with separator
    2012-04-08 22:30:01 deliver(root@example.com): Fatal: Namespace initialization failed

    Проверил скобки в конфиге все закрыты, похоже ему не нравятся указанные параметры.

  3. Возникли еще вопросы 🙂
    С получением все прекрасно. А вот отправка хромает. Ни через 25 порт (наверное закрыт провайдером), ни через 465 порт не хочет авторизоваться. Хотя почта с сервера с помощью программы mutt от рута уходит.

  4. Мне интересно узнать системные требования для железа.
    Никогда подобного не делал будет первый опыт.

    Заранее спасибо.

    • Для Postfix-Dovecot ? Или для linux ? Ubuntu server я поднимал на довольно древнем PIII 1.2Ghz и 384мб оперативы — работало неплохо для домашнего файлового сервера. У Postfix-Dovecot тоже требования думаю не сильные — процессы памяти немного жрут, если их в большом кол-ве не разрешать (т.к. их постоянно будут долбить спам-боты и в памяти они постоянно будут все заняты «делом»). Вообщем весь этот пост можно провернуть на небольшом VDS с объемом памяти в 0.5-1гб…

  5. Здравствуйте!

    А после всей настройки-то что дальше? Как пользоваться почтой? Второй день рыщу по интернету, но единственное, что более-менее нормальное — это Ваша статья. Но и здесь зашел в тупик…

    И по поводу настройки. Что возвращает запросы:
    query = SELECT 1 FROM virtual_domains WHERE name=’%s’
    и
    query = SELECT 1 FROM view_users WHERE email=’%s’
    ??

    Подскажите, пожалуйста, или хотя бы направьте….

    • Предположительно эти запросы использует postfix чтобы проверить есть ли такой виртуальный домен или юзер. Если есть — на выходе 1, если нет — на выходе 0 строк.

    • В почту ходить по POP-IMAP, отправлять через SMTP, юзеров я создаю через SQL запросы — может не очень удобно но я делаю это раз в год, т.ч. нормально.

      • А какой вид должна иметь запись в таблице «virtual_aliases»? На данный момент таблица пустая, но к ней идет обращение.

  6. Чего-то я не так делаю….
    Через postfixadmin письмо отправляется.
    Thunderbird не подключается.
    postfix check молчит.
    А вот что пишет doveconf -n:
    # 2.1.7: /etc/dovecot/dovecot.conf
    doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -n > dovecot-new.conf
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘imaps’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘pop3s’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:56: namespace private {} has been replaced by namespace { type=private }
    doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 66: Unknown setting: mechanisms
    doveconf: Error: managesieve-login: dump-capability process returned 89
    doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -n > dovecot-new.conf
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘imaps’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘pop3s’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:56: namespace private {} has been replaced by namespace { type=private }
    doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 66: Unknown setting: mechanisms

      • В 66 строке как раз написано mechanisms = plain login. А он пишет, что unknown setting: mechanisms. Это как это unknown???? А вообще у меня dovecot.conf был странный. Там небыло нифига половины секций, что описаны.
        Dovecot версии 2.1.7

        У меня, кстати, тоже VDS Hetzner. Я заметил, что Hetzner во внешние репозитории не пускает, а ставит из своих.

  7. Спасибо за ответ. Заработало кое как. ))
    А не подскажете такую вещь? Я вижу в логах, что постфикс принимает и отправляет письма. Могу посмотреть письма в очереди, но после отправки в очереди они удаляются (в принципе, это понятно). Но хотелось бы знать сохраняются ли они куда-то после отправки и удаления из очереди. Можно ли где-то посмотреть уже отправленные письма.
    P.S. отправляю письма не через почтовый агент, а через внешнюю почту на один из ящиков своего почтового сервера.

  8. Можно ли как решить такую ситуацию? Postfix автоматически создал три почтовых ящика: root, www-data и smmsp. С этими ящиками postfix постоянно работает. С www-data периодически отправляются письма (если я правильно понял, они отправляются на root и www-data). Никак не могу найти как и каким образом postfix это делает. И уж тем более как это отключить, не знаю и в интернете найти не могу.

    Если кто в курсе как это исправить подскажите, пожалуйста.

  9. Мдя.
    В новой версии dovecot все эти настройки раскиданы по файлам в папке /etc/dovecot/conf.d/
    А есть совсем непонятные вещи. К примеру подключение протоколов идет из папки /usr/share/dovecot/protocols.d/*.protocol
    И т.п.
    Похоже сложно будет мне закончить то, что уже начал…

  10. Создаем БД для почты и аккаунт для работы с этой БД в MySQL:
    grant all on mailserver.* to mailuser@localhost identified by ‘mysql_mailuser_password’;
    Выбераем созданную БД для работы:
    USE mailserver;

    Возникла заминка на данном шаге. Выдается:
    mysql> USE mailserver;
    Database changed

  11. Спасибо большое, по вашей инструкции смог настроить почтовый сервер в Ubuntu Server 16.04

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *