Настройка почтового сервера Postfix+Dovecot+MySQL

Введение

В данной статье будет рассказано про настройку почтового сервера с использованием Postfix + Dovecot + MySQL. Материал не претендует на абсолютную уникальность, т.к. по сути является собранным с разных источников. Тем не менее, в рунете очень мало статей с пояснением многих важных параметрови общим планом по выполнению работ. Просто скопипастить конфиг и сказать, что вот делайте так и будет работать – не наш метод. Интереснее разобраться и понять, как всё должно работать, хоть почитать тот же RFC. Но без фанатизма и лишних пояснений очевидных основ.

Буду стараться излагать материал с достаточным уровнем теории, но без излишеств. В любом случае, тема сложная и с первого раза разобраться и настроить ничего не получится, поэтому так или иначе придётся дополнительно почитать материалы для глубокого понимания. С данной же статьей начинать должно быть немного проще.

Любая конструктивная критика только приветствуется.

Подготовительный этап. Настройки ОС и записи домена

Все действия будут проводиться на Centos 7.6. Ваш сетевой экран должен быть настроен, чтобы пропускать трафик (порты 25, 143, 587, 80, 443).

Физический путь для хранения писем – /var/vmail

FQDN в /etc/hosts:

80.87.197.183 mail.rmn-lux.ru  mail

hostname сервера:

mail.rmn-lux.ru

Для корректной работы нужен домен и прописанные соответствующие записи к нему:

  • rmn-lux.ru – основной домен, у которого MX-запись имеет значение mail.rmn-lux.ru;
  • mail.rmn-lux – созданный поддомен, А-запись которого указывает на IP-адрес сервера, где будет располагаться почта;
  • 183.197.87.80.in-addr.arpa. – обратная PTR запись для поддомена mail.rmn-lux . Прописать такую запись нужно просить того, кто выдает IP-адрес. Обычно хостинг-провайдер.

Теория “в двух словах”. Как работает почта

На эту тему много статей, но для общей картины опишу процесс прохождения письма.

Для отправки потребуется работать как минимум с двумя известными протоколами: SMTP и IMAP. Условно говоря, первый отвечает за отправку почты, второй – за управление и доступ к почте на сервере. Есть ещё POP3, но он не так популярен и о нём речь не идёт.

Mail User Agent (MUA), которым может быть любая почтовая программа или веб-интерйес с адреса test1@example.com отправляет почту на адрес test2@rmn-lux.ru. Для начала письмо улетает на почтовый сервер клиента example.com (расположение которого берётся из MX-записи), который выступает в роли Mail Transfer Agent (MTA) и является почтовым релеем. Этот релей по адресу получателя определяет его сервер и отправляет ему письмо на mail.rmn-lux.ru (прописан в MX), который также является MTA. Передача письма происходит посредством SMTP. После того, как письмо оказалось на целевом сервере, MTA отправляет письмо далее уже для Mail Delivery Agent (MDA), который работает, например, локально и принимает письмо. MTA и MDA могут быть частью одной программы или разными. Для примера – Postfix (MTA) и Dovecot (MDA). После того, как MDA получателя положил письмо в почтовый ящик, MUA получателя (используя учётку test2@rmn-lux.ru и протокол IMAP) увидит новоё письмо.

Теория “в двух словах”. Схема настройки

Для настройки почтового сервера нам понадобится: Postfix, Dovecot, MySQL + ещё несколько пакетов, о которых расскажу далее.

Для удобства управления, есть всякого рода веб-интерфейсы доступа к почте (roundcube), веб-интерфейс управления пользователями (postfixadmin), веб-интерфейс управления СУДБ (phpmyadmin). Первоначально настройка будет выполнена без всего этого, чтобы не запутаться.

Итак, postfix – MTA для отправки почты (SMTP), dovecot – MDA для хранения и доступа к письмам (IMAP), MySQL – для хранения учетных записей виртуальных пользователей почты и вирутальных доменов.

Алгоритм настройки базового сервера следующий. Реализация может быть разная, но идея и общая логика – одинакова плюс-минус.

  • После установки базовых пакетов для Centos, потребуется получить TLS-сертификат для дальнейшей настройки, чтобы не отвлекаться потом, лучше сразу описать этот момент, поэтому нужен будет пакет certbot для генерации сертификата Let`s Encrypt.
  • Создать базу в MySQL, создать в ней таблицы и наполнить данными о доменах и пользователях, создать учётки для доступа;
  • Дефолтный конфиг Postfix оставить пока без изменений, за исключением того, что указать брать данные о доменах и пользователях из БД;
  • Настроить Dovecot (здесь несколько этапов);
  • Настроить LMTP;
  • Настроить релей в Postfix;
  • Проверить работу почтового сервера.

В результате выполнения настройки всех параметров из списка выше, будет почтовый сервер сможет минимально выполнять свои функции: отправлять и принимать почту. Дальнейшая настройка будет описана в следующей статье, а это:

  • защита сервера от спама: настройки postfix, rspamd;
  • настройка веб-интерфейса roundcube;
  • настройка DKIM и SPF;
  • настройка веб-интерфейса postfixadmin.

Итак, с теорией закончили, пора приступать!

Установка необходимого ПО

yum install postfix dovecot php-imap mysql-community-server dovecot-mysql httpd

TLS Let`s Encrypt

Сертификат будет использоваться в трех местах:

  •     веб-интерфейс почты (управляемый Apache или nginx);
  •     Postfix (для аутентификации во время SMTP-сессии с пользователями);
  •     Dovecot (для аутентификации во время обмена данными IMAP).

Начнём с апача. Для начала надо дополнительно установить модуль апача для работы с TLS, а также сам certbot:

yum install mod_ssl httpd certbot

После установки создать директорию /var/www/mail.rmn-lux.ru и поместить туда index.html с любым содержимым.

А далее прописать конфиг для виртуального хоста в файле /etc/httpd/conf.d/mail.rmn-lux.ru.conf (conf.d должен быть подключен через include в основном конфиге):

<VirtualHost *:80>
  ServerName mail.rmn-lux.ru
  DocumentRoot /var/www/mail.rmn-lux.ru
 <Directory /var/www/mail.rmn-lux.ru>
 Options FollowSymLinks
 AllowOverride All
 Require all granted
 </Directory>
 ErrorLog /var/www/mail.rmn-lux.ru/error.log
 CustomLog /var/www/mail.rmn-lux.ru/access.log common
</VirtualHost>

Я настроил логирование, чтобы можно было отладить на случай ошибок. После выполнить проверку конфига и перезапустить апач:

httpd -t && systemctl restart httpd

Далее запустить certbot для генерации сертификата для домена:

certbot certonly --webroot --webroot-path /var/www/mail.rmn-lux.ru -d mail.rmn-lux.ru

После ввода почты и завершения выполнения, появится сертификат в директории /etc/letsencrypt/live/mail.rmn-lux.ru/fullchain.pem

Осталось настроить апач для работы с TLS (просто дописать в уже имеющийся конфиг с HTTP):

<VirtualHost *:443>
 ServerName mail.rmn-lux.ru
 DocumentRoot /var/www/mail.rmn-lux.ru
 LoadModule ssl_module /usr/lib64/httpd/mod_ssl.so
 SSLEngine on
 SSLCertificateFile /etc/letsencrypt/live/mail.rmn-lux.ru/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/mail.rmn-lux.ru/privkey.pem
</VirtualHost>
httpd -t && systemctl restart httpd

Так как апач установлен на том же сервере, где и всё остальное, то проверить работу сертификата можно в браузере: https://mail.rmn-lux.ru/

Теперь надо настроить автообновление сертификатов. certbot позволяет делать это автоматически по крону, для этого нужно лишь написать маленький скрипт, который будет перезагружать все сервисы, которые используют сертификат, чтобы был виден новый после обновления. Для этого создать файл по пути (можно указать любой) /usr/local/bin/certbot-post-hook и сделать его исполняемым :

#!/bin/sh
systemctl restart postfix 2>/dev/null
systemctl restart dovecot 2>/dev/null
systemctl restart httpd 2>/dev/null

