В материале было решено собрать все этапы настройки почтового сервера. Как оказалось на практике, задача эта не простая, особенно если у тебя не достаточно понимания работы сетевых связей в процессе работы данного сервиса. Эта инструкция была сформирована мною в процессе практической настройки почтового сервера на виртуальной машине гипервизора Proxmox. В моём арсенале имеется Статический белый ip — адрес, сервер DNS на виртуальной машине этого же гипервизора и роутер с NAT, через которые мои виртуалки смотрят в распределённую сеть.

В итоге мне удалось собрать функциональный почтовый сервер, который способен взаимодействовать с наиболее распространёнными почтовыми клиентами. Проблемы остались лишь с подключением клиента Outlook, и оказалось связанно это с тем что, как мне удалось выяснить, данный клиент требователен к PTR записи, ip — адреса данного почтового домена. Редактировать PTR записи адреса есть возможность только у владельца пула данного адреса.

Мною была предпринята попытка обратиться в службу поддержки моего провайдера, но мне был дан ответ в стиле: «У нас нет технической возможности для данной услуги». В итоге почтовый сервер который мне удалось собрать является не вполне полноценным в глобальной паутине, не смотря на то, что поддерживает такие технологии аутентификации электронной почты как SPF, DMARC и DKIM.

Что такое SPF, DKIM и DMARC на самом деле

Эти три механизма объединяет не «доменные технологии», а email‑аутентификация, основанная на DNS.

  • SPF — проверка, какие IP имеют право отправлять почту от имени домена.
  • DKIM — криптографическая подпись писем, публичный ключ хранится в DNS.
  • DMARC — политика, которая объединяет SPF и DKIM и задаёт правила обработки.

То есть:

  • Они используют DNS, но не являются доменными технологиями в широком смысле.
  • Они относятся к email security / email authentication.

Как правильно объединить SPF, DKIM и DMARC

Вот корректные зонтичные термины:

1. Технологии email‑аутентификации

Самое точное и общепринятое.

2. Email authentication stack

Если нужен современный, «инженерный» термин.

3. Почтовые технологии безопасности

Если хочешь подчеркнуть аспект защиты.

4. DNS‑основанные механизмы аутентификации почты

Если важно упомянуть DNS.


Приступим:

  • Подготовка серверной операционной системы
  • Подготовка сервера DNS (в этом случае работает в локальной сети)
  • Установка Postfix
  • Установка mailutils
  • Настройка Postfix, для перемещения почтовых каталогов пользователей расположенных по умолчанию, в их системные каталоги.
nano /etc/postfix/main.cf

Добавляем в конец текста файла строку:

home_mailbox = Maildir/

После данного изменения выполняем:

postconf -e 'home_mailbox = Maildir/'
  • Устанавливаем Dovecot
apt install dovecot-imapd dovecot-pop3d
systemctl restart dovecot
  • Осуществляем редактирование файла конфигурации dovekot
nano /etc/dovecot/dovecot.conf

В конец текста конфигурации dovecot.conf добавляем строку:

protocols = pop3 pop3s imap imaps
  • Возвращаемся к настройкам, подготовленной ранее, нашей доменной зоны для сервера и добавляем TXT записи, предусмотренные для обслуживания почтового доменного имени. Добавляем dmarc и spf записи (MX запись, уже предположительно имеется), примерно:
_dmarc     IN TXT "v=DMARC1; p=quarantine; aspf=r; sp=none"
sumuis.ru. IN TXT "v=spf1 ip4:11.22.11.22 a mx ~all"
  • Устанавливаем Opendkim следующими командами:
apt install opendkim opendkim-tools
systemctl start opendkim
systemctl enable opendkim
  • Создаём каталог для хранения ключей необходимых в работе opendkim
mkdir /etc/opendkim
  • Генерируем упомянутый ключ командой:
opendkim-genkey -D /etc/opendkim --domain example.com --selector mail
  • Вносим все необходимые изменения в файл конфигурации opendkim.conf
chown -R opendkim:opendkim /etc/opendkim
nano /etc/opendkim.conf

Добавляем, а при наличии знаков комментирования для имеющихся из списка строк, убираем знаки комментирования.

Autorestart       yes
AutorestartRate  10/1h
LogWhy            yes
Mode              sv
UMask             002
#Socket local:/run/opendkim/opendkim.pid
Socket inet:8891@localhost

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

ExternalIgnoreList   refile:/etc/opendkim/TrustedHosts
InternalHosts        refile:/etc/opendkim/TrustedHosts
KeyTable             refile:/etc/opendkim/KeyTable
SigningTable         refile:/etc/opendkim/SigningTable
SignatureAlgorithm   rsa-sha256
  • Теперь создаём файлы указанные в выше обозначенной конфигурации
nano /etc/opendkim/TrustedHosts

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

example.com
nano /etc/opendkim/KeyTable

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

mail._domainkey.example.com example.com:mail:/etc/opendkim/mail.private

1. mail._domainkey.example.com— селектор + домен (DNS‑имя записи DKIM)

Это полное имя DKIM‑записи, которое будет опубликовано в DNS.

  • mailселектор (selector)
  • _domainkey — обязательная DKIM‑зона
  • example.com — домен

То есть OpenDKIM будет искать публичный ключ в DNS по адресу:

Код

mail._domainkey.example.com

2. example.com— домен, для которого используется ключ

Это домен, от имени которого OpenDKIM будет подписывать письма.

Если письмо отправляется с @sumuis.ru, OpenDKIM поймёт, что нужно использовать этот ключ.

3. mail — селектор DKIM

Это тот же селектор, который используется в DNS‑записи.

Он попадёт в заголовок DKIM:

Код

s=mail;

4. /etc/opendkim/mail.private — путь к приватному ключу

Это путь к приватному DKIM‑ключу, который OpenDKIM использует для подписи писем.

Публичный ключ должен быть опубликован в DNS в виде TXT‑записи.

Эта строка говорит OpenDKIM:

«Когда нужно подписать письмо от домена sumuis.ru, используй селектор mail, возьми приватный ключ из /etc/opendkim/mail.private, а публичный ключ ищи в DNS по адресу mail._domainkey.example.com

В этом файле

    nano /etc/opendkim/SigningTable

    вписываем стоку с соответствующим синтаксисом

    *@example.com mail._domainkey.example.com

    Что означает каждая часть

    1. *@example.com— шаблон адресов отправителя

    Это маска, которая говорит OpenDKIM:

    «Подписывать все письма, отправленные с любого адреса в домене sumuis.ru

    Звёздочка означает «любой локальный пользователь»:

    • info@example.com
    • admin@example.com
    • noreply@example.com
    • root@example.com
    • и любые другие

    То есть правило применяется ко всем отправителям внутри домена.

    2. mail._domainkey.example.com— ссылка на запись в KeyTable

    Это идентификатор ключа, который должен совпадать с первой колонкой в /etc/opendkim/KeyTable.

    OpenDKIM делает следующее:

    1. Видит, что письмо отправлено с *@example.com.
    2. Находит в SigningTable соответствие:Код*@sumuis.ru → mail._domainkey.sumuis.ru
    3. Идёт в KeyTable и ищет строку с таким же идентификатором: mail._domainkey.example.com example.com:mail:/etc/opendkim/mail.private
    4. Использует указанный приватный ключ для подписи.

    Итоговое значение строки

    Эта строка говорит OpenDKIM:

    «Все письма, отправленные с любого адреса в домене sumuis.ru, должны подписываться DKIM‑ключом, который описан в KeyTable под именем mail._domainkey.example.com

    Как это работает в связке с KeyTable

    SigningTable — это правило выбора ключа. KeyTable — это описание ключа.

    Вместе они образуют цепочку:

    Отправитель → селектор → приватный ключ → DNS‑запись

    Важно не забыть в заключении указать пути к сертификатам безопасности в файлах конфигурации postfix и dovecot

    Для postfix в файле /etc/postfix/main.cf с синтаксисом:

    # TLS parameters
    smtpd_tls_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem
    smtpd_tls_key_file=/etc/letsencrypt/live/example.com/privkey.pem

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

    ssl = yes
    ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
    ssl_key  = </etc/letsencrypt/live/example.com/privkey.pem

    В случае генерации вами этих ключей с помощью letsencript

    От alex

    Обучаемый.