Проблема
Собственный почтовый сервер даёт полный контроль над почтовым трафиком, ящиками и политиками безопасности. Однако его настройка традиционно считается сложной. Нужно организовать приём почты (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. Подготовка сервера
Установите необходимые пакеты и откройте порты.
text
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)
text
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.
text
sudo mysql
Выполняем SQL команды.
text
CREATE DATABASE maildb;
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL ON maildb.* TO 'mailuser'@'localhost';
FLUSH PRIVILEGES;
Создадим таблицы.
text
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).
text
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).
text
protocols = imap pop3
listen = *
ssl = required
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
В реальной среде используйте Let's Encrypt или собственные сертификаты. Для теста можно сгенерировать самоподписанный.
text
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).
text
disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-sql.conf.ext
3.3. SQL настройки (/etc/dovecot/conf.d/auth-sql.conf.ext).
text
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
Создадим системного пользователя vmail для хранения почты.
text
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).
text
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).
text
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).
text
ssl = required
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
3.8. Перезапуск Dovecot.
text
sudo systemctl restart dovecot
4. Настройка Postfix
Postfix будет использовать MySQL для поиска доменов, пользователей и алиасов, а также передавать доставку на Dovecot.
4.1. Основные настройки (/etc/postfix/main.cf).
text
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.
text
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.
text
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.
text
user = mailuser
password = strong_password
hosts = 127.0.0.1
dbname = maildb
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Установим права доступа.
text
sudo chmod 640 /etc/postfix/mysql-*.cf
sudo chown root:postfix /etc/postfix/mysql-*.cf
4.3. Настройка транспорта Dovecot (/etc/postfix/master.cf).
Убедитесь, что раскомментирована строка.
text
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
4.4. Перезапуск Postfix.
text
sudo systemctl restart postfix
5. Зашифрованный пароль для тестового пользователя
Вернёмся к MySQL и установим правильный хеш пароля. Используем doveadm.
text
sudo doveadm pw -s SHA512-CRYPT
Введите пароль (например secret). Скопируйте полученную строку и обновите запись в MySQL.
text
UPDATE virtual_users SET password='{SHA512-CRYPT}$6$...' WHERE email='admin@example.com';
6. Проверка работы
Создайте тестовый ящик.
text
sudo mkdir -p /var/vmail/example.com/admin/Maildir/{cur,new,tmp}
sudo chown -R vmail:vmail /var/vmail
Попробуйте подключиться по IMAP с помощью openssl.
text
openssl s_client -connect localhost:993 -crlf -quiet
После установки соединения введите команды.
text
a login admin@example.com secret
a list "" "*"
a logout
Отправьте письмо локально.
text
echo "Test" | mail -s "Test" admin@example.com
Проверьте логи.
text
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 или 995Dovecot не слушает порты или брандмауэр закрытПроверить netstat -tlnp | grep dovecot. Открыть порты.User doesn't exist при аутентификацииНеправильный SQL запрос, неверный пароль или отсутствие пользователяПроверить таблицу virtual_users, выполнить запрос вручную. Убедиться, что default_pass_scheme совпадает с алгоритмом хеширования.Письма не доставляются в MaildirDovecot не запущен, неправильный путь 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), антиспам и усилить защиту. Полученная конфигурация успешно работает в небольших и средних организациях, обеспечивая полный контроль над почтовой инфраструктурой.