Новинка Виртуальный VDS сервер в Нидерландах от 390р
Выберите продукт

Dovecot IMAP на VDS: mail_location, TLS, quota и auth failed

Разбираем Dovecot IMAP на VDS с практической стороны: где хранить почту, как выбрать mail_location, включить TLS, настроить quota и быстро найти причину ошибок auth failed. Плюс проверим права Maildir и логи.
Dovecot IMAP на VDS: mail_location, TLS, quota и auth failed

Dovecot часто выглядит простым: поставил пакет, открыл порт 993, подключил почтовый клиент — и вроде бы всё. Но в реальной эксплуатации на VDS проблемы почти всегда упираются не в сам IMAP, а в детали: неверный mail_location, разные представления о домашнем каталоге пользователя, права на Maildir, неполная TLS-цепочка, неработающая quota или загадочные строки auth failed в логах.

В этой инструкции разберём рабочую базу для Dovecot IMAP на VDS. Будем смотреть на сервер глазами администратора: где лежит почта, как Dovecot понимает пользователей, какие порты слушает, как проверить TLS, как включить квоты и что делать, если почтовый клиент упорно пишет, что пароль неверный.

Материал предполагает, что SMTP-часть уже есть или будет настроена отдельно: например, Postfix доставляет письма в Maildir, а Dovecot отдаёт их пользователям по IMAP и, при необходимости, предоставляет SASL-аутентификацию для отправки через submission.

Как Dovecot вписывается в почтовый сервер

Dovecot — это IMAP/POP3-сервер и набор сервисов вокруг почтовых ящиков. В типичной схеме на VDS он принимает подключения почтовых клиентов по IMAP, читает письма из локального хранилища, проверяет логины и пароли, применяет quota, отдаёт информацию о ящике веб-почте и может выступать backend-аутентификатором для Postfix.

Важно разделять роли. Postfix отвечает за SMTP: принимает входящую почту, отправляет исходящую, кладёт письма в ящик или передаёт их через LMTP. Dovecot отвечает за доступ пользователя к уже доставленным письмам. Если письмо не появляется в ящике, причина может быть в доставке Postfix, в LMTP, в правах на каталог или в mail_location. Если письмо есть на диске, но клиент его не видит, чаще виноваты Dovecot, индексные файлы, namespace или путь к хранилищу.

В статье используем Maildir как основной формат. Это практичный выбор для небольших и средних серверов: каждое письмо хранится отдельным файлом, резервное копирование и восстановление проще, повреждение одного файла не ломает весь ящик. Для очень больших инсталляций может быть полезен mdbox, но у него своя логика обслуживания; если вы рассматриваете такой формат, полезно отдельно изучить миграцию Dovecot на mdbox.

Установка Dovecot и базовая проверка сервисов

Названия пакетов немного отличаются между семействами дистрибутивов, но общий набор похож: сам Dovecot, IMAP-компонент, LMTP при необходимости, Sieve и модули для MySQL, PostgreSQL или LDAP, если пользователи хранятся не в системных аккаунтах.

Debian и Ubuntu

sudo apt update
sudo apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-sieve dovecot-managesieved
sudo systemctl enable --now dovecot
sudo systemctl status dovecot --no-pager

AlmaLinux, Rocky Linux, CentOS Stream, Oracle Linux и Fedora

sudo dnf install dovecot dovecot-pigeonhole
sudo systemctl enable --now dovecot
sudo systemctl status dovecot --no-pager

После установки проверьте, какие порты слушает сервер. Для IMAP обычно используются 143 для IMAP с STARTTLS и 993 для IMAPS. В продакшене удобно оставлять оба: 993 для обычных клиентов, 143 для клиентов и сервисов, которые явно используют STARTTLS. А вот незашифрованную аутентификацию на 143 без TLS нужно запретить.

sudo ss -ltnp | grep dovecot

Если Dovecot не слушает ожидаемые порты, смотрите файл 10-master.conf и включённые протоколы. На Debian/Ubuntu конфиги обычно лежат в /etc/dovecot/conf.d/, на RHEL-based системах также чаще используется /etc/dovecot/conf.d/. Главный файл — /etc/dovecot/dovecot.conf.

Проверка портов Dovecot и структуры Maildir на сервере

Главная настройка: mail_location

Параметр mail_location говорит Dovecot, где искать почтовое хранилище пользователя и в каком формате оно находится. Если он задан неверно, Dovecot может успешно аутентифицировать пользователя, но показывать пустой ящик. Или, наоборот, Postfix доставляет письма в одно место, а IMAP читает другое.

Для Maildir есть два распространённых подхода: системные пользователи с каталогом ~/Maildir и виртуальные пользователи в едином дереве, например /var/vmail/example.com/user/Maildir. Первый вариант проще для маленьких серверов и служебных ящиков. Второй лучше для хостинга почтовых доменов, потому что не требует создавать Linux-пользователя под каждый email.

Вариант 1: системные пользователи и Maildir в домашнем каталоге

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

mail_location = maildir:~/Maildir

Проверьте, что каталог существует и принадлежит пользователю. Dovecot может создать некоторые служебные файлы сам, но лучше не полагаться на случай, особенно если доставку выполняет Postfix.

sudo mkdir -p /home/alice/Maildir/cur /home/alice/Maildir/new /home/alice/Maildir/tmp
sudo chown -R alice:alice /home/alice/Maildir
sudo chmod -R u+rwX,go-rwx /home/alice/Maildir

Для Postfix при такой схеме обычно задают доставку в Maildir через home_mailbox:

home_mailbox = Maildir/

Обратите внимание на завершающий слеш у Maildir/ в Postfix: он указывает именно на формат Maildir, а не на mbox-файл.

Вариант 2: виртуальные ящики в /var/vmail

Для нескольких доменов и большого числа ящиков удобнее завести отдельного системного пользователя, например vmail, а реальные почтовые аккаунты хранить в базе, passwd-файле или LDAP. Тогда все ящики физически принадлежат одному Unix-пользователю, а Dovecot различает их по логину.

sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/vmail -m -s /usr/sbin/nologin
sudo mkdir -p /var/vmail/example.com/alice/Maildir/cur /var/vmail/example.com/alice/Maildir/new /var/vmail/example.com/alice/Maildir/tmp
sudo chown -R vmail:vmail /var/vmail
sudo chmod -R u+rwX,go-rwx /var/vmail

Для виртуальных пользователей типичный mail_location такой:

mail_location = maildir:/var/vmail/%d/%n/Maildir

Здесь %d — доменная часть логина, а %n — локальная часть до символа @. Для пользователя alice@example.com путь получится /var/vmail/example.com/alice/Maildir. Если пользователи входят без домена, такая схема сломается: %d будет пустым. Поэтому для виртуального почтового хостинга лучше требовать полный email в качестве логина.

В конфигурации userdb при виртуальной схеме Dovecot должен возвращать правильные uid, gid и домашний каталог. Даже если mail_location задан глобально, корректный home полезен для sieve-скриптов, индексов и диагностики.

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

Как проверить, какой путь видит Dovecot

Не гадайте по конфигам — спрашивайте Dovecot. Команда doveadm user показывает, какие поля возвращает userdb, а doveadm auth test проверяет аутентификацию без почтового клиента.

sudo doveadm user alice@example.com
sudo doveadm auth test alice@example.com 'secret-password'

Если пользователь найден, но путь к home неожиданно пустой или указывает не туда, проблема не в IMAP-клиенте. Исправляйте userdb, SQL-запрос, passwd-файл или шаблон mail_location.

FastFox VDS
Облачный VDS-сервер
Виртуальные серверы с быстрым запуском и гибкой конфигурацией от 390₽ / мес
Доступные локации
Россия Нидерланды

TLS для IMAP: что включить и как проверить

Для IMAP на публичном сервере TLS обязателен. Пароли не должны уходить по сети в открытом виде, а клиенты должны видеть корректный сертификат на имя, к которому подключаются: например, mail.example.com. В Dovecot за это отвечают параметры ssl, ssl_cert, ssl_key, минимальная версия протокола и режим разрешения plaintext-аутентификации. Если нужен коммерческий сертификат с понятной цепочкой доверия, посмотрите SSL-сертификаты.

Базовый фрагмент для современных систем:

ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
disable_plaintext_auth = yes
auth_mechanisms = plain login

В строках ssl_cert и ssl_key символ перед путём — это синтаксис Dovecot: он читает содержимое файла. В кодовом блоке он показан как безопасный текст, поэтому угловая скобка экранирована.

Проверьте, что пользователь dovecot или процесс Dovecot может прочитать сертификат и ключ. Частая ошибка: сертификат обновился, Postfix уже его видит, а Dovecot не может прочитать privkey.pem из-за прав. Не стоит бездумно открывать приватный ключ на чтение всем; лучше настроить корректную группу доступа.

sudo doveconf -n | grep -E 'ssl|auth_mechanisms|disable_plaintext_auth'
sudo systemctl restart dovecot

Проверка IMAPS на 993

openssl s_client -connect mail.example.com:993 -servername mail.example.com -showcerts

В выводе важно увидеть корректную цепочку сертификатов, совпадение имени и отсутствие ошибок верификации. Если клиент жалуется на недоверенный сертификат, почти всегда причина в том, что указан не fullchain.pem, а только серверный сертификат, либо подключение идёт к имени, которого нет в SAN сертификата.

Проверка STARTTLS на 143

openssl s_client -connect mail.example.com:143 -servername mail.example.com -starttls imap

STARTTLS полезен для совместимости, но не должен превращаться в возможность отправить пароль без шифрования. За это отвечает disable_plaintext_auth = yes. При ssl = required Dovecot потребует TLS для аутентификации, что обычно и нужно на публичном VDS.

Порты, firewall и сервисы Dovecot

Минимально для IMAP нужны TCP-порты 993 и, если используете STARTTLS, 143. Если Dovecot предоставляет LMTP для Postfix через локальный сокет, наружу LMTP открывать не нужно. POP3 в новых установках часто не требуется: если пользователи работают с почтой с нескольких устройств, IMAP удобнее и безопаснее в сопровождении.

Для UFW:

sudo ufw allow 993/tcp
sudo ufw allow 143/tcp
sudo ufw status verbose

Для firewalld:

sudo firewall-cmd --permanent --add-service=imaps
sudo firewall-cmd --permanent --add-service=imap
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

Если используете nftables напрямую, не добавляйте правила наугад. Сначала посмотрите текущую таблицу и цепочки, чтобы не нарушить политику firewall.

sudo nft list ruleset

Dovecot quota: квоты без сюрпризов

dovecot quota нужна, чтобы один ящик не занял весь диск VDS. Это особенно важно на сервере с несколькими доменами или веб-почтой: пользователь может загрузить огромные вложения, включить синхронизацию всех папок или оставить мусор в Trash на годы.

Dovecot умеет разные backend-квоты. Для Maildir часто используют count: Dovecot считает размер сообщений и хранит служебные данные в индексе. Это удобнее, чем полагаться только на файловую систему, потому что квота привязана к почтовому ящику и понятна IMAP-клиенту.

Минимальный пример для глобальной квоты 2 ГБ:

mail_plugins = $mail_plugins quota
protocol imap {
  mail_plugins = $mail_plugins imap_quota
}
plugin {
  quota = count:User quota
  quota_rule = *:storage=2G
  quota_rule2 = Trash:storage=+200M
}

Правило quota_rule задаёт общий лимит, а quota_rule2 добавляет отдельное послабление для Trash. Это не всегда нужно, но помогает пользователю удалять письма, когда ящик уже почти заполнен. Без такой логики клиент иногда не может переместить письмо в корзину, потому что само перемещение временно требует дополнительного места.

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

sudo doveadm quota get -u alice@example.com
sudo doveadm quota recalc -u alice@example.com

doveadm quota recalc полезна после ручного восстановления писем из резервной копии, миграции через rsync или исправления повреждённых индексов. Но не превращайте её в постоянный cron на каждую минуту: на больших ящиках пересчёт создаёт лишнюю нагрузку на диск. Если нужна более тонкая политика предупреждений и очистки, пригодится инструкция по quota warnings в Dovecot.

Индексы и производительность quota

Dovecot активно использует индексные файлы. Обычно они лежат рядом с Maildir, но при большом количестве пользователей можно вынести индексы на быстрый диск или отдельный путь. На небольшом VDS это редко требуется, но важно понимать: если вы удаляете индексы для диагностики, Dovecot их пересоздаст, а первая синхронизация клиента может быть медленнее.

Для стандартной схемы Maildir лучше сначала добиться корректной работы без сложных оптимизаций: правильный mail_location, права, TLS, аутентификация, quota. И только потом думать о переносе индексов и тонкой настройке кэша.

Мониторинг квот почтовых ящиков и индексов Dovecot

Auth failed: как разбирать ошибки входа

Сообщение auth failed само по себе почти ничего не говорит. Оно может означать неверный пароль, неправильный формат логина, отсутствие пользователя в userdb, сбой SQL-запроса, недоступный LDAP, несовместимую схему хеша пароля, запрет plaintext-аутентификации без TLS или бан на уровне fail2ban.

Начинайте с логов. На системах с systemd удобно смотреть журнал:

sudo journalctl -u dovecot -n 200 --no-pager
sudo journalctl -u dovecot -f

В Debian/Ubuntu также могут быть полезны файлы /var/log/mail.log и /var/log/auth.log. В RHEL-based системах чаще смотрят /var/log/maillog.

sudo tail -n 200 /var/log/mail.log
sudo tail -n 200 /var/log/maillog

Безопасное включение подробного auth-лога

На время диагностики можно включить более подробные сообщения. Не оставляйте максимальную отладку навсегда: в логах может оказаться слишком много чувствительной информации о логинах, IP-адресах и механизмах аутентификации.

auth_verbose = yes
auth_debug = yes
auth_debug_passwords = no

После изменения проверьте конфигурацию и перезапустите сервис:

sudo doveconf -n
sudo systemctl restart dovecot

Когда проблема решена, верните auth_debug = no. Для постоянной эксплуатации обычно достаточно auth_verbose = yes или даже стандартного уровня логирования, если у вас есть fail2ban и централизованный сбор событий.

Проверка пароля без почтового клиента

Почтовые клиенты иногда кэшируют старые пароли, подставляют логин без домена или пробуют устаревший механизм. Поэтому проверяйте вход через doveadm:

sudo doveadm auth test alice@example.com 'secret-password'

Если команда успешна, а клиент не входит, проблема может быть в TLS, имени сервера, порте, формате логина или настройках клиента. Если команда падает, копайте passdb/userdb.

Типовые причины auth failed

  • Логин без домена. Виртуальная схема ждёт alice@example.com, а клиент отправляет alice. Исправьте инструкцию для пользователей или настройте домен по умолчанию аккуратно, если у вас один домен.

  • Пароль в неподдерживаемом формате. Dovecot должен понимать хеш. Проверяйте doveadm pw и схему в passwd-файле или базе.

  • Разные источники пользователей. passdb находит пользователя, а userdb не возвращает home, uid или gid. В итоге вход может пройти частично, но ящик не откроется.

  • Неверные права на Maildir. Dovecot аутентифицировал пользователя, но не может открыть каталог. В логах будут ошибки доступа, а не только auth failed.

  • Подключение без TLS. При disable_plaintext_auth = yes Dovecot не даст отправить пароль открытым текстом. Это правильно; исправлять нужно клиент или порт.

  • Fail2ban или firewall. После серии ошибок IP может быть заблокирован. Тогда клиент будет видеть таймауты или сбросы, а не явный отказ пароля.

FastFox SSL
Надежные SSL-сертификаты
Мы предлагаем широкий спектр SSL-сертификатов от GlobalSign по самым низким ценам. Поможем с покупкой и установкой SSL бесплатно!

Права на Maildir: скучная, но критичная часть

Почтовое хранилище должно быть доступно тому Unix-пользователю, от имени которого Dovecot читает письма. Для системных пользователей это обычно сам пользователь. Для виртуальных ящиков — vmail. Смешивать эти подходы без чёткой причины не стоит.

Проверка для виртуального ящика:

sudo namei -l /var/vmail/example.com/alice/Maildir
sudo find /var/vmail/example.com/alice/Maildir -maxdepth 2 -type d -ls
sudo find /var/vmail/example.com/alice/Maildir -maxdepth 2 -type f -ls | head

namei -l хорош тем, что показывает права на каждый компонент пути. Иногда сам Maildir принадлежит vmail, но родительский каталог /var/vmail/example.com закрыт так, что процесс до него не дойдёт.

Для исправления прав в виртуальной схеме:

sudo chown -R vmail:vmail /var/vmail/example.com/alice
sudo find /var/vmail/example.com/alice -type d -exec chmod 700 {} +
sudo find /var/vmail/example.com/alice -type f -exec chmod 600 {} +

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

sudo chmod -R u+rwX,go-rwx /var/vmail/example.com/alice

Минимальный рабочий конфиг для IMAP на Maildir

Ниже пример не для слепого копирования, а как ориентир. Он показывает взаимосвязь основных параметров: протоколы, Maildir, TLS, аутентификация и quota. Пути к сертификатам, пользователям и домену замените на свои.

protocols = imap lmtp
listen = *
mail_location = maildir:/var/vmail/%d/%n/Maildir
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
disable_plaintext_auth = yes
auth_mechanisms = plain login
mail_plugins = $mail_plugins quota
protocol imap {
  mail_plugins = $mail_plugins imap_quota
}
plugin {
  quota = count:User quota
  quota_rule = *:storage=2G
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

Для реального сервера passdb почти всегда будет отдельным: passwd-file, SQL, LDAP или интеграция с панелью управления. Главное, чтобы passdb отвечал за проверку пароля, а userdb возвращал данные, с которыми Dovecot сможет открыть ящик.

Диагностика: короткий чек-лист перед тем, как винить клиента

Если IMAP не работает, полезно пройтись по слоям снизу вверх. Это быстрее, чем менять сразу пять настроек и потом не понимать, какая из них помогла.

  1. Проверить, что Dovecot запущен: systemctl status dovecot.

  2. Проверить порты: ss -ltnp, затем firewall.

  3. Проверить TLS через openssl s_client на 993 и 143 STARTTLS.

  4. Проверить итоговый конфиг: doveconf -n.

  5. Проверить пользователя: doveadm user.

  6. Проверить пароль: doveadm auth test.

  7. Проверить путь mail_location и права через namei -l.

  8. Проверить quota: doveadm quota get.

  9. Посмотреть свежие логи Dovecot и, если доставка не работает, логи Postfix.

При изменениях используйте doveconf -n: он показывает не весь огромный конфиг с комментариями, а только активные значения. Это особенно удобно после правок в нескольких файлах conf.d, когда один параметр может переопределяться позже.

Что важно для эксплуатации на VDS

Почта чувствительна к диску, времени, DNS и репутации IP, но Dovecot IMAP в первую очередь требует аккуратного хранения данных. Следите за свободным местом и inode, потому что Maildir создаёт много файлов. Если место закончилось, Dovecot начнёт писать ошибки индексов, клиенты увидят странные сбои синхронизации, а доставка новых писем может остановиться.

df -h
df -i
sudo du -sh /var/vmail/* 2>/dev/null

Логи тоже должны ротироваться. На сервере с активной почтой включённый auth_debug способен быстро раздуть журнал. Для постоянного мониторинга лучше собирать ключевые метрики: занятое место, количество ошибок входа, срок действия TLS-сертификата, доступность порта 993 и размер очереди SMTP-сервера.

Ещё одна практичная привычка — тестировать восстановление. Maildir удобно бэкапить, но восстановленный каталог должен иметь правильные владельца, права и индексы. После восстановления конкретного ящика выполните пересчёт quota и проверьте вход через doveadm, а не только через веб-почту.

Итоги

Надёжный dovecot imap на VDS — это не один магический параметр, а согласованная цепочка. Postfix или другой MTA доставляет письма в тот же Maildir, который указан в mail_location. Dovecot получает из userdb корректные uid, gid и home. TLS включён обязательно, сертификат соответствует имени сервера, plaintext-аутентификация без шифрования запрещена. dovecot quota защищает диск от переполнения, а логи помогают быстро отличить неверный пароль от ошибки прав или пути.

Если что-то сломалось, не начинайте с переустановки. Сначала проверьте doveconf -n, doveadm user, doveadm auth test, TLS через openssl s_client и права на Maildir. Такой порядок экономит время и обычно приводит к причине быстрее, чем перебор настроек в почтовом клиенте.

Поделиться статьей

Вам будет интересно

Netplan на Ubuntu VDS: статический IPv4/IPv6, default route, DNS и безопасное применение по SSH OpenAI Статья написана AI (GPT 5)

Netplan на Ubuntu VDS: статический IPv4/IPv6, default route, DNS и безопасное применение по SSH

Пошаговая инструкция по Netplan для Ubuntu VDS: как найти интерфейс, прописать static IP, IPv6, default route и DNS, проверить net ...
Linux TCP backlog на VDS: somaxconn, tcp_max_syn_backlog, Nginx и PHP-FPM OpenAI Статья написана AI (GPT 5)

Linux TCP backlog на VDS: somaxconn, tcp_max_syn_backlog, Nginx и PHP-FPM

Когда сайт получает всплеск соединений, узкое место может быть не в CPU, а в очередях TCP. Поясняем, как увидеть переполнение back ...
NFSv4 на Linux VDS: exports, idmapd, firewall и systemd automount OpenAI Статья написана AI (GPT 5)

NFSv4 на Linux VDS: exports, idmapd, firewall и systemd automount

Разберём, как поднять NFSv4 Linux на VDS для общих каталогов: подготовить сервер и клиентов, описать exports, настроить idmapd, от ...