Проблема
Собственный почтовый сервер даёт полный контроль над почтовым трафиком, ящиками и политиками безопасности. Однако его настройка традиционно считается сложной: нужно организовать приём почты (SMTP), хранение (IMAP/POP3), защиту от спама и вирусов, а также обеспечить безопасность передачи данных. Многие начинающие администраторы выбирают готовые панели или отказываются от идеи, теряя гибкость. На самом деле связка Postfix (MTA) и Dovecot (MDA + IMAP/POP3) это стандартный, хорошо документированный и надёжный вариант, который при правильной настройке работает годами без сбоев.
Решение
Используем Postfix для приёма и маршрутизации почты, Dovecot для доступа пользователей к почтовым ящикам (IMAP, POP3) и локальной доставки. Основные принципы:
- Разделяем MTA и MDA: Postfix принимает почту и передаёт её Dovecot для доставки в Maildir.
- Используем виртуальные пользователей (не системные аккаунты) через базу данных (например, MySQL/PostgreSQL) для масштабируемости.
- Настраиваем TLS/SSL для защиты соединений (SMTP с STARTTLS, IMAP/POP3 с SSL).
- Включаем аутентификацию пользователей через Dovecot (SASL) для отправки почты с клиентов.
В этой статье мы настроим базовый, но безопасный почтовый сервер на Ubuntu 22.04 LTS с хранением учётных записей в MySQL. Это позволит легко добавлять домены и ящики и подготовит основу для дальнейшего внедрения антиспама (SpamAssassin) и антивируса (ClamAV).
Пошаговая инструкция
1. Подготовка сервера
Установите необходимые пакеты и откройте порты:
sudo apt update
sudo apt install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-mysql mysql-server
При установке Postfix выберите «Internet Site» и укажите доменное имя (например, mail.example.com). В дальнейшем мы переопределим настройки.
Порты, которые нужно открыть в брандмауэре (например, ufw):
- 25/tcp (SMTP)
- 465/tcp (SMTP over SSL)
- 587/tcp (SMTP с STARTTLS)
- 993/tcp (IMAPS)
- 995/tcp (POP3S)
sudo ufw allow 25/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 993/tcp
sudo ufw allow 995/tcp
2. Настройка MySQL
Создадим базу данных и пользователя для хранения виртуальных доменов и ящиков. Подключаемся к MySQL:
sudo mysql
Выполняем SQL-команды:
CREATE DATABASE maildb;
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL ON maildb.* TO 'mailuser'@'localhost';
FLUSH PRIVILEGES;
Создадим таблицы:
USE maildb;
CREATE TABLE virtual_domains (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE virtual_users (
id INT NOT NULL AUTO_INCREMENT,
domain_id INT NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);
CREATE TABLE virtual_aliases (
id INT NOT NULL AUTO_INCREMENT,
domain_id INT NOT NULL,
source VARCHAR(100) NOT NULL,
destination VARCHAR(100) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);
Добавим тестовый домен и пользователя (пароль зашифруем позже с помощью doveadm):
INSERT INTO virtual_domains (name) VALUES ('example.com');
INSERT INTO virtual_users (domain_id, email, password)
VALUES (1, 'admin@example.com', 'temp');
Выходим из MySQL.
3. Настройка Dovecot
Основной конфигурационный файл Dovecot — /etc/dovecot/dovecot.conf. Обычно настройки разбиты по файлам в /etc/dovecot/conf.d/. Редактируем необходимые.
3.1. Основные параметры (/etc/dovecot/dovecot.conf):
protocols = imap pop3
listen = *
ssl = required
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
В реальной среде используйте Let’s Encrypt или собственные сертификаты. Для теста можно сгенерировать самоподписанный:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/dovecot.pem -out /etc/ssl/certs/dovecot.pem
3.2. Аутентификация (/etc/dovecot/conf.d/10-auth.conf):
disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-sql.conf.ext
3.3. SQL-настройки (/etc/dovecot/conf.d/auth-sql.conf.ext):
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
Создадим системного пользователя vmail для хранения почты:
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 -d /var/vmail -m vmail
3.4. SQL-подключение (/etc/dovecot/dovecot-sql.conf.ext):
driver = mysql
connect = host=localhost dbname=maildb user=mailuser password=strong_password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email AS user, password FROM virtual_users WHERE email='%u';
3.5. Почтовые ящики (/etc/dovecot/conf.d/10-mail.conf):
mail_location = maildir:/var/vmail/%d/%n/Maildir
namespace inbox {
inbox = yes
location =
prefix =
}
3.6. IMAP/POP3 (/etc/dovecot/conf.d/20-imap.conf, 20-pop3.conf) — обычно оставляем по умолчанию.
3.7. SSL (/etc/dovecot/conf.d/10-ssl.conf):
ssl = required
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
3.8. Перезапуск Dovecot:
sudo systemctl restart dovecot
4. Настройка Postfix
Postfix будет использовать MySQL для поиска доменов, пользователей и алиасов, а также передавать доставку на Dovecot.
4.1. Основные настройки (/etc/postfix/main.cf):
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = localhost, $myhostname, localhost.$mydomain
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailboxes.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-aliases.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
4.2. Создаём файлы с SQL-запросами:
/etc/postfix/mysql-virtual-domains.cf:
user = mailuser
password = strong_password
hosts = 127.0.0.1
dbname = maildb
query = SELECT 1 FROM virtual_domains WHERE name='%s'
/etc/postfix/mysql-virtual-mailboxes.cf:
user = mailuser
password = strong_password
hosts = 127.0.0.1
dbname = maildb
query = SELECT 1 FROM virtual_users WHERE email='%s'
/etc/postfix/mysql-virtual-aliases.cf:
user = mailuser
password = strong_password
hosts = 127.0.0.1
dbname = maildb
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Установим права доступа:
sudo chmod 640 /etc/postfix/mysql-*.cf
sudo chown root:postfix /etc/postfix/mysql-*.cf
4.3. Настройка транспорта Dovecot (/etc/postfix/master.cf):
Убедитесь, что раскомментирована строка:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
4.4. Перезапуск Postfix:
sudo systemctl restart postfix
5. Зашифрованный пароль для тестового пользователя
Вернёмся к MySQL и установим правильный хеш пароля. Используем doveadm:
sudo doveadm pw -s SHA512-CRYPT
Введите пароль (например, secret). Скопируйте полученную строку и обновите запись в MySQL:
UPDATE virtual_users SET password='{SHA512-CRYPT}$6$...' WHERE email='admin@example.com';
6. Проверка работы
Создайте тестовый ящик:
sudo mkdir -p /var/vmail/example.com/admin/Maildir/{cur,new,tmp}
sudo chown -R vmail:vmail /var/vmail
Попробуйте подключиться по IMAP с помощью openssl:
openssl s_client -connect localhost:993 -crlf -quiet
После установки соединения введите команды:
a login admin@example.com secret
a list "" "*"
a logout
Отправьте письмо локально:
echo "Test" | mail -s "Test" admin@example.com
Проверьте логи:
sudo tail -f /var/log/mail.log
Письмо должно быть доставлено в /var/vmail/example.com/admin/Maildir/new/.
7. Дополнительная настройка безопасности
- SPF, DKIM, DMARC: для доставляемости писем необходимо настроить DNS-записи. Для DKIM потребуется OpenDKIM.
- TLS-сертификаты: замените самоподписанные на Let’s Encrypt (Certbot).
- Антиспам: интегрируйте SpamAssassin через Postfix (рекомендуется).
-
Ограничения: в
main.cfможно добавитьsmtpd_recipient_restrictionsиsmtpd_sender_restrictionsдля блокировки спама.
Устранение распространённых проблем
| Проблема | Вероятная причина | Решение |
|---|---|---|
Connection refused на 993/995 | Dovecot не слушает порты или брандмауэр закрыт. | Проверить netstat -tlnp | grep dovecot. Открыть порты. |
User doesn't exist при аутентификации | Неправильный SQL-запрос, неверный пароль или отсутствие пользователя. | Проверить таблицу virtual_users, выполнить запрос вручную. Убедиться, что default_pass_scheme совпадает с алгоритмом хеширования. |
| Письма не доставляются в Maildir | Dovecot не запущен, неправильный путь mail_location. | Проверить статус systemctl status dovecot. Убедиться, что каталог /var/vmail существует и принадлежит vmail. |
| Postfix не принимает почту для виртуального домена | Неверные SQL-файлы, нет записи в virtual_domains. | Выполнить запрос из файла вручную. Добавить домен в таблицу. |
SASL authentication failed | Не настроена аутентификация в Postfix. | Убедитесь, что в main.cf включены smtpd_sasl_auth_enable и smtpd_sasl_type = dovecot. |
Итог
Мы развернули полноценный почтовый сервер на Linux с использованием Postfix и Dovecot, настроили хранение учётных записей в MySQL, включили SSL и подготовили основу для дальнейшего расширения. Linux почтовый сервер настройка таким образом становится прозрачной и управляемой задачей. В следующих шагах можно добавить веб-интерфейс (Roundcube), антиспам и усилить защиту. Полученная конфигурация успешно работает в небольших и средних организациях, обеспечивая полный контроль над почтовой инфраструктурой.







