Настройка почтового сервера Postfix + Dovecot + DKIM на Debian: полное руководство
Собственный почтовый сервер — это полный контроль над корпоративной перепиской, независимость от внешних сервисов и экономия на лицензиях. Но настройка Postfix + Dovecot с нуля вызывает массу вопросов: от DNS-записей до проблем с доставкой в Mail.ru и Gmail. В этом руководстве мы разберём весь процесс пошагово, а также ответим на самые частые вопросы — собранные из 441 комментария к оригинальной инструкции.
Из нашей практики: в ITfresh мы развернули более 30 почтовых серверов на Postfix+Dovecot для компаний от 10 до 500 сотрудников. Ниже — все грабли, на которые мы наступали, и решения, которые работают в 2026 году.
Какие DNS-записи нужны для почтового сервера?
Одна из самых частых ошибок — неполная настройка DNS. Без правильных записей письма будут уходить в спам или вообще отклоняться. Вот полный список необходимых записей:
# MX-запись — указывает, куда доставлять почту для домена
example.com. IN MX 10 mail.example.com.
# A-запись — IP вашего сервера
mail.example.com. IN A 203.0.113.10
# SPF — разрешает отправку только с вашего IP
example.com. IN TXT "v=spf1 ip4:203.0.113.10 -all"
# DKIM — публичный ключ (после генерации)
mail._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0G..."
# DMARC — политика обработки писем без SPF/DKIM
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
# PTR (reverse DNS) — запрашивается у хостера
203.0.113.10 IN PTR mail.example.com.
Как установить и настроить Postfix на Debian?
Начнём с установки всех необходимых пакетов. Команды актуальны для Debian 12 (Bookworm) и Debian 13 (Trixie):
# Обновляем систему
apt update && apt upgrade -y
# Устанавливаем Postfix с поддержкой MySQL
apt install -y postfix postfix-mysql
# При установке выбираем "Internet Site"
# System mail name: example.com
Основная конфигурация /etc/postfix/main.cf:
# Базовые параметры
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = localhost
# Виртуальные домены из MySQL (PostfixAdmin)
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
# TLS настройки
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level = may
# Ограничения
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client zen.spamhaus.org
# SASL аутентификация через Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
# Лимиты
message_size_limit = 52428800
mailbox_size_limit = 0
reject_rbl_client zen.spamhaus.org — это отсекает до 90% спама на входе без нагрузки на сервер.Как настроить Dovecot для работы с виртуальными ящиками?
Dovecot отвечает за хранение почты и IMAP/POP3 доступ. Устанавливаем:
apt install -y dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql
Конфигурация /etc/dovecot/conf.d/10-mail.conf:
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = vmail
first_valid_uid = 150
# Создаём пользователя vmail
# groupadd -g 150 vmail
# useradd -g 150 -u 150 -d /var/vmail -m vmail
Настройка аутентификации /etc/dovecot/conf.d/10-auth.conf:
auth_mechanisms = plain login
disable_plaintext_auth = yes
!include auth-sql.conf.ext
mailbox_alias удалён! Если вы обновились и получаете ошибку «Unknown plugin: mailbox_alias», решение — использовать special_use вместо алиасов. Это один из самых частых вопросов в комментариях.Как решить проблему mailbox_alias в Dovecot 2.4?
В Dovecot 2.4 (поставляется с Debian 13 Trixie) плагин mailbox_alias полностью удалён. Вместо него используйте стандартный механизм special_use:
# /etc/dovecot/conf.d/15-mailboxes.conf
namespace inbox {
mailbox Drafts {
special_use = \Drafts
auto = subscribe
}
mailbox Junk {
special_use = \Junk
auto = subscribe
}
mailbox Trash {
special_use = \Trash
auto = subscribe
}
mailbox Sent {
special_use = \Sent
auto = subscribe
}
mailbox "Sent Messages" {
special_use = \Sent
}
}
Также в Dovecot 2.4 изменился формат ряда директив. Проверьте конфигурацию после обновления:
# Проверка конфигурации Dovecot
doveconf -n
# Если видите deprecated warnings — исправьте по подсказкам
# Типичное изменение: ssl_cert и ssl_key теперь без < символа
ssl_cert = /etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = /etc/letsencrypt/live/mail.example.com/privkey.pem
Как получить SSL-сертификат для почтового сервера?
Многие в комментариях сталкиваются с ошибкой «cannot get RSA certificate from file». Причина — отсутствие или повреждение сертификата. Используйте Let's Encrypt:
# Устанавливаем certbot
apt install -y certbot
# Получаем сертификат (порт 80 должен быть свободен)
certbot certonly --standalone -d mail.example.com
# Или через webroot, если уже есть веб-сервер
certbot certonly --webroot -w /var/www/html -d mail.example.com
# Автообновление — проверяем таймер
systemctl status certbot.timer
Пропишите пути в Postfix и Dovecot:
# Postfix: /etc/postfix/main.cf
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
# Dovecot: /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = /etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = /etc/letsencrypt/live/mail.example.com/privkey.pem
certbot renew --deploy-hook "systemctl restart postfix dovecot"Как настроить DKIM-подпись для одного и нескольких доменов?
DKIM — обязательный элемент для доставки писем в 2026 году. Без него Gmail и Яндекс помечают письма как подозрительные.
# Устанавливаем OpenDKIM
apt install -y opendkim opendkim-tools
# Создаём директорию для ключей
mkdir -p /etc/opendkim/keys/example.com
# Генерируем ключ
opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s mail -v
# Устанавливаем права
chown -R opendkim:opendkim /etc/opendkim
chmod 600 /etc/opendkim/keys/example.com/mail.private
Конфигурация /etc/opendkim.conf:
Syslog yes
LogWhy yes
Mode sv
Canonicalization relaxed/simple
Domain example.com
Selector mail
KeyFile /etc/opendkim/keys/example.com/mail.private
Socket inet:8891@localhost
PidFile /run/opendkim/opendkim.pid
UserID opendkim
TrustAnchorFile /usr/share/dns/root.key
# Для нескольких доменов:
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
Настройка нескольких доменов
# /etc/opendkim/KeyTable
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private
mail._domainkey.example2.com example2.com:mail:/etc/opendkim/keys/example2.com/mail.private
# /etc/opendkim/SigningTable
*@example.com mail._domainkey.example.com
*@example2.com mail._domainkey.example2.com
# /etc/opendkim/TrustedHosts
127.0.0.1
localhost
example.com
example2.com
# Проверяем DKIM после добавления DNS-записи
opendkim-testkey -d example.com -s mail -vvv
Как добавить второй домен в PostfixAdmin?
Это один из самых популярных вопросов. При использовании виртуальных доменов через PostfixAdmin добавление второго домена не требует изменений в main.cf:
- Откройте PostfixAdmin (https://mail.example.com/postfixadmin)
- Domain List → Add Domain → введите новый домен
- Создайте нужные почтовые ящики
- Настройте DNS-записи (MX, SPF, DKIM, DMARC) для нового домена
- Сгенерируйте отдельный DKIM-ключ для нового домена
/etc/opendkim/TrustedHosts, KeyTable и SigningTable. Без этого DKIM для нового домена работать не будет.Почему Mail.ru и Яндекс отклоняют мои письма?
Это боль номер один из комментариев. Крупные провайдеры очень строги к новым почтовым серверам. Чек-лист для прохождения проверок:
- PTR-запись — должна указывать на
mail.example.com, а A-записьmail.example.com— обратно на IP - HELO должен совпадать с PTR: в
main.cfустановитеmyhostname = mail.example.com - SPF — запись с
-all(hard fail), а не~all - DKIM — проверьте через
opendkim-testkey - DMARC — минимум
p=quarantine - IP не в блеклистах — проверьте на mxtoolbox.com
# Быстрая проверка всех записей
dig +short MX example.com
dig +short TXT example.com
dig +short TXT mail._domainkey.example.com
dig +short TXT _dmarc.example.com
dig -x 203.0.113.10 +short
Как установить PostfixAdmin и Roundcube?
PostfixAdmin — веб-панель для управления доменами и ящиками. Roundcube — веб-почта для пользователей.
# Устанавливаем MariaDB и веб-сервер
apt install -y mariadb-server nginx php-fpm php-mysql php-mbstring php-imap php-intl php-xml php-zip php-curl
# Создаём базу данных
mysql -e "CREATE DATABASE postfixadmin CHARACTER SET utf8mb4;"
mysql -e "CREATE USER 'postfixadmin'@'localhost' IDENTIFIED BY 'StrongPass123!';"
mysql -e "GRANT ALL ON postfixadmin.* TO 'postfixadmin'@'localhost';"
# Скачиваем PostfixAdmin
cd /var/www
wget https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.3.13.tar.gz
tar xzf postfixadmin-3.3.13.tar.gz
mv postfixadmin-postfixadmin-3.3.13 postfixadmin
chown -R www-data:www-data postfixadmin
# Roundcube
apt install -y roundcube roundcube-mysql roundcube-plugins
# Или скачиваем последнюю версию
cd /var/www
wget https://github.com/roundcube/roundcubemail/releases/download/1.6.9/roundcubemail-1.6.9-complete.tar.gz
tar xzf roundcubemail-1.6.9-complete.tar.gz
mv roundcubemail-1.6.9 roundcube
chown -R www-data:www-data roundcube
admin.mail.example.com для PostfixAdmin и webmail.example.com для Roundcube. Это упрощает настройку nginx и сертификатов.Как перейти с Яндекс.Почты на собственный сервер?
В комментариях многие спрашивают о миграции с VK WorkSpace (бывший Яндекс.Коннект) и Яндекс.Почты для домена.
- Экспортируйте письма — используйте imapsync для переноса писем:
apt install -y imapsync # Перенос одного ящика imapsync --host1 imap.yandex.ru --port1 993 --ssl1 --user1 user@example.com --password1 "OldPass" --host2 localhost --port2 993 --ssl2 --user2 user@example.com --password2 "NewPass" - Создайте ящики в PostfixAdmin до переноса
- Перенесите DNS — измените MX-запись последним шагом, когда всё проверено
- Установите TTL=300 за сутки до миграции для быстрого переключения
Как защитить почтовый сервер от спама и брутфорса?
Обязательные меры безопасности после установки:
# Fail2ban для Postfix и Dovecot
apt install -y fail2ban
# /etc/fail2ban/jail.local
[postfix-sasl]
enabled = true
port = smtp,465,587,submission
filter = postfix[mode=auth]
logpath = /var/log/mail.log
maxretry = 3
bantime = 3600
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot[mode=aggressive]
logpath = /var/log/mail.log
maxretry = 3
bantime = 3600
# Ограничение скорости отправки в Postfix
# /etc/postfix/main.cf
smtpd_client_message_rate_limit = 100
smtpd_client_recipient_rate_limit = 200
anvil_rate_time_unit = 60s
Подробнее о защите — в нашей статье Защита SSH и Fail2ban.
Как проверить, что всё работает правильно?
После настройки проведите полную диагностику:
# Отправляем тестовое письмо
echo "Test body" | mail -s "Test subject" test@gmail.com
# Проверяем логи
tail -f /var/log/mail.log
# Проверяем очередь
postqueue -p
# Очищаем очередь (если нужно)
postsuper -d ALL
# Проверяем DKIM
opendkim-testkey -d example.com -s mail -vvv
# Проверяем TLS
openssl s_client -connect mail.example.com:587 -starttls smtp
# Онлайн-проверка — отправьте письмо на:
# check-auth@verifier.port25.com
# и получите полный отчёт о SPF/DKIM/DMARC
Какие типичные ошибки встречаются при настройке?
Собрали топ проблем из комментариев:
Ошибка: «cannot get RSA certificate from file»
Причина: путь к сертификату неверный или файл пуст. Проверьте:
ls -la /etc/letsencrypt/live/mail.example.com/
# Файлы fullchain.pem и privkey.pem должны существовать и быть непустыми
cat /etc/letsencrypt/live/mail.example.com/fullchain.pem | head -1
# Должно показать: -----BEGIN CERTIFICATE-----
Ошибка: устаревший формат хешей паролей в MariaDB
При использовании MariaDB 10.11+ формат хеширования по умолчанию изменился:
# Если PostfixAdmin не может аутентифицироваться
mysql -e "ALTER USER 'postfixadmin'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('StrongPass123!');"
Письма не доставляются — «Relay access denied»
# Проверьте, что домен есть в виртуальных доменах
postmap -q example.com mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
# Должен вернуть: example.com
Автоматизация бэкапа почты
Почта — критичные данные. Настройте ежедневный бэкап:
#!/bin/bash
# /opt/scripts/mail-backup.sh
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/mail/$DATE"
mkdir -p "$BACKUP_DIR"
# Бэкап почтовых ящиков
rsync -az /var/vmail/ "$BACKUP_DIR/vmail/"
# Бэкап конфигов
tar czf "$BACKUP_DIR/mail-configs.tar.gz" /etc/postfix/ /etc/dovecot/ /etc/opendkim/ /var/www/postfixadmin/config.local.php
# Бэкап базы данных
mysqldump postfixadmin | gzip > "$BACKUP_DIR/postfixadmin.sql.gz"
# Удаление бэкапов старше 30 дней
find /backup/mail/ -maxdepth 1 -mtime +30 -exec rm -rf {} \;
echo "Backup completed: $BACKUP_DIR"
# Добавляем в cron
echo "0 3 * * * /opt/scripts/mail-backup.sh" | crontab -
Подробнее о стратегиях бэкапа — в статье Бэкап Linux-сервера.
Мониторинг очереди и логов Postfix
# Размер очереди
postqueue -p | tail -1
# Топ причин недоставки
grep "status=bounced" /var/log/mail.log | tail -20
# Статистика за сутки (pflogsumm)
apt install -y pflogsumm
pflogsumm /var/log/mail.log
# Мониторинг в реальном времени
tail -f /var/log/mail.log | grep -E "(reject|error|warning)"
Для комплексного мониторинга сервера смотрите Мониторинг Debian: htop, btop, sysstat.
Нужна помощь с настройкой почтового сервера?
Специалисты ITfresh настроят корпоративную почту на вашем сервере: Postfix, Dovecot, DKIM, антиспам и мониторинг. Полная настройка за 1 рабочий день.