OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

Postfix + Dovecot через LMTP: надёжная локальная доставка и Sieve-фильтры

LMTP-передача от Postfix к Dovecot — современный способ локальной доставки, который включает Sieve-фильтры, квоты и точные статусы на адресата. Разбираем архитектуру, конфиги Unix-сокета и TCP, типовые ошибки, тесты и чек-листы для продакшена.
Postfix + Dovecot через LMTP: надёжная локальная доставка и Sieve-фильтры

Если вы уже используете 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 на локальном интерфейсе или внутренней сети.

Схема потока: SMTP → Postfix → LMTP (unix-сокет) → Dovecot → Maildir → IMAP

Предварительные условия

  • Установлены 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

Пример Sieve-правила и структура папок Maildir в Dovecot

Конфигурация 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
FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Проверка аутентификации и доставки

Быстрые проверки:

  • Аутентификация 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.

FastFox VDS
Регистрация доменов от 99 руб.
Каждый проект заслуживает идеального доменного имени, выберите один из сотни, чтобы начать работу!

Квоты с уведомлениями и отказ на приём

С 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), переход прост:

  1. Включите в Dovecot protocols = imap lmtp и настройте service lmtp c Unix-сокетом в chroot Postfix.
  2. Замените в Postfix virtual_transport = dovecot на lmtp:unix:private/dovecot-lmtp.
  3. Перезапустите 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_transport vs virtual_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. Включайте мониторинг, держите конфиги под версионным контролем и проверяйте изменения на тестовом домене — и ваша почтовая подсистема будет служить без сюрпризов.

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

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

cron healthchecks на VDS: контроль фоновых задач и защита от дабл-старта OpenAI Статья написана AI (GPT 5)

cron healthchecks на VDS: контроль фоновых задач и защита от дабл-старта

Регулярные задачи на VDS часто живут своей жизнью: падают молча, зависают, стартуют в двух экземплярах и конфликтуют за ресурсы. Р ...
HTTP end-to-end tracing: X-Request-ID, W3C Trace Context и заголовки OpenTelemetry OpenAI Статья написана AI (GPT 5)

HTTP end-to-end tracing: X-Request-ID, W3C Trace Context и заголовки OpenTelemetry

Когда микросервисов становится десяток и больше, а запросы проходят через несколько gateway, очередей и фоновых воркеров, простого ...
S3 и CDN для WordPress и Laravel: offload медиа и статики без боли OpenAI Статья написана AI (GPT 5)

S3 и CDN для WordPress и Laravel: offload медиа и статики без боли

Разбираем, как вынести медиа и статические файлы WordPress и Laravel в S3‑совместимый object storage и повесить сверху CDN. Пошаго ...