Если вы уже используете Postfix для входящей почты и Dovecot как IMAP/POP-сервер, следующий логичный шаг — связать их через LMTP. Такой подход разгружает Postfix, поручая Dovecot доставку писем непосредственно в почтовые ящики, а также активирует мощные возможности Sieve-фильтрации, лимиты квот и удобные уведомления о переполнении. В этой инструкции разберём архитектуру, сетевые и файловые границы, конфигурацию через Unix-сокет и TCP, подключение Sieve, а также тесты и отладку. Материал ориентирован на продакшен-настройку на Linux (Debian/Ubuntu и RHEL-совместимые дистрибутивы).
Зачем LMTP между Postfix и Dovecot
LMTP — протокол, похожий на SMTP, но предназначенный для локальной доставки и умеющий возвращать статус для каждого получателя отдельно. В связке Postfix+Dovecot он решает сразу несколько задач:
- Снимает ответственность за доставку с Postfix: Dovecot сам пишет в Maildir/mbox, учитывает квоты и блокировки.
- Активирует цепочку плагинов Dovecot при доставке: Sieve-фильтры, автосоздание папок, уведомления о квоте.
- Упрощает диагностику: все события доставки в логах Dovecot, без дополнительных «прыжков» через LDA-программы.
- Гибкость подключения: Unix-сокет для локальной инсталляции или TCP-порт для контейнеров/раздельных сервисов.
LMTP лучше классических LDA-программ в том, что обеспечивает пометку результата на адресата, корректно обрабатывает многопользовательские доставки и тесно интегрирован с плагинами Dovecot (включая Sieve и quota).
Архитектура и потоки данных
Схема проста: внешний мир говорит с Postfix по SMTP, Postfix после проверки политик и очереди передаёт локальную доставку в Dovecot по LMTP. Dovecot принимает LMTP-сессию, применяет Sieve-скрипты и кладёт письмо в целевой ящик (обычно Maildir). Пользователь читает письма по IMAP/POP, которые обслуживает тот же Dovecot.
Локальная связка по Unix-сокету обычно быстрее и безопаснее TCP: не надо открывать дополнительный порт, доступ ограничивается правами на файл-сокет. Для разнесённых инсталляций (контейнеры, разные ВМ) используется LMTP по TCP на локальном интерфейсе или внутренней сети.

Предварительные условия
- Установлены Postfix и Dovecot с пакетами LMTP и Sieve.
- Спроектирована схема хранения почты (Maildir/mbox). Рекомендуется Maildir.
- Определено, будут ли системные пользователи или «виртуальные» (отдельный uid/gid, например vmail).
- Разумная политика DNS и авторизации для SMTP уже настроена (в данной статье фокус на локальной доставке).
Если домен ещё не зарегистрирован — начните с понятного имени и корректной зоны: поможет регистрация доменов с поддержкой нужных зон и WHOIS.
Установка пакетов
Debian/Ubuntu:
apt update
apt install postfix dovecot-imapd dovecot-lmtpd dovecot-sieve dovecot-managesieved
RHEL/AlmaLinux/Rocky:
dnf install postfix dovecot dovecot-pigeonhole
Если поднимаете почту в изоляции — удобнее развернуть её на управляемой виртуалке: подойдёт VDS с гарантированными ресурсами и простым масштабированием.
Пользователь и директории почты
Для виртуальных ящиков создайте выделенного пользователя и каталог хранения. Пример:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail -m -s /sbin/nologin
chmod 750 /var/vmail
chown -R vmail:vmail /var/vmail
Базовая конфигурация Dovecot
Ключевые моменты: включить протокол LMTP, определить формат и расположение ящиков, настроить аутентификацию и Unix-сокеты для интеграции с Postfix.
Минимальный каркас /etc/dovecot/dovecot.conf:
protocols = imap lmtp
auth_mechanisms = plain login
mail_location = maildir:/var/vmail/%d/%n/Maildir
# Запрет простого пароля без TLS на внешних протоколах (IMAP/POP). Для LMTP по сокету не критично.
disable_plaintext_auth = yes
Если используете виртуальных пользователей, самый простой старт — файл паролей Dovecot. Сгенерируйте хеш пароля:
doveadm pw -s SHA512-CRYPT
Создайте /etc/dovecot/passwd с одной строкой для тестового ящика:
user@example.com:{SHA512-CRYPT}$6$X...$...:5000:5000::/var/vmail/example.com/user::
Где 5000:5000 — uid/gid пользователя vmail.
Пример 10-auth.conf (фрагменты):
passdb {
driver = passwd-file
args = username_format=%u /etc/dovecot/passwd
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
Включаем LMTP и сокеты Dovecot
Откройте 10-master.conf и добавьте/проверьте секции:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
# Сокет для SASL-аутентификации Postfix (если понадобится на submission)
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
Важно: путь сокета должен находиться внутри chroot Postfix (/var/spool/postfix). Dovecot сам создаст файл при старте.
Подключаем Sieve к LMTP
Чтобы Sieve-фильтры применялись при доставке, включите плагин для протокола LMTP. Создайте 20-lmtp.conf или отредактируйте соответствующий файл:
protocol lmtp {
mail_plugins = $mail_plugins sieve quota
}
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_default = /etc/dovecot/sieve/default.sieve
# Автосоздание целевых папок при доставке
sieve_implicit_extensions = +mailbox
}
Пример простого /etc/dovecot/sieve/default.sieve:
require ["fileinto", "mailbox", "imap4flags"];
# Категоризация по List-Id
if header :contains "List-Id" "newsletter" {
fileinto "Newsletters";
stop;
}
# Переадресация не включена по умолчанию из соображений безопасности.
# Для бизнес-логики используйте отдельный согласованный скрипт.
Скомпилируйте Sieve (Dovecot выполнит сам при доставке, но полезно проверить заранее):
sievec /etc/dovecot/sieve/default.sieve

Конфигурация Postfix для LMTP
Ваша задача — сказать Postfix, что локальная доставка для доменов/пользователей выполняется через LMTP на Unix-сокет, который слушает Dovecot. Измените /etc/postfix/main.cf (показываю ключевые строки):
myhostname = mail.example.com
myorigin = example.com
mydestination = localhost
# Наши домены с виртуальными ящиками
virtual_mailbox_domains = example.com
# Доставка в Dovecot по LMTP через Unix-сокет
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Разрешить + алиасы
recipient_delimiter = +
Убедитесь, что в /etc/postfix/master.cf присутствует транспорт LMTP (обычно есть по умолчанию):
lmtp unix - - n - - lmtp
Иногда этот блок называют «lmtp unix»; в разговорах вы можете встретить условное имя «lmtp_unix» — это про эту секцию master.cf.
Перезапуск сервисов
systemctl restart dovecot
systemctl restart postfix
Проверьте, что сокет существует и права корректны:
ls -l /var/spool/postfix/private/dovecot-lmtp
lsof -U | grep dovecot-lmtp
Проверка аутентификации и доставки
Быстрые проверки:
- Аутентификация Dovecot:
doveadm auth login user@example.com(введите пароль, ожидайте «success»). - Параметры конфигов:
doveconf -nиpostconf -n— фиксируйте вывод в git/Ansible. - Журналы:
journalctl -u dovecot -u postfix -fв отдельной сессии при тестовой отправке.
Простейшая локальная отправка с той же машины (замените адрес):
sendmail -v user@example.com
Subject: test via LMTP
hello
.
В логах Dovecot вы увидите, что письмо пришло через LMTP и попало в Maildir, а также какие Sieve-правила отработали.
Виртуальные пользователи и домены
В качестве простого старта мы показали файл паролей. В продакшене часто используют SQL/LDAP-бэкенды для хранения пользователей, квот и алиасов. Dovecot умеет читать из MySQL/MariaDB/PostgreSQL и предоставлять Postfix необходимую информацию через свои механизмы. Логика остаётся прежней: Postfix решает, кому доставлять, а Dovecot через LMTP физически записывает письмо и применяет Sieve.
Квоты с уведомлениями и отказ на приём
С LMTP включение квот особенно удобно: Dovecot знает размер ящика и может отклонить доставку до записи, сохранив ресурсы диска.
Пример включения квот (фрагменты):
plugin {
quota = maildir:User quota
quota_rule = *:storage=2G
quota_rule2 = Trash:storage=+200M
}
protocol lmtp {
mail_plugins = $mail_plugins sieve quota
}
Для «мягких» предупреждений можно включить уведомления и интегрировать их в Sieve (например, отправка системного письма при 90% заполнения). Если нужна жёсткая блокировка входящих, Dovecot LMTP вернёт соответствующий код, и Postfix не запишет письмо в очередь. Подробнее о практической стороне уведомлений — в материале аккуратные предупреждения о квоте в Dovecot.
LMTP по TCP вместо Unix-сокета
Если Postfix и Dovecot работают в разных контейнерах/ВМ, используйте TCP-листенер LMTP у Dovecot и укажите его в Postfix как lmtp:inet:host:port.
Фрагмент 10-master.conf для TCP-листенера:
service lmtp {
inet_listener lmtp {
address = 127.0.0.1
port = 24
}
}
В Postfix (main.cf):
virtual_transport = lmtp:inet:127.0.0.1:24
TCP удобен в контейнерной среде, но думайте о границах доверия: ограничьте доступ по firewall, слушайте только на localhost или внутри приватной сети.
Безопасность и права
- Unix-сокет LMTP должен быть доступен только Postfix: выставляйте
mode = 0600и владельцаpostfix. - Каталоги почты — только под uid/gid vmail, без прав на чтение для других.
- Отключайте plaintext-логины IMAP/POP без TLS. Для LMTP по сокету это неактуально, но единые дефолты лучше.
- Регулярно проверяйте логи на ошибки прав и отказов доставки.
Производительность и устойчивость
Несколько практических моментов:
- Параметр Postfix
lmtp_destination_recipient_limitрегулирует, сколько получателей обрабатывается за сессию. Разумно держать единицы-десятки, чтобы не задерживать транзакции. - У Dovecot можно управлять количеством процессов LMTP через
service lmtp(пулы, лимиты памяти), чтобы держать доступный запас под пиковую нагрузку. - Maildir на SSD плюс грамотный
noatime/relatimeи ротация журналов помогают снизить latency.
Миграция с LDA на LMTP
Если у вас уже настроен LDA Dovecot (историческое virtual_transport = dovecot), переход прост:
- Включите в Dovecot
protocols = imap lmtpи настройтеservice lmtpc Unix-сокетом в chroot Postfix. - Замените в Postfix
virtual_transport = dovecotнаlmtp:unix:private/dovecot-lmtp. - Перезапустите Dovecot и Postfix, проверьте логи и тестовые доставки.
Плюс миграции — чистые статусы по каждому получателю, меньше обвязки и лучшие интеграции с плагинами Dovecot.
Диагностика типовых ошибок
- Нет доступа к сокету: в логах Postfix «connect to private/dovecot-lmtp: Permission denied». Проверьте
mode, владельца сокета и путь внутри/var/spool/postfix. - Домашний каталог не найден: Dovecot жалуется на
home=илиmail_location. Проверьте userdb и существование каталога, права на/var/vmail/%d/%n. - Пустые или неправильные Sieve-скрипты:
sievecпомогает выявить синтаксис заранее. Лог Dovecot покажет отказ от скрипта. - Доставка уходит в «local» вместо LMTP: проверьте, что домен указан в
virtual_mailbox_domains, а не вmydestination. - Квоты не срабатывают: удостоверьтесь, что
quotaесть вmail_pluginsу протокола LMTP и включены правилаquota_rule.
Проверочные чек-листы
Перед вводом в продакшен проверьте:
postconf -nне содержит конфликтующих параметров (local_transportvsvirtual_transport).doveconf -n: включёнprotocol lmtp, корректныйmail_location, плагинsieve.- Сокет
/var/spool/postfix/private/dovecot-lmtpсуществует, права и владелец совпадают с Postfix. - Тестовая рассылка на несколько получателей в одном домене и на алиасы — статусы корректно отражаются в логах.
- Папки Sieve-доставки создаются автоматически, письма оказываются в нужных Maildir.
Когда выбирать TCP LMTP
TCP полезен, когда процессы изолированы по контейнерам или у вас отдельные ВМ для Postfix и Dovecot. Важно ограничить доступ: слушать только на localhost или внутри приватного сегмента, фильтровать доступ через firewall и не поднимать LMTP на глобальном адресе. Пропишите явный порт (например, 24) и не забывайте мониторинг доступности.
Мониторинг и эксплуатация
- Собирайте метрики задержек и ошибок доставки по логам. Минимум — парсинг syslog для кодов LMTP и квот.
- Алёрты на переполнение файловых систем, рост queue у Postfix и ошибки
permission denied. - Периодическая проверка прав и владельцев в
/var/vmailи на сокетах внутри/var/spool/postfix. - Регулярные бэкапы Maildir и конфигов (
postconf -n,doveconf -n, Sieve-скрипты). Для защиты от брутфорса посмотрите готовые jails для Fail2ban под Postfix и Dovecot.
Итог
LMTP-связка Postfix и Dovecot — практичный стандарт для локальной доставки, который делает инфраструктуру проще, надёжнее и предсказуемее. Вы получаете тонкую интеграцию с Sieve, аккуратную работу квот и прозрачную диагностику. Начните с Unix-сокета, а если потребуется изоляция — переключайтесь на TCP. Включайте мониторинг, держите конфиги под версионным контролем и проверяйте изменения на тестовом домене — и ваша почтовая подсистема будет служить без сюрпризов.