chmod +x /usr/local/bin/certbot-post-hook

А далее на крон поставить команду по обновлению с ключом quiet (-q):

0 */12 * * * root certbot renew -q --deploy-hook /usr/local/bin/certbot-post-hook

Сертификат будет проверяться два раза в день и обновляться автоматически.

MySQL: создание БД и пользователей

Внимание! Если в последующем будут какие-либо непонятные ошибки, например, “Unknown database driver ‘mysql’”, то проверьте: все ли нужные пакеты были установлены.

Условимся, что MySQL уже установлен и есть root-доступ. Надо создать базу и учётки:

create database postfix character set UTF8mb4 collate utf8mb4_bin
create user 'postfix'@'127.0.0.1' identified by 'Postfix123!';
create user 'admin'@'127.0.0.1' identified by 'Qwerty123!';

Далее права для admin:

grant all on postfix.* to 'admin'@'127.0.0.1' ;

И юзера postfix:

grant select on postfix.* to 'postfix'@'127.0.0.1';

Теперь три таблицы, назначение которых поясню далее:

  • virtual_domains
  • virtual_users
  • virtual_aliases
use postfix;

CREATE TABLE IF NOT EXISTS `virtual_domains` (
 `id` int(11) NOT NULL auto_increment,
 `name` varchar(50) NOT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `virtual_users` (
 `id` int(11) NOT NULL auto_increment,
 `domain_id` int(11) NOT NULL,
 `email` varchar(100) NOT NULL,
 `password` varchar(150) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `email` (`email`),
 FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `virtual_aliases` (
 `id` int(11) NOT NULL auto_increment,
 `domain_id` int(11) NOT NULL,
 `source` varchar(100) NOT NULL,
 `destination` varchar(100) NOT NULL,
 PRIMARY KEY (`id`),
 FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Виртуальные пользователи, домены и алиасы в Postfix

Вся конфигурация может храниться в файлах, но для удобства управления и хранения будет использоваться СУБД.

База и пустые таблицы были созданы, теперь снова необходимо внести ясность по теоретическим моментам директив в конфиге Postfix, для которых нужен MySQL.

Домен виртуального почтового ящика используется для получения электронной почты и прописывается в директиве:

virtual_mailbox_domains = rmn-lux.ru

Виртуальные пользователи создаются на основе одной учетной записи в ОС. Если бы все почтовые пользователи имели отдельную учетку в системе, то для ящиков, которые физически располагаются на диске, были бы везде разные права (UID и GID). Поэтому используется одна системная учётка, на основе которой создаются и имеют доступ к ящикам виртуальные пользователи. За UID и GID отвечают следующие параметры (число можно сменить на любое доступное в рамках ОС):

virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

Сами виртуальные пользователи и физ. пути к почтовому ящику определяются в директиве, где указывается место и тип хранения (в примере ниже – файл):

virtual_mailbox_maps = /etc/postfix/virtual_mailbox_users

Ниже схема сопоставления левой части относительно правой, называемая маппингом (mapping) и используется во многих директивах Postfix:

Виртуальный пользовательПуть до ящика вирт. пользователя
test1@example.org/var/vmail/example.org/test1/Maildir

То есть Postfix, например, при запросе данных получает информацию из /etc/postfix/virtual_mailbox_users, где смотрит поле Виртуальный пользователь , а потом сопоставляет его с полем Путь до ящика вирт. пользователя и использует эту таблицу для поиска имени для каждого получателя или пути до ящика.

Алиасы можно применять, например, для создания списка рассылок, используя конструкцию virtual_alias_maps и путь до файла . Формат аналогичен предыдущим описанным директивам: файл, в котором слева используется адрес в роли алиаса, а справа – адреса, куда нужно пересылать почту.

it@example.org   john@example.org,bob@example.com

При использовании алиаса из примера выше, будет создана рассылка с адресом it@example.com и при отправке на этот адрес письма, оно улетит к john и bob в домене example.com. Вроде бы всё просто и понятно.

Один нюанс: есть такой алиас catch-all или универсальный алиас, где в файле указывается так:

@example.org   john@example.org

В таком случае алиас будет принимать электронную почту для любого пользователя в домене example.org и пересылать его на john@example.com. Такой вариант нежелателен тем, что спамеры могут узнать этот адрес и будут рассылать нехорошие письма на всех почтовых пользователей. При всей возможности, лучше такие алиасы не использовать.

В моём случае, я просто создал пустую таблицу, но алиасы использовать не буду.

Конфигурационные файлы для связи с БД

Информация о виртуальных доменах, алиасах и пользователях как раз и будет храниться в MySQL, в которой уже есть созданные для этого таблицы.

Я создал директорию для отдельного хранения конфигов, связанных с БД.

mkdir /etc/postfix/mysql ; cd /etc/postfix/mysql

virtual_domains:

vim mysql-virt-mbox-domains.cf:

user = postfix
password = Postfix123!
hosts = 127.0.0.1
dbname = postfix
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Допустим, Postfix получил письмо для admin@rmn-lux.ru и хочет узнать, является ли rmn-lux.ru виртуальным доменом почтового ящика. А для этого будет выполнен SQL-запрос, описанный выше, где вместо %s будет подставлен домен rmn-lux.ru и при совпадении запрос вернет 1.

Для активации, достаточно выполнить команду ниже, которая добавит путь к созданному файлу в конфиг main.cf и выполнит релоад сервиса:

postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql/mysql-virt-mbox-domains.cf

virtual_mailbox_maps:

Далее настраиваются и подключаются virtual_mailbox_maps, где сопоставляется адрес эл. почты с физическим местоположением ящика. Так как будет использоваться dovecot, то интересовать на этом этапе будет только часть слева (адрес почты), а правая сторона (физ. путь) будет игнорироваться. Postfix просто будет проверять, является ли адрес почты слева действительным.

vim /etc/postfix/mysql/mysql-virt-mbox-maps.cf:

user = postfix
password = Postfix123!
hosts = 127.0.0.1
dbname = postfix
query = SELECT 1 FROM virtual_users WHERE email='%s'

Применение:

postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql/mysql-virt-mbox-maps.cf

И проверка запроса:

postmap -q root@rmn-lux.ru mysql:/etc/postfix/mysql/mysql-virt-mbox-maps.cf

virtual_alias_maps:

vim /etc/postfix/mysql/mysql-virt-alias-maps.cf:

user = postfix
password = Postfix123!
hosts = 127.0.0.1
dbname = postfix
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Применение:

postconf virtual_alias_maps=mysql:/etc/postfix/mysql/mysql-virt-alias-maps.cf

И проверка:

postmap -q qq@qq.ru mysql:/etc/postfix/mysql/mysql-virt-alias-maps.cf

Реализация возможности отправки письма самому себе:

/etc/postfix/mysql/email2email.cf:

user = postfix
password = Postfix123!
hosts = 127.0.0.1
dbname = postfix
query = SELECT email FROM virtual_users WHERE email='%s'

Применение (добавление к уже существующему):

postconf virtual_alias_maps=mysql:/etc/postfix/mysql/mysql-virt-alias-maps.cf,mysql:/etc/postfix/mysql/email2email.cf

Проверки будут выдавать пустые строки, т.к. таблицы всё ещё пустые, но главное проверить, чтобы не возникало ошибок при выполнении запросов.

Заполнение созданных таблиц тестовыми данными

В первую таблицу virtual_domains надо добавить основной домен и его ID:

INSERT INTO postfix.virtual_domains (id,name) VALUES ('1','rmn-lux.ru');

Во вторую таблицу virtual_users добавить пользователей. Для генерации пароля удобно использовать команду dovecot:

dovecot pw -s SHA256-CRYPT

Набрать пароль и полученный результат (с подмешиванием соли) записать в таблицу:

INSERT INTO postfix.virtual_users (id,domain_id,password,email)
 VALUES ('1', '1', '{SHA256-CRYPT}$5$2QWXiA19hQw/7kvM$5kvAnv9b25AsKir/Zbr69/lifTeWoRu01hETpxGFba8', 'rooty@rmn-lux.ru');

Настройка Dovecot

Теперь можно переходить к настройке Dovecot, а к Postfix надо будет вернуться чуть позже.

Сейчас надо создать группу и юзера для работы с виртуальными почтовыми ящиками (убедиться, что UID&GID уникальны в рамках используемой ОС):

groupadd -g 4000 vmail && useradd -g vmail -u 4000 vmail -d /var/vmail -m
chown -R vmail. /var/vmail

Далее в конец файла /etc/dovecot/conf.d/10-auth.conf внести изменения:

#!include auth-deny.conf.ext
#!include auth-master.conf.ext
#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

Это сделано для того, чтобы при авторизации пользователей в качестве бэкенда был использован MySQL.

В файле /etc/dovecot/conf.d/auth-sql.conf.ext секцию userdb заменить на:

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

%d означает домен, %n – юзера. Например, путь будет такой: /var/vmail/rmn-lux.ru/admin

В файле /etc/dovecot/conf.d/10-mail.conf прописать значение директиве mail_location (по умолчанию она закоменчена и значения не имеет):

mail_location = maildir:/var/vmail/%d/%n/Maildir

Это каталог, в котором Dovecot будет искать электронные письма конкретного пользователя.

Просто к сведению. В данном же файле есть namespace inbox, который определяет структуру и иерархию директорий для почтовых клиентов, которые используют протокол IMAP (POP3 тоже, но его в настройке не используем).

В файле /etc/dovecot/conf.d/10-master.conf настраиваются службы, например, IMAP или POP3, а также порты, на которых они будут слушать. Дефолтные настройки в основном тут не меняются, кроме поля service auth:

service auth {
...
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
  mode = 0660
  user = postfix
  group = postfix
}
...

В CentOS 7 Postifx не работает в chroot, в случае необходимости нужно иметь это ввиду и настроить в/etc/postfix/master.cf, т.к. в некоторых мануалах рассказывается именно про настройку Postfix, который крутится в chroot.

/etc/dovecot/conf.d/15-mailboxes.conf

Просто к сведению. В данном файле настраивается отображение списка элементов меню после подключения по IMAP к почтовому ящику, такие элементы как: спам, корзина, входящие и т.д. Я данный файл не менял и оставил всё по дефолту.

/etc/dovecot/conf.d/10-ssl.conf

Сюда прописывается путь до ключа и сертификата, которые были получены ранее через Let`s Encrypt:

ssl_cert = </etc/letsencrypt/live/mail.rmn-lux.ru/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.rmn-lux.ru/privkey.pem

ssl = yes

Осталось создать файл /etc/dovecot/dovecot-sql.conf.ext, на который ссылается другой файл /etc/dovecot/conf.d/auth-sql.conf.ext в секции passdb. Содержимое нового файла такое:

driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=Postfix123!
default_pass_scheme = SHA256-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Права:

chown root. /etc/dovecot/dovecot-sql.conf.ext && chmod 0600 /etc/dovecot/dovecot-sql.conf.ext
systemctl restart dovecot

LMTP

Это сервис для отправки данных из Postfix в Dovecot, настраивается в уже знакомом файле /etc/dovecot/conf.d/10-master.conf:

service lmtp {

unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }

}
systemctl restart dovecot

После прописать в конфиге Postfix, чтобы он использовал unix-сокет lmtp:

postconf virtual_transport=lmtp:unix:private/dovecot-lmtp

/etc/dovecot/conf.d/10-log.conf

log_path = /var/log/dovecot/main.log
info_log_path = /var/log/dovecot/info.log
debug_log_path = /var/log/dovecot/debug.log
auth_verbose = yes
mkdir /var/log/dovecot && chown -R dovecot. /var/log/dovecot

Проверить всё по логам в случае возникновения проблем.

После того, как все конфиги прописаны, сервисы запущены, можно подключиться IMAP-клиентом, например, mutt и проверить, как работает то, что настроили.

Формат подключения здесь простой: имя почтового пользователя вида rooty@rmn-lux.ru и сам почтовый сервак mail.rmn-lux.ru:

mutt -f imaps://rooty@rmn-lux.ru@mail.rmn-lux.ru

После ввода пароля, откроется окно входящих сообщений (само собой пустое):

Маленькая победа! IMAP работает. На созданную учётку rooty@rmn-lux.ru можно отправить письмо для проверки:

echo "Test" | sendmail rooty@rmn-lux.ru

Настройка релея и возможности отправки почты.

Теперь письма можно отправить пользователям в домене @rmn-lux.ru, а также, используя почтовый клиент, по IMAP подключиться и просмотреть входящую почту. Осталось дать почтовым клиентам возможность также отправлять письма. Для этого требуется настройка ретрансляции или просто релея.

Когда кто-то отправляет письмо на rooty@rmn-lux.ru, другой почтовый сервер по SMTP отправляет это письмо на наш сервер, который определяет, что он отвечает за почту в домене rmn-lux.ru. И после этого можно уже подключиться по IMAP и просмотреть письмо.

Когда же ситуация наоборот, т.е. rooty@rmn-lux.ru хочет отправить письмо на какой-то адрес, например test@example.com, то наш почтовый сервер видит, что example.com обслуживается другим сервером и потому перенаправит почту далее. Но тут один нюанс: любой может представиться rooty@rmn-lux.ru и отправлять спам на разные адреса через наш сервер.

Поэтому всегда нужно использовать аутентификацию SMTP для защиты. То есть перед отправкой письма с rooty@rmn-lux.ru на test@example.com Postfix проверит логин\пароль rooty в базе MySQL через Dovecot, и если его логин\пароль верный, то Postfix отправит письмо далее по назначению до адресата. В такой ситуации, когда уже применяется аутентификация, используется доработанный протокол ESMTP, если углубиться в детали. Для общего развития нужно просто хотя бы знать об этом.

Dovecot уже настроен для аутентификации пользователей, поэтому нужно сказать Postfix, чтобы он проверял логин\пароль через Dovecot:

postconf smtpd_sasl_type=dovecot
postconf smtpd_sasl_path=private/auth
postconf smtpd_sasl_auth_enable=yes

Это включает SMTP-аутентификацию и сообщает Postfix, что он может общаться с Dovecot через файл сокета, расположенный в /var/spool/postfix/private/auth. Данная настройка была сделана ранее в файле /etc/dovecot/conf.d/10-master.conf.

На данном этапе почта может быть отправлена на любой другой домен в интернете. Но не факт, что дойдет, т.е. SMTP до сих пор без шифрования. Надо это исправить в Postfix:

postconf smtpd_tls_security_level=may 
postconf smtpd_tls_auth_only=yes
postconf smtpd_tls_cert_file=/etc/letsencrypt/live/mail.rmn-lux.ru/fullchain.pem 
postconf smtpd_tls_key_file=/etc/letsencrypt/live/mail.rmn-lux.ru/privkey.pem 
postconf smtp_tls_security_level=may

По параметрам всё понятно: используем TLS, прописываем сертификат и ключ. Выставлены значения “may” для того, чтобы была совместимость: в мире до сих пор есть почтовые сервера, которые не работают с шифрованием и почта доставлена\отправлена не будет. Поэтому так будет корректнее. А чтобы не переживать за то, что логины\пароли пользователей будут раскрыты, т.к. есть возможность установки незашифрованного соединения, используется smtpd_tls_auth_only со значением “yes”.

Теперь по всем защищённым портам почта ходит в обе стороны и всё хорошо.

Опционально есть ещё один момент. The submission port. Сейчас сервер настроен для работы по 25 порту через TLS, а не через 465. Согласно RFC 4409, TCP-порт 587 должен использоваться для отправки почты от пользователя до сервера (Mailt Submission Agent), а TCP-порт 25 для отправки почты от сервера к серверу. Где-то 587 порт прописан по-умолчанию без возможности изменения, поэтому лучше делать всё универсально и согласно стандартам. В файл /etc/postfix/main.cf (обратите внимание на пробелы в начале, лучше скопировать целиком):

submission inet n - - - - smtpd
 -o syslog_name=postfix/submission
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o smtpd_sasl_security_options=noanonymous
 -o smtpd_sender_login_maps=mysql:/etc/postfix/mysql/email2email.cf
 -o smtpd_sender_restrictions=reject_sender_login_mismatch
 -o smtpd_sasl_local_domain=$myhostname
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

После выполнения всех настроек, надо не забыть снизить уровень логирования и отключить всё лишнее, что использовалось для дебага.

Настройка почтового клиента Thunderbird

На примере почтового клиента Thunderbird, я вписал следующие настройки для работы с программой (которые подхватились автоматически при вводе логина и пароля) и всё успешно завелось. Письма приходят и уходят.

Выполнив все действия из выше описанных пунктов, был настроен простой незащищённый почтовый сервер.

На специальном сервисе по комлексной проверке правильности настройки почтового сервера уже можно провериться. Нужно отправить письмо на предлагаемый адрес и запустить проверку, после чего будет результат вида:

Уже не плохо, но есть к чему стремиться. Впереди ещё такие вещи, как DKIM, DMARC и SPF, а также веб-интерфейсы для удобства администрирования + различные плагины Dovecot. И не менее важное – настройка каких-либо барьеров для защиты от спама.

P.S. Для удобства выкладываю полный конфиг postconf -n:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
html_directory = no
inet_interfaces = 80.87.197.183, localhost
inet_protocols = ipv4
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = rmn-lux.ru
myhostname = mail.rmn-lux.ru
mynetworks = 168.100.189.0/28, 127.0.0.0/8
myorigin = $myhostname
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_security_level = may
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.rmn-lux.ru/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.rmn-lux.ru/privkey.pem
smtpd_tls_security_level = may
unknown_local_recipient_reject_code = 550
virtual_alias_maps = mysql:/etc/postfix/mysql/mysql-virt-alias-maps.cf,mysql:/etc/postfix/mysql/email2email.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql-virt-mbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql-virt-mbox-maps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp

И dovecot -n:

auth_verbose = yes
debug_log_path = /var/log/dovecot/debug.log
first_valid_uid = 1000
info_log_path = /var/log/dovecot/info.log
log_path = /var/log/dovecot/main.log
mail_debug = yes
mail_location = maildir:/var/vmail/%d/%n/Maildir
mbox_write_locks = fcntl
namespace inbox {
  inbox = yes
  location = 
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix = 
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0660
    user = postfix
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
}
ssl_cert = </etc/letsencrypt/live/mail.rmn-lux.ru/fullchain.pem
ssl_key =  # hidden, use -P to show it
userdb {
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
  driver = static
}
verbose_ssl = yes
Понравилась статья? Поделиться с друзьями:
Комментарии: 2
  1. Виктор

    Данная статья конечно неплохая почитать можно автор по видимому не глупый человек в сфере ИТ, но он (автор) теоретик и никак не практик. А не будут Ваши все настройки работать ну никак не будут по одной простой причине Вы попробуйте создать БД и начните создавать там таблицы со всякими там id, name, domain_id, email, password в одиночных кавычках ‘id’ ‘name’ и посмотрите, что будет? А будут там ерроры всех мастей а будут они по одной простой причине потому, что Вы все перепечатываете одну и туже статью с аналогичными ошибками. Вот оно как. Неужели так сложно проверить публикуемую информацию? Я понимаю нет возможно у Вас реального сервера, ну так никто не отменял виртуальные. Не вводите людей в заблуждение особенно новичков они и так не понимают, что за, что цепляется а когда читают статьи подобного пошиба кроме ненависти к информатике у них не возникает. Спасибо. Исправляйтесь.

    1. admin (автор)

      И вам спасибо за комментарий. Да, вы абсолютно правы. И данный материал нельзя назвать полноценной статьёй с практическим применением, это скорее была попытка разобраться в работе почты в целом по части теории, а заодно и попробовать на русском языке это объяснить для других. Поэтому есть куда более лучшие материалы для изучения темы postfix.

      На примере других более свежих статей, стараюсь всё досконально проверять на практике, повторяя все команды на своих стендах, так что исправляюсь :)

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: