# Почтовая система Postfix + Dovecot Возможные структуры почтовой системы: 1. Postfix, Dovecot имеют доступ к списку пользователей и работают параллельно, разделяя доступ к почтовым ящикам пользователей. 2. Dovecot является «бэкендом» для доступа к почтовым ящикам пользователей. При этом подходе, расположение почтовых ящиков, список пользователей, известен только Dovecot. Далее будет рассмотрен первый вариант. Но в начале следует углубиться в теорию для понимания механизмов работы Postfix. Рассмотрим что такое классы адресов и какие бывают типы доменов. Затем рассмотрим классы адресов с точки зрения менеджмента почтовых ящиков. В конце разберёмся какие проблемы есть у почтовых серверов из-за спама, и как повысить надежность доставки писем вашим почтовым сервером. ## Какое нам дело до классов адресов? Классы адресов опеределяют то, как Postfix принимает решения какие письма принимать и куда их доставлять. Класс адреса определяется тремя вещами: - список доменов, - список действительных адресов получателей, - транспорт доставки по умолчанию. По умолчанию определёны следующие классы: 1. local domain class (локальные почтовые ящики), 2. virtual mailbox domain class (виртуальные почтовые ящики), 3. virtual alias domain class (виртуальные псевдонимы), 4. relay domain class (адреса транзитных smtp серверов), 5. default domain class (адреса по умолчанию). Можно считать, что класс - это правило, применяемое к полю `Кому:` конверта элекронного письма. Правило имеет вид: ``` user@domain -> agent(email), ``` которое применяется, если истинно, что: ``` user ∈ USERS, domain ∈ DOMAINS, agent ∈ AGENTS. ``` Особенности. Для локальных (local domain class) и виртуальных (virtual mailbox class) почтовых ящиков пустое множество в `USER = {}` означает, что проверка пользователей отключена, то есть подходит любое имя пользователя. Для разрешения псевдонимов в адреса в классе virtual alias domain class (виртуальные псевдонимы) агент не используется `AGENTS = {}`. ### 1. local domain class (`domain ∈ mydestination ∪ inet_interfaces ∪ proxy_interfaces`) Адрес попадает в данный класс, если его домен или его ip адрес совпадает с одним из `mydestination`, `inet_interfaces` или `proxy_interfaces`. Класс предназначен для доставки писем до почтовых ящиков пользователей имеющих аккаунты в UNIX системе. Имена `user` определяются параметром `local_recipient_maps`. По умолчанию это `/etc/passwd` и `/etc/aliases`. ``` agent = local USERS = /etc/passwd ∪ /etc/aliases DOMAINS = mydestination ∪ inet_interfaces ∪ proxy_interfaces AGENTS = service names ∈ /etc/postfix/master.cf ``` ### 2. virtual mailbox domain class (`domain ∈ virtual_mailbox_domains`) Адреса почтовых ящиков вида `user@domain` ищутся в одной или нескольких таблицах указанных в параметре `virtual_mailbox_maps`. Доставка до почтовых ящиков пользователей в доменах, чьи пользователи не имеют аккаунтов в UNIX системе. ``` agent = virtual USERS = virtual_mailbox_maps DOMAINS = virtual_mailbox_domains AGENTS = service names ∈ /etc/postfix/master.cf ``` ### 3. virtual alias domain class (виртуальные псевдонимы) Назначение: хостинговые домены, в которых каждый адрес получателя псевдонимом привязан к учётной записи локальной UNIX-системы или к удаленному адресу. Пример виртуального псевдонима приведен в файле VIRTUAL_README. Доменные имена перечисляются в virtual_alias_domains. Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_alias_maps. Действительные адреса получателей перечисляются в параметре virtual_alias_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "Пользователь неизвестен в таблице виртуальных псевдонимов". Для совместимости с Postfix 1.1 по умолчанию используется значение $virtual_maps. Транспортный параметр доставки почты отсутствует. Каждый адрес должен быть псевдонимом для какого-либо другого адреса. ``` agent = USERS = virtual_alias_maps DOMAINS = virtual_alias_domains AGENTS = {} ``` ### 4. relay domain class (адреса доменов-ретранляторов) Назначение: переадресация почты на удаленные адреса, в которых ваша система указана в качестве основного или резервного MX-хоста. Для обсуждения основных деталей конфигурации см. документ BASIC_CONFIGURATION_README. Обсуждение различий между каноническими доменами, размещенными доменами и другими доменами см. в файле VIRTUAL_README. Доменные имена перечисляются с помощью параметра relay_domains. Действительные адреса получателей перечисляются с помощью параметра relay_recipient_maps. SMTP-сервер Postfix отклоняет недействительных получателей с сообщением "User unknown in relay recipient table". Если значение этого параметра пустое, то SMTP-сервер Postfix принимает всех получателей для доменов, перечисленных в параметре relay_domains. Транспорт доставки почты задается параметром relay_transport. По умолчанию используется значение relay, которое является клоном агента доставки smtp(8). ``` agent = relay USERS = relay_recipient_maps DOMAINS = relay_domains AGENTS = service names ∈ /etc/postfix/master.cf ``` ### 5. default domain class (адреса по умолчанию) Назначение: пересылка почты в Интернет от имени авторизованных клиентов. Для обсуждения основных деталей конфигурации см. файл BASIC_CONFIGURATION_README. О различиях между каноническими доменами, размещенными доменами и другими доменами см. файл VIRTUAL_README. У этого класса нет таблицы доменов назначения. Этот класс не имеет таблицы действительных адресов получателей. Транспорт доставки почты задается параметром default_transport. По умолчанию используется значение smtp для доставки с помощью агента доставки smtp(8). ``` agent = smtp USERS = {} DOMAINS = {} AGENTS = service names ∈ /etc/postfix/master.cf ``` ## Типы доменов Большинство систем Postfix являются конечным пунктом назначения только для нескольких доменных имен. К ним относятся имена хостов и [IP-адреса] машин, на которых работает Postfix, а иногда и родительский домен имени хоста. Эти домены называются каноническими ( `canonical` ) доменами. Обычно они реализуются с помощью класса адресов локального домена Postfix, как определено в файле ADDRESS_CLASS_README. Помимо канонических доменов, Postfix может быть настроен на то, чтобы быть конечным адресатом для любого количества дополнительных доменов. Такие домены называются размещенными ( `hosted` ), поскольку они не связаны непосредственно с именем самой машины. Размещенные домены обычно реализуются с помощью класса виртуального псевдонима домена и/или виртуального домена почтовых ящиков. Но подождите! Это еще не все. Postfix может быть настроен как резервный MX-хост для других доменов. В этом случае Postfix не будет являться резервным хостом MX для этих доменов. Он просто ставит почту в очередь, когда основной MX-хост работает, и пересылает почту, когда основной MX-хост не работает. Эта функция реализуется с помощью класса адресов доменов-ретрансляторов, как определено в файле ADDRESS_CLASS_README. Наконец, Postfix может быть настроен как транзитный хост для отправки почты через Интернет. Очевидно, что Postfix не является конечным адресатом такой почты. Эта функция доступна только для авторизованных клиентов и/или пользователей и реализуется классом доменных адресов по умолчанию, как определено в параметре ADDRESS_CLASS_README. **Таблица. 1 Сводная таблица классов почтовых адресов** || 1. Локальные почтовые ящики | 2. Виртуальные почтовые ящики | 3. Виртуальные псевдонимы | 4. Адреса доменов-ретранляторов | 5. Класс доменных адресов по умолчанию | |-|-|-|-|-|-| |agent|local|virtual|доставляются после отображения адресов в 1 или 2|relay|smtp| |USERS|/etc/passwd, /etc/aliases|virtual_mailbox_maps|virtual_alias_maps|relay_recipient_maps|-| |DOMAINS|mydestination, inet_interfaces, proxy_interfaces|virtual_mailbox_domains|virtual_alias_domains|relay_domains|-| |AGENTS|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf|/etc/postfix/master.cf| # Первая настройка Первые параметры, представляющие интерес, определяют идентификацию и роль машины в сети. Заполним таблицу: **Таблица 2. Список вопросов перед настройкой почтового сервера** |Вопрос|Ответ|Параметр| |-|-|-| | Какое доменное имя у машины с 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? | Параметр `mydomain` задает родительский домен `myhostname`. По умолчанию он получается из `myhostname` путем удаления первой части (за исключением случаев, когда в результате не будет получен домен верхнего уровня ). И наоборот, если вы укажете `mydomain` в файле `main.cf`, то Postfix будет использовать его значение для генерации полностью определенного значения по умолчанию для параметра `myhostname`. **Таблица 3. Пример вычисления значений `myhostname`, `mydomain`** |myhostname||mydomain| |-|-|-| | www.stud12.myoffice.space | -> | ? | | stud12.myoffice.space | -> | myoffice.space | | myoffice.space | -> | myoffice.space | | localhost.myoffice.space | <- | myoffice.space | Рекомендуется сопоставить `myhostname` с тем, что есть в PTR-записи, и проверить, что PTR имеет соответствующую A-запись. Параметр `myorigin` задает домен, который отображается в почте, размещенной на этой машине. По умолчанию используется имя локальной машины, `myhostname`, которое по умолчанию равно имени машины. Если только вы не используете действительно небольшой сайт, то, вероятно, следует изменить его на `mydomain`, которое по умолчанию соответствует родительскому домену имени машины. Параметр `mydestination` определяет, на какие домены эта машина будет доставлять локально, а не пересылать на другую машину. По умолчанию принимается почта для самой машины. О том, как настроить Postfix для размещенных доменов, см. файл VIRTUAL_README. (Правда в конфигурационном файле `main.cf.proto` есть комментарий: "Вы ДОЛЖНЫ указать $myhostname в начале текста. Это требование 581 RFC. Самому Postfix безразлично.") ## Пример эволюции конфигурации Postfix - от простого к сложному. ### Несколько доменов в mydestiantion У вас есть почтовый сервер обслуживающий один домен `myoffice.ru`. Стоит ли заводить ещё один почтовый сервер, если количество доменов увеличилось (появился `myoffice.space`)? Совсем не обязательно. Самый простой способ размещения дополнительного домена - это добавить имя домена к доменам, перечисленным в конфигурационном параметре Postfix `mydestination`, и добавить имена пользователей в файл паролей UNIX `/etc/passwd`. При таком подходе не делается различий между каноническими ( `canonical` ) и размещенными ( `hosted` ) доменами. Каждое имя пользователя может получать почту в каждом домене. ``` myhostname = stud12.myoffice.ru mydomain = myoffice.ru mydestination = myoffice.space $myhostname localhost.$mydomain ``` Ограничениями данного подхода являются: * Полное отсутствие разделения: почта для info@stud12.myoffice.ru доставляется на ту же системную учетную запись UNIX, что и почта для info@myoffice.space. * При наличии пользователей в файле паролей UNIX администрирование большого числа пользователей становится неудобным. ### Виртуальные псевдонимы При использовании подхода, описанного в данном разделе, каждый размещаемый домен может иметь свой собственный адрес электронной почты `info@stud12.myoffice.ru` и `info@myoffice.space`. Однако при этом по-прежнему используются системные учетные записи UNIX для доставки локальных почтовых ящиков. При использовании виртуальных доменов-псевдонимов каждый размещаемый адрес привязывается к локальной учетной записи UNIX-системы или к удаленному адресу. Они не обязательно должны ссылаться на системные учетные записи UNIX на вашей машине. В приведенном ниже примере показано, как использовать этот механизм для домена myoffice.space. ``` 1 /etc/postfix/main.cf: 2 virtual_alias_domains = myoffice.space ...other hosted domains... 3 virtual_alias_maps = hash:/etc/postfix/virtual ``` ``` 5 /etc/postfix/virtual: 6 postmaster@myoffice.space postmaster 7 info@myoffice.space joe 8 sales@myoffice.space jane 9 # Uncomment entry below to implement a catch-all address 10 # @myoffice.space jim 11 ...virtual aliases for more domains... ``` Виртуальные псевдонимы решает одну проблему: он позволяет каждому домену иметь свой собственный почтовый адрес. Например это даёт возможность работать с ящиками `info@stud12.myoffice.ru` и `info@myoffice.space` разным пользователям. Но при этом остается один недостаток: каждый виртуальный адрес привязывается к системной учетной записи UNIX. При добавлении большего количества виртуальных адресов увеличивается и количество системных учетных записей UNIX. В следующем разделе эта проблема будет устранена. ### Виртуальные почтовые ящики По мере увеличения числа доменов и пользователей в системе становится все менее целесообразным предоставлять каждому пользователю собственную учетную запись в системе UNIX. С помощью агента доставки Postfix virtual(8) каждый адрес получателя может иметь свой собственный виртуальный почтовый ящик. В отличие от доменов виртуальных псевдонимов, домены виртуальных почтовых ящиков не нуждаются в неуклюжей трансляции из каждого адреса получателя в другой адрес, а владельцам адресов виртуальных почтовых ящиков не нужно иметь системную учетную запись UNIX. Агент доставки виртуальных почтовых ящиков Postfix virtual(8) ищет путь к почтовому ящику пользователя, `uid` и `gid` в отдельных таблицах, которые перебираются вместе с почтовым адресом получателя. Доставка в стиле `Maildir` включается путем завершения имени почтового ящика символом "/". Если идея нескольких таблиц покажется вам неудобной, помните, что вы можете перенести информацию (после того как она заработает) в базу данных SQL. Если вы пойдете по этому пути, обязательно ознакомьтесь с разделом "local files versus databases" в верхней части документа VIRTUAL_README. Пример конфигурации: ``` 1 /etc/postfix/main.cf: 2 virtual_mailbox_domains = myoffice.space ...more domains... 3 virtual_mailbox_base = /var/mail/vhosts 4 virtual_mailbox_maps = hash:/etc/postfix/vmailbox 5 virtual_minimum_uid = 100 6 virtual_uid_maps = static:5000 7 virtual_gid_maps = static:5000 8 virtual_alias_maps = hash:/etc/postfix/virtual ``` ``` 10 /etc/postfix/vmailbox: 11 info@myoffice.space myoffice.space/info 12 sales@myoffice.space myoffice.space/sales/ 13 # Comment out the entry below to implement a catch-all. 14 # @myoffice.space myoffice.space/catchall 15 ...virtual mailboxes for more domains... ``` ``` 17 /etc/postfix/virtual: 18 postmaster@myoffice.space postmaster ``` * Строка 2: Параметр virtual_mailbox_domains указывает Postfix, что myoffice.space является так называемым виртуальным почтовым доменом. Если опустить эту настройку, то Postfix будет отклонять почту (relay access denied) или не сможет ее доставить (почта для myoffice.space зацикливается на себе). НИКОГДА не указывайте виртуальное доменное имя MAILBOX в качестве домена mydestination!\ НИКОГДА не указывайте имя виртуального домена MAILBOX в качестве виртуального домена ALIAS! * Строка 3: Параметр virtual_mailbox_base задает префикс для всех имен путей виртуальных почтовых ящиков. Это защитный механизм на случай ошибки. Он предотвращает доставку почты по всей файловой системе. * Строки 4, 10-15: Параметр virtual_mailbox_maps задает таблицу поиска с именами почтовых ящиков (или maildir), индексированных по виртуальному почтовому адресу. В данном примере почта для info@myoffice.space отправляется в почтовый ящик по адресу /var/mail/vhosts/myoffice.space/info, а почта для sales@myoffice.space - в maildir, расположенный по адресу /var/mail/vhosts/myoffice.space/sales/. * Строка 5: virtual_minimum_uid задает нижнюю границу UID владельца почтового ящика или maildir. Это защитный механизм на случай ошибки. Он предотвращает запись почты в чувствительные файлы. * Строки 6, 7: Параметры virtual_uid_maps и virtual_gid_maps указывают, что все виртуальные почтовые ящики принадлежат фиксированным uid и gid 5000. Если это не то, что нужно, укажите таблицы поиска, которые ищут по почтовому адресу получателя. * Строка 14: Закомментированная запись (текст после #) показывает, как можно реализовать универсальный адрес виртуального почтового ящика. Будьте готовы к получению большого количества спама, а также отбитого спама, отправленного от имени anything@myoffice.space. НИКОГДА не помещайте виртуальный MAILBOX wild-card в виртуальный файл ALIAS!!! * Строки 8, 17, 18: Как видите, можно смешивать виртуальные псевдонимы с виртуальными почтовыми ящиками. Мы используем эту возможность для перенаправления почты для адреса postmaster сайта myoffice.space на локальный адрес postmaster. Аналогичный механизм можно использовать и для перенаправления адреса на удаленный адрес. * Строка 18: В данном примере предполагается, что в файле main.cf под параметром mydestination указан $myorigin. Если это не так, укажите явное доменное имя в правой части записей таблицы виртуальных псевдонимов, иначе почта будет отправляться не на тот домен. # Как увеличить вероятность доставки почты с вашего почтового сервера? ## Чеклист | Вопрос | Ответ | |-|-| | 1. Внесена MX запись на стороне DNS | _______ | | 2. Настроен SPF на стороне почтового сервера и на стороне DNS | _______ | | 3. Настроен DKIM на стороне почтового сервера и на стороне DNS | _______ | | 4. Настроен DMARC на стороне почтового сервера и на стороне DNS | _______| | 5. Настроен обмен сообщениями по TLS с другими серверами | _______ | | 6. Получен и настроен сертификат домена от центра сертификации | _______| Рекомендуется использовать TLS и избегать STARTTLS. Анекдот про то, как выбирается протокол шифрования в STARTTLS: ``` А: Давай по SSL 2.0. Б: Могу только по SSL 3.0. А: Тогда предлагаю по TLS 1.0. Б: У меня TLS 1.1. А: А TSL 1.2 нет? Б: Могу без шифрования А: Договорились ``` # Dovecot Для безопасного подключения клиентов к своим почтовым ящикам по сети требуется сервер, который обеспечивает авторизацию пользователя, установку безопасного соединения. Как администратор вы можете организовать подключение по `ssh`, но это очень не удобно, особенно с мобильных устройств. Удобнее использовать графический почтовый клиент общающийся по протоколу POP3 или IMAP. Одной из широко распространённых открытых реализаций является сервера для общения с почтовыми клиентами является Dovecot. Источники: 1. https://habr.com/ru/articles/258279/ 2. https://github.com/vdukhovni/postfix/tree/master/postfix/README_FILES