updates to lection 04

main
Vladimir Protsenko 12 months ago
parent 5107ece134
commit 5fb74e3f10

@ -1,10 +1,150 @@
# Почтовая система Postfix + Dovecot # Почтовая система Postfix + Dovecot
Возможные структуры почтовой системы: Рассматрим структуру почтовой системы, в которой Postfix и Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей.
1. Postfix, Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей.
2. Dovecot является «бэкендом» для доступа к почтовым ящикам пользователей. При этом подходе, расположение почтовых ящиков, список пользователей, известен только 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: он предоставляет информацию в командной строке и стандартном потоке ввода, а также ожидает код состояния завершения процесса, определенный в `<sysexits.h>`. Примеры доставки через почтовую программу `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 (виртуальные псевдонимы) ### 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. Доменные имена перечисляются в virtual_alias_domains. Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_alias_maps.
@ -73,7 +213,7 @@ AGENTS = {}
``` ```
### 4. relay domain class (адреса доменов-ретранляторов) ### 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. Доменные имена перечисляются с помощью параметра relay_domains.
@ -90,7 +230,7 @@ AGENTS = service names ∈ /etc/postfix/master.cf
### 5. default domain class (адреса по умолчанию) ### 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 может быть настроен на то, чтобы быть конечным адресатом для любого количества дополнительных доменов. Такие домены называются размещенными ( `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 Сводная таблица классов почтовых адресов**
|| 1. Локальные почтовые ящики | 2. Виртуальные почтовые ящики | 3. Виртуальные псевдонимы | 4. Адреса доменов-ретранляторов | 5. Класс доменных адресов по умолчанию | || 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| |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 | | Куда указывает MX запись? | mail.stud12.myoffice.ru | MX запись DNS |
| Какой домен является родительским | myoffice.ru | mydomain | | Какое доменное имя у машины с Postfix? | mail.stud12.myoffice.ru | `myhostname` |
| Какие адреса принадлежат доверенной сети от клиентов в которой будут пересылаться письма другим почтовым серверам | 127.0.0.0/8 | mynetworks | | Какой домен является родительским? | stud12.myoffice.ru | `mydomain` |
| Какое доменное имя использовать в исходящей почте | stud12.myoffice.ru или myoffice.ru | myorigin = myhostname или mydomain | | Письма из которой сети будут приниматься без авторизации? | 127.0.0.0/8 | `mynetworks` |
| Для каких доменов принимать почту и доставлять локально | stud12.myoffice.ru или myoffice.ru | mydestination = $myhostname localhost.$mydomain localhost | | Какое доменное имя использовать в исходящей почте? | stud12.myoffice.ru | `myorigin` = `myhostname` или `mydomain` |
| С каких клиентов передавать почту | | | | Для каких доменов принимать почту и доставлять локально? | stud12.myoffice.ru | `mydestination = $myhostname localhost.$mydomain localhost` |
| В какие пункты назначения передавать почту | | | | С каких клиентов передавать почту? | | |
| Какой метод доставки: прямой или непрямой | прямой | relay or proxy not used? | | В какие пункты назначения передавать почту? | | |
| Какой метод доставки использовать: прямой или непрямой? | прямой | relay or proxy not used? |
Параметр `mydomain` задает родительский домен `myhostname`. По умолчанию он получается из `myhostname` путем удаления первой части (за исключением случаев, когда в результате не будет получен домен верхнего уровня ). И наоборот, если вы укажете `mydomain` в файле `main.cf`, то Postfix будет использовать его значение для генерации полностью определенного значения по умолчанию для параметра `myhostname`. Параметр `mydomain` задает родительский домен `myhostname`. По умолчанию он получается из `myhostname` путем удаления первой части (за исключением случаев, когда в результате не будет получен домен верхнего уровня ). И наоборот, если вы укажете `mydomain` в файле `main.cf`, то Postfix будет использовать его значение для генерации полностью определенного значения по умолчанию для параметра `myhostname`.
@ -260,6 +402,7 @@ mydestination = myoffice.space $myhostname localhost.$mydomain
| Вопрос | Ответ | | Вопрос | Ответ |
|-|-| |-|-|
| 0. Внесена PTR запись на стороне провайдера | _______ |
| 1. Внесена MX запись на стороне DNS | _______ | | 1. Внесена MX запись на стороне DNS | _______ |
| 2. Настроен SPF на стороне почтового сервера и на стороне DNS | _______ | | 2. Настроен SPF на стороне почтового сервера и на стороне DNS | _______ |
| 3. Настроен DKIM на стороне почтового сервера и на стороне DNS | _______ | | 3. Настроен DKIM на стороне почтового сервера и на стороне DNS | _______ |
@ -277,6 +420,7 @@ mydestination = myoffice.space $myhostname localhost.$mydomain
Б: Могу без шифрования Б: Могу без шифрования
А: Договорились А: Договорились
``` ```
Но в настройках вы всё-таки можете запретить обмен по не зашифрованному каналу, указав для `smtpd_tls_security_level` значение `encrypt` вместо `may`.
# Dovecot # Dovecot
@ -285,4 +429,5 @@ mydestination = myoffice.space $myhostname localhost.$mydomain
Источники: Источники:
1. https://habr.com/ru/articles/258279/ 1. https://habr.com/ru/articles/258279/
2. https://github.com/vdukhovni/postfix/tree/master/postfix/README_FILES 2. https://github.com/vdukhovni/postfix/tree/master/postfix/README_FILES
3. https://github.com/vdukhovni/postfix
Loading…
Cancel
Save