Управление доставкой почты и Sieve [211.2]

Рейтинг: 78.5% · 14 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Управление доставкой почты и Sieve [211.2]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2] (вы здесь)
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 35. Управление доставкой почты и Sieve [211.2]

В прошлом уроке Postfix принял письмо и решил, что оно для локального пользователя. Дальше его задача - отдать сообщение агенту локальной доставки (MDA/LDA), который положит письмо в ящик. Но между приёмом и записью в ящик есть целый слой, которым управляет администратор и сам пользователь: куда именно класть письмо, в какую папку, не переслать ли его дальше, не выкинуть ли спам. В этом уроке разберём классический .forward, коротко глянем на легаси procmail, а основное время посвятим современному способу - языку фильтров Sieve, серверной сортировке в Dovecot и управлению скриптами по протоколу ManageSieve.

Изображение

Как это работает

Доставку удобно представлять как конвейер. MTA (Postfix) отвечает за маршрутизацию и приём по SMTP. Когда адресат локальный, Postfix не пишет в ящик сам - он вызывает MDA. Исторически это был mail.local или procmail, сегодня в подавляющем большинстве установок это Dovecot: либо его LDA (бинарь dovecot-lda), либо доставка по протоколу LMTP. Именно на этом шаге и работают пользовательские правила сортировки.

Самый простой инструмент пользователя - файл .forward в домашнем каталоге. В нём построчно перечисляют, куда направить почту: другой адрес, локальный аккаунт, или конвейер во внешнюю программу через символ канала. Если первой строкой поставить адрес, а второй - обратную косую с собственным логином, копия и пересылается, и остаётся в ящике. Это удобно, но логики кроме голой пересылки тут нет.

procmail когда-то закрывал эту нишу: рецепты в .procmailrc позволяли раскладывать письма по папкам, отбрасывать спам, запускать скрипты. Знать его на уровне идеи полезно для экзамена, но в 2026 году procmail - мёртвый проект: последний релиз вышел больше двадцати лет назад, у него были проблемы с безопасностью, и из современных дистрибутивов его выпиливают. Новые системы используют Sieve, а где нужна именно процедурная логика - maildrop. Так что воспринимайте procmail как наследие.

Sieve (RFC 5228) - это специализированный язык фильтрации почты. Его принципиальное отличие: он намеренно ограничен. В нём нет циклов, переменных по умолчанию и доступа к внешним командам, поэтому скрипт не может зациклиться, повесить сервер или выполнить произвольный код. Это делает Sieve безопасным для запуска на стороне сервера от имени пользователя - в отличие от procmail, которому можно скормить запуск любого бинаря. Скрипт состоит из правил вида if (условие) { действие }. Условия проверяют заголовки, адреса, размер; действия кладут письмо в папку (fileinto), пересылают (redirect), молча удаляют (discard), отклоняют с уведомлением (reject) или оставляют по умолчанию (keep).

Важный момент - неявная доставка. Если ни одно правило не сработало или ни одно явно не вызвало keep/fileinto/discard, Sieve в конце выполнит keep, то есть положит письмо в INBOX. А вот fileinto и discard отменяют этот неявный keep. Поэтому одно правило с discard молча съест письмо без следа - будьте осторожны.

В Dovecot Sieve реализован плагином Pigeonhole. Скрипты лежат в домашнем каталоге пользователя (обычно ~/.dovecot.sieve, с активным символьной ссылкой на файл в ~/sieve/). Чтобы пользователю не давать SSH-доступ к серверу для правки этих файлов, есть протокол ManageSieve (RFC 5804, порт 4190): почтовый клиент или утилита подключается, загружает, проверяет и активирует скрипты удалённо. Сервер заранее проверяет синтаксис, так что битый скрипт просто не активируется.

Команды и примеры

Простейший .forward - переслать всё на другой ящик и оставить копию себе:

Код: Выделить всё

# ~/.forward
ivan@example.org
\ivan
Пересылка во внешнюю программу (конвейер начинается с | ):

Код: Выделить всё

"| /usr/local/bin/myfilter.sh"
Установка Sieve и ManageSieve различается по семействам:

Код: Выделить всё

# Debian 13 / Ubuntu 24.04
apt install dovecot-sieve dovecot-managesieved

# RHEL 10 / Fedora 41+
dnf install dovecot-pigeonhole
Включение в Dovecot - подключить плагин в протоколе LDA/LMTP и поднять сервис managesieve:

Код: Выделить всё

# /etc/dovecot/conf.d/15-lda.conf
protocol lda {
  mail_plugins = $mail_plugins sieve
}
# /etc/dovecot/conf.d/20-managesieve.conf
protocols = $protocols sieve
Типичный пользовательский скрипт ~/.dovecot.sieve:

Код: Выделить всё

require ["fileinto", "envelope"];

# письма из списка рассылки - в отдельную папку
if header :contains "List-Id" "lpic.example.org" {
    fileinto "Lists/LPIC";
}
# по адресу отправителя
elsif address :is "from" "boss@example.org" {
    fileinto "Important";
}
# крупные вложения - в отдельную папку
elsif size :over 5M {
    fileinto "Big";
}
# явный спам - молча в helpку (осторожно с discard!)
elsif header :contains "subject" "viagra" {
    discard;
}
# всё прочее упадёт в INBOX неявным keep
Управление скриптами с клиента через утилиту из пакета dovecot:

Код: Выделить всё

doveadm sieve list -u ivan@example.org           # какие скрипты есть
doveadm sieve activate -u ivan@example.org main  # сделать активным
sieve-test ~/.dovecot.sieve message.eml          # прогнать тест на письме
Многие почтовые клиенты (Thunderbird с расширением, Roundcube с плагином managesieve) умеют редактировать Sieve удалённо по порту 4190 - пользователю не нужен доступ к файловой системе сервера.

Частые грабли
  • discard молча удаляет письмо без копии и без отлупа отправителю - легко потерять почту навсегда. Для сомнительных правил лучше fileinto в папку Junk, а discard оставить для заведомого мусора.
  • Забыли require для используемого действия (например fileinto или imap4flags) - скрипт не активируется или падает. Каждое расширение надо объявить в require сверху.
  • fileinto в несуществующую папку: без расширения mailbox папка не создаётся, письмо может уйти в INBOX или потеряться. Включайте require "mailbox" и :create.
  • Думают, что fileinto оставляет копию в INBOX - нет, он отменяет неявный keep. Чтобы и разложить, и оставить копию, явно добавьте keep.
  • .forward с конвейером во внешний скрипт - дыра в безопасности и частая причина почтовых петель. В 2026 это решается Sieve, а не пайпом.
  • procmail ещё встречается в старых инструкциях - не тащите его на новый сервер, его уже нет в репозиториях многих дистрибутивов.
  • ManageSieve слушает 4190, но клиент ходит без TLS - пароль уходит в открытом виде. Включайте STARTTLS/SSL для managesieve.
  • Правили скрипт прямо в ~/.dovecot.sieve, но Dovecot держит скомпилированный .svbin - после ручной правки он перекомпилируется сам, а вот при правке через ManageSieve активный скрипт мог остаться старым, если не вызвали activate.
Мини-лаба
  • Установите Sieve и managesieve: apt install dovecot-sieve dovecot-managesieved (Debian) или dnf install dovecot-pigeonhole (RHEL), подключите плагин sieve в 15-lda.conf и перезапустите dovecot.
  • Создайте тестового пользователя с ящиком и положите ему ~/.dovecot.sieve с правилом fileinto по заголовку Subject (например все письма с темой TEST - в папку Tests, не забудьте require и :create).
  • Сгенерируйте тестовое письмо в файл message.eml с нужной темой и прогоните sieve-test ~/.dovecot.sieve message.eml - убедитесь, что действие fileinto сработало.
  • Отправьте реальное письмо через локальный SMTP (sendmail или swaks) и проверьте, что оно легло в папку Tests, а не в INBOX.
  • Добавьте правило с discard для письма с темой DROP, отправьте такое письмо и убедитесь, что оно исчезло - сделайте вывод об опасности discard.
  • Подключитесь к порту 4190 (например openssl s_client -connect localhost:4190 -starttls sieve) и убедитесь, что ManageSieve отвечает и анонсирует расширения.
  • Через doveadm sieve list и activate переключите активный скрипт и проверьте, что поведение доставки изменилось.
Контрольные вопросы
  • Какой агент в современной установке выполняет локальную доставку и пользовательские Sieve-правила, и как Postfix передаёт ему письмо?
  • Что произойдёт с письмом, если ни одно правило Sieve не вызвало явного действия, и как fileinto и discard влияют на неявный keep?
  • Чем Sieve принципиально безопаснее procmail для запуска на стороне сервера?
  • Какие действия Sieve вы знаете и в чём разница между discard и reject?
  • Зачем нужен протокол ManageSieve, на каком порту он работает и почему важен TLS?
  • Как одной строкой .forward переслать почту на внешний адрес и одновременно сохранить копию в локальном ящике?
👍5 ❤️3 🔥2 😄 🤔1
Аватара пользователя
deepdruid
Сообщения: 1
Зарегистрирован: 27 май 2026, 22:30

Re: Управление доставкой почты и Sieve [211.2]

Сообщение deepdruid »

А managesieve обязательно отдельным сервисом поднимать или Roundcube может прямо в файл ~/.dovecot.sieve писать? У меня клиент через 4190 не цепляется, ловлю connection refused
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
nikita8
Сообщения: 1
Зарегистрирован: 12 май 2026, 07:24

Re: Управление доставкой почты и Sieve [211.2]

Сообщение nikita8 »

Поймал на discard ровно как в граблях - тестил правило на спам, а оно сожрало нормальное письмо от коллеги. Теперь всё сомнительное только fileinto в Junk, discard вообще боюсь трогать
👍 ❤️1 🔥 😄 🤔1
Ответить
← Предыдущая глава
Почтовый сервер Postfix [211.1]
Следующая глава →
Доступ к почтовым ящикам: Dovecot [211.3]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость