diff --git a/module2/04_postfix_dovecot/lection.md b/module2/04_postfix_dovecot/lection.md index 3b5dbb8..8c15e8c 100644 --- a/module2/04_postfix_dovecot/lection.md +++ b/module2/04_postfix_dovecot/lection.md @@ -1,10 +1,150 @@ # Почтовая система Postfix + Dovecot -Возможные структуры почтовой системы: -1. Postfix, Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей. -2. Dovecot является «бэкендом» для доступа к почтовым ящикам пользователей. При этом подходе, расположение почтовых ящиков, список пользователей, известен только Dovecot. +Рассматрим структуру почтовой системы, в которой Postfix и Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей. -Далее будет рассмотрен первый вариант. Но в начале следует углубиться в теорию для понимания механизмов работы Postfix. Рассмотрим что такое классы адресов и какие бывают типы доменов. Затем рассмотрим классы адресов с точки зрения менеджмента почтовых ящиков. В конце разберёмся какие проблемы есть у почтовых серверов из-за спама, и как повысить надежность доставки писем вашим почтовым сервером. +В начале следует углубиться в теорию для понимания механизмов работы Postfix. Рассмотрим архитектуру Postfix, что такое классы адресов и какие бывают типы доменов. Затем рассмотрим классы адресов с точки зрения менеджмента почтовых ящиков. В конце разберёмся какие проблемы есть у почтовых серверов из-за спама, и как повысить надежность доставки писем вашим почтовым сервером. + +## Архитектура Postfix + +### Как Postfix получает почту + +``` + trivial-rewrite(8) + ▲ +Network ───► smtpd(8) ──┐ │ + │ ▼ +Network ───► qmqpd(8) ──┼───► cleanup(8) ───► incoming + │ +maildrop ──► pickup(8) ─┘ + ▲ + │ +postdrop(1) + ▲ + │ +sendmail(1) + ▲ + │ +Local +``` +Когда сообщение попадает в почтовую систему Postfix, первой остановкой внутри неё является очередь входящих сообщений `incoming`. На рисунке показаны основные процессы, связанные с новой почтой. Имена, за которыми следует цифра, представляют собой команды или программы сервера Postfix, а непронумерованные имена - очереди Postfix. + +#### smtpd(8), qmqpd(8), pickup(8) + +Почта из сети поступает в Postfix через сервисы `smtpd(8)` или `qmqpd(8)`. Эти сервисы удаляют инкапсуляцию протокола SMTP или QMQP, выполняют некоторые проверки на корректность для защиты Postfix и передают отправителя, получателей и содержимое сообщения сервис `cleanup(8)`. Сервис `smtpd(8)` может быть настроен на блокировку нежелательной почты, как описано в документе [SMTPD_ACCESS_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/SMTPD_ACCESS_README). + +Локальные отправки принимаются с помощью команды Postfix `sendmail(1)` и помещаются в очередь `maildrop` с помощью привилегированной команды `postdrop(1)`. Эта схема работает даже тогда, когда почтовая система Postfix не работает. Локальный сервис `pickup(8)` собирает локальные отправленные сообщения, выполняет некоторые проверки работоспособности для защиты Postfix и передает отправителя, получателей и содержимое сообщения на сервису `cleanup(8)`. + +#### cleanup(8) + +Почта из внутренних источников передается непосредственно сервису `cleanup(8)`. Эти источники не показаны на рисунке и включают в себя: почту, пересылаемую агентом доставки `local(8)`, сообщения, возвращаемые отправителю сервером `bounce(8)`, и уведомления почтмейстера о проблемах с Postfix. + +Сервер `cleanup(8)` реализует финальную стадию обработки перед постановкой почты в очередь. Он добавляет недостающие заголовки `From:` и другие сообщения, а также преобразует адреса, как описано в документе [ADDRESS_REWRITING_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/ADDRESS_REWRITING_README). При желании сервер `cleanup(8)` можно настроить для облегченной проверки содержимого с помощью регулярных выражений, как описано в документе BUILTIN_FILTER_README. Сервер `cleanup(8)` помещает результат в виде одного файла во входящую очередь `incoming` и уведомляет менеджер очередей `qmgr(8)` о прибытии новой почты. + +#### trivial-rewrite(8) + +Сервис `trivial-rewrite(8)` перезаписывает адреса в стандартную форму «user@complete.qualified.domain», как описано в документе [ADDRESS_REWRITING_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/ADDRESS_REWRITING_README). В настоящее время Postfix не реализует язык перезаписи, но многое можно сделать с помощью поиска по таблицам и, при необходимости, регулярных выражений. + +Конфигурация сервисов участвующих в приёме почты в файле `master.cf`: +``` +# ========================================================================== +# service type private unpriv chroot wakeup maxproc command + args +# (yes) (yes) (no) (never) (100) +# ========================================================================== +smtp inet n - y - - smtpd +#628 inet n - y - - qmqpd +pickup unix n - y 60 1 pickup +cleanup unix n - y - 0 cleanup +rewrite unix - - y - - trivial-rewrite +``` + +### Как Postfix отправляет почту + +``` +incoming trivial-rewrite(8) ┌─ smtp(8) ────► Network + │ ▲ │ + │ │ ├─ lmtp(8) ────► Network + ▼ ▼ │ +active ─────────► qmgr(8) ───────┼─ local(8) ───► File, command + ▲ │ + │ ├─ virtual(8) ─► File + ▼ │ +deferred └─ pipe(8) ────► Command +``` +Как только сообщение достигнет входящей очереди, следующим шагом будет его доставка. На рисунке показаны основные компоненты доставки почты Postfix. Имена, за которыми следует номер, представляют собой команды Postfix или сервисы, а ненумерованные имена представляют очереди Postfix. + +#### qmgr(8) +Менеджер очередей (серверный процесс `qmgr(8)` на рисунке) — это сердце доставки почты Postfix. Он связывается с агентами доставки `smtp(8)`, `lmtp(8)`, `local(8)`, `virtual(8)`, `pipe(8)`, `discard(8)` или `error(8)` и отправляет запрос на доставку одному или нескольким получателям. Агенты доставки `discard(8)` и `error(8)` являются особенными: они отбрасывают или возвращают всю почту и не показаны на рисунке выше. + +Диспетчер очередей поддерживает небольшую активную очередь `active` с сообщениями, которые он открыл для доставки. Активная очередь действует как ограниченное окно для потенциально больших входящих `incoming` или отложенных `deferred` очередей. Ограниченная активная очередь не позволяет диспетчеру очередей исчерпать память при большой нагрузке. + +Диспетчер очередей поддерживает отдельную отложенную очередь `deferred` для почты, которая не может быть доставлена, чтобы большой объем невыполненной почты не замедлял нормальный доступ к очереди. Стратегия администратора очередей в отношении отложенных попыток доставки почты описана в документах [QSHAPE_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/QSHAPE_README) и [TUNING_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/TUNING_README). + +#### trivial-rewrite(8) + +Сервер `trivial-rewrite(8)` разрешает каждый адрес получателя в соответствии с его локальным или удаленным классом адреса, как определено в документе [ADDRESS_CLASS_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/ADDRESS_CLASS_README). Дополнительную информацию о маршрутизации можно указать с помощью дополнительной таблицы `transport(5)`. Сервер `trivial-rewrite(8)` дополнительно запрашивает таблицу `relocated(5)` о получателях, чей адрес изменился; Для таких получателей письмо возвращается отправителю с объяснением. + +#### smtp(8) + +Клиент `smtp(8)` просматривает список почтовых обменников для хоста назначения, сортирует список по предпочтениям и пробует по очереди каждый сервер, пока не найдет сервер, который отвечает. Затем он инкапсулирует отправителя, получателя и содержимое сообщения в соответствии с требованиями протокола SMTP; это включает преобразование 8-битного MIME в 7-битное кодирование. + +#### lmtp(8) + +Клиент `lmtp(8)` использует протокол, аналогичный SMTP, который оптимизирован для доставки на серверы почтовых ящиков, такие как Cyrus. Преимущество этой настройки состоит в том, что одна машина Postfix может обслуживать несколько серверов почтовых ящиков через LMTP. Верно и обратное: один сервер почтовых ящиков может подключаться по LMTP к нескольким машинам Postfix. + +#### local(8) + +Агент доставки `local(8)` понимает почтовые ящики в стиле UNIX, qmail-совместимые файлы maildir, общесистемные базы данных `aliases(5)` в стиле Sendmail и файлы `.forward` для каждого пользователя в стиле Sendmail. Несколько локальных агентов доставки могут работать параллельно, но параллельная доставка одному и тому же пользователю обычно ограничена. + +Агент доставки `local(8)` имеет несолько альтернативных формы локальной доставки. Вы можете настроить его: +- доставлять почту в файлы почтовых ящиков в домашних каталогах пользователей, +- делегировать доставку в почтовый ящик внешней команде, такой как `procmail`, +- делегировать доставку другому агенту доставки Postfix. + +#### virtual(8) + +Агент доставки `virtual(8)` — это простой агент доставки, который доставляет только в файлы почтового ящика в стиле UNIX или в файлы maildir в стиле qmail. Этот агент доставки может доставлять почту для нескольких доменов, что делает его особенно подходящим для размещения множества небольших доменов на одном компьютере. Подробнее описано в документе [VIRTUAL_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/VIRTUAL_README). + +#### pipe(8) + +Почтовая программа `pipe(8)` — это исходящий интерфейс к другим системам обработки почты (входящим интерфейсом является команда Postfix `sendmail(1)`. Интерфейс совместим с UNIX: он предоставляет информацию в командной строке и стандартном потоке ввода, а также ожидает код состояния завершения процесса, определенный в ``. Примеры доставки через почтовую программу `pipe(8)` находятся в документах [MAILDROP_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/MAILDROP_README) и [UUCP_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/UUCP_README). + +Конфигурация сервисов участвующих в отправке почты в файле `master.cf`: +``` +# ========================================================================== +# service type private unpriv chroot wakeup maxproc command + args +# (yes) (yes) (no) (never) (100) +# ========================================================================== +qmgr unix n - n 300 1 qmgr +error unix - - y - - error +discard unix - - y - - discard +rewrite unix - - y - - trivial-rewrite +smtp unix - - y - - smtp +lmtp unix - - y - - lmtp +local unix - n n - - local +virtual unix - n n - - virtual +uucp unix - n n - - pipe + flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) +``` + +Объединённая схема: +``` + trivial-rewrite(8) + ▲ +Network ───► smtpd(8) ──┐ │ + │ ▼ +Network ───► qmqpd(8) ──┼───► cleanup(8) ───► incoming trivial-rewrite(8) ┌─ smtp(8) ────► Network + │ │ ▲ │ +maildrop ──► pickup(8) ─┘ │ │ ├─ lmtp(8) ────► Network + ▲ ▼ ▼ │ + │ active ──────────► qmgr(8) ───────┼─ local(8) ───► File, command +postdrop(1) ▲ │ + ▲ │ ├─ virtual(8) ─► File + │ ▼ │ +sendmail(1) deferred └─ pipe(8) ────► Command + ▲ + │ +Local +``` ## Какое нам дело до классов адресов? @@ -57,7 +197,7 @@ AGENTS = service names ∈ /etc/postfix/master.cf ``` ### 3. virtual alias domain class (виртуальные псевдонимы) -Назначение: хостинговые домены, в которых каждый адрес получателя псевдонимом привязан к учётной записи локальной UNIX-системы или к удаленному адресу. Пример виртуального псевдонима приведен в файле VIRTUAL_README. +Назначение: хостинговые домены, в которых каждый адрес получателя псевдонимом привязан к учётной записи локальной UNIX-системы или к удаленному адресу. Пример виртуального псевдонима приведен в файле [VIRTUAL_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/VIRTUAL_README). Доменные имена перечисляются в virtual_alias_domains. Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_alias_maps. @@ -73,7 +213,7 @@ AGENTS = {} ``` ### 4. relay domain class (адреса доменов-ретранляторов) -Назначение: переадресация почты на удаленные адреса, в которых ваша система указана в качестве основного или резервного MX-хоста. Для обсуждения основных деталей конфигурации см. документ BASIC_CONFIGURATION_README. Обсуждение различий между каноническими доменами, размещенными доменами и другими доменами см. в файле VIRTUAL_README. +Назначение: переадресация почты на удаленные адреса, в которых ваша система указана в качестве основного или резервного MX-хоста. Для обсуждения основных деталей конфигурации см. документ [BASIC_CONFIGURATION_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/BASIC_CONFIGURATION_README). Обсуждение различий между каноническими доменами, размещенными доменами и другими доменами см. в файле [VIRTUAL_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/VIRTUAL_README). Доменные имена перечисляются с помощью параметра relay_domains. @@ -90,7 +230,7 @@ AGENTS = service names ∈ /etc/postfix/master.cf ### 5. default domain class (адреса по умолчанию) -Назначение: пересылка почты в Интернет от имени авторизованных клиентов. Для обсуждения основных деталей конфигурации см. файл BASIC_CONFIGURATION_README. О различиях между каноническими доменами, размещенными доменами и другими доменами см. файл VIRTUAL_README. +Назначение: пересылка почты в Интернет от имени авторизованных клиентов. Для обсуждения основных деталей конфигурации см. файл [BASIC_CONFIGURATION_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/BASIC_CONFIGURATION_README). О различиях между каноническими доменами, размещенными доменами и другими доменами см. файл [VIRTUAL_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/VIRTUAL_README). У этого класса нет таблицы доменов назначения. @@ -106,13 +246,13 @@ AGENTS = service names ∈ /etc/postfix/master.cf ## Типы доменов -Большинство систем Postfix являются конечным пунктом назначения только для нескольких доменных имен. К ним относятся имена хостов и [IP-адреса] машин, на которых работает Postfix, а иногда и родительский домен имени хоста. Эти домены называются каноническими ( `canonical` ) доменами. Обычно они реализуются с помощью класса адресов локального домена Postfix, как определено в файле ADDRESS_CLASS_README. +Большинство систем Postfix являются конечным пунктом назначения только для нескольких доменных имен. К ним относятся имена хостов и [IP-адреса] машин, на которых работает Postfix, а иногда и родительский домен имени хоста. Эти домены называются каноническими ( `canonical` ) доменами. Обычно они реализуются с помощью класса адресов локального домена Postfix, как определено в файле [ADDRESS_CLASS_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/ADDRESS_CLASS_README). Помимо канонических доменов, Postfix может быть настроен на то, чтобы быть конечным адресатом для любого количества дополнительных доменов. Такие домены называются размещенными ( `hosted` ), поскольку они не связаны непосредственно с именем самой машины. Размещенные домены обычно реализуются с помощью класса виртуального псевдонима домена и/или виртуального домена почтовых ящиков. -Но подождите! Это еще не все. Postfix может быть настроен как резервный MX-хост для других доменов. В этом случае Postfix не будет являться резервным хостом MX для этих доменов. Он просто ставит почту в очередь, когда основной MX-хост работает, и пересылает почту, когда основной MX-хост не работает. Эта функция реализуется с помощью класса адресов доменов-ретрансляторов, как определено в файле ADDRESS_CLASS_README. +Но подождите! Это еще не все. Postfix может быть настроен как резервный MX-хост для других доменов. В этом случае Postfix не будет являться резервным хостом MX для этих доменов. Он просто ставит почту в очередь, когда основной MX-хост работает, и пересылает почту, когда основной MX-хост не работает. Эта функция реализуется с помощью класса адресов доменов-ретрансляторов, как определено в файле [ADDRESS_CLASS_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/ADDRESS_CLASS_README). -Наконец, Postfix может быть настроен как транзитный хост для отправки почты через Интернет. Очевидно, что Postfix не является конечным адресатом такой почты. Эта функция доступна только для авторизованных клиентов и/или пользователей и реализуется классом доменных адресов по умолчанию, как определено в параметре ADDRESS_CLASS_README. +Наконец, Postfix может быть настроен как транзитный хост для отправки почты через Интернет. Очевидно, что Postfix не является конечным адресатом такой почты. Эта функция доступна только для авторизованных клиентов и/или пользователей и реализуется классом доменных адресов по умолчанию, как определено в параметре [ADDRESS_CLASS_README](https://github.com/vdukhovni/postfix/blob/master/postfix/README_FILES/ADDRESS_CLASS_README). **Таблица. 1 Сводная таблица классов почтовых адресов** || 1. Локальные почтовые ящики | 2. Виртуальные почтовые ящики | 3. Виртуальные псевдонимы | 4. Адреса доменов-ретранляторов | 5. Класс доменных адресов по умолчанию | @@ -123,6 +263,7 @@ AGENTS = service names ∈ /etc/postfix/master.cf |AGENTS|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf| + # Первая настройка Первые параметры, представляющие интерес, определяют идентификацию и роль машины в сети. Заполним таблицу: @@ -131,14 +272,15 @@ AGENTS = service names ∈ /etc/postfix/master.cf |Вопрос|Ответ|Параметр| |-|-|-| -| Какое доменное имя у машины с Postfix | stud12.myoffice.ru | myhostname | -| Какой домен является родительским | myoffice.ru | mydomain | -| Какие адреса принадлежат доверенной сети от клиентов в которой будут пересылаться письма другим почтовым серверам | 127.0.0.0/8 | mynetworks | -| Какое доменное имя использовать в исходящей почте | stud12.myoffice.ru или myoffice.ru | myorigin = myhostname или mydomain | -| Для каких доменов принимать почту и доставлять локально | stud12.myoffice.ru или myoffice.ru | mydestination = $myhostname localhost.$mydomain localhost | -| С каких клиентов передавать почту | | | -| В какие пункты назначения передавать почту | | | -| Какой метод доставки: прямой или непрямой | прямой | relay or proxy not used? | +| Куда указывает MX запись? | mail.stud12.myoffice.ru | MX запись DNS | +| Какое доменное имя у машины с Postfix? | mail.stud12.myoffice.ru | `myhostname` | +| Какой домен является родительским? | stud12.myoffice.ru | `mydomain` | +| Письма из которой сети будут приниматься без авторизации? | 127.0.0.0/8 | `mynetworks` | +| Какое доменное имя использовать в исходящей почте? | stud12.myoffice.ru | `myorigin` = `myhostname` или `mydomain` | +| Для каких доменов принимать почту и доставлять локально? | stud12.myoffice.ru | `mydestination = $myhostname localhost.$mydomain localhost` | +| С каких клиентов передавать почту? | | | +| В какие пункты назначения передавать почту? | | | +| Какой метод доставки использовать: прямой или непрямой? | прямой | relay or proxy not used? | Параметр `mydomain` задает родительский домен `myhostname`. По умолчанию он получается из `myhostname` путем удаления первой части (за исключением случаев, когда в результате не будет получен домен верхнего уровня ). И наоборот, если вы укажете `mydomain` в файле `main.cf`, то Postfix будет использовать его значение для генерации полностью определенного значения по умолчанию для параметра `myhostname`. @@ -260,6 +402,7 @@ mydestination = myoffice.space $myhostname localhost.$mydomain | Вопрос | Ответ | |-|-| +| 0. Внесена PTR запись на стороне провайдера | _______ | | 1. Внесена MX запись на стороне DNS | _______ | | 2. Настроен SPF на стороне почтового сервера и на стороне DNS | _______ | | 3. Настроен DKIM на стороне почтового сервера и на стороне DNS | _______ | @@ -277,6 +420,7 @@ mydestination = myoffice.space $myhostname localhost.$mydomain Б: Могу без шифрования А: Договорились ``` +Но в настройках вы всё-таки можете запретить обмен по не зашифрованному каналу, указав для `smtpd_tls_security_level` значение `encrypt` вместо `may`. # Dovecot @@ -285,4 +429,5 @@ mydestination = myoffice.space $myhostname localhost.$mydomain Источники: 1. https://habr.com/ru/articles/258279/ -2. https://github.com/vdukhovni/postfix/tree/master/postfix/README_FILES \ No newline at end of file +2. https://github.com/vdukhovni/postfix/tree/master/postfix/README_FILES +3. https://github.com/vdukhovni/postfix \ No newline at end of file