Настройка почтового сервера в Linux (Postfix + Dovecot)

Настройка почтового сервера в Linux (Postfix + Dovecot)

Проблема

Собственный почтовый сервер даёт полный контроль над почтовым трафиком, ящиками и политиками безопасности. Однако его настройка традиционно считается сложной: нужно организовать приём почты (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.conf20-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/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), антиспам и усилить защиту. Полученная конфигурация успешно работает в небольших и средних организациях, обеспечивая полный контроль над почтовой инфраструктурой.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu