Opt-In Software Blog

Software, dvelopment, and practical insights

Настройка SPF, DKIM и DMARC для почтового сервера на Linux

Читать на другом языке: English | Русский

Если вам нужно самостоятельно отправлять почту со своего домена без использования сторонних SMTP-сервисов, можно арендовать Linux VPS. В качестве почтового сервера (MTA) обычно используют Postfix или Exim.

Перед покупкой VPS обязательно напишите в поддержку хостинга и спросите: «Открыт ли у вас исходящий 25 порт SMTP?». Многие хостеры закрывают его по умолчанию, чтобы защититься от спамеров. Если порт закрыт, отправка почты напрямую на почтовые серверы может быть невозможна.


1. Подготовка: настройки сети и DNS

Чтобы почта корректно доставлялась, нужно настроить несколько базовых параметров DNS вашего домена:

  1. Имя хоста (Hostname). Задайте серверу имя в системе, например mail.yourdomain.com.

  2. A-запись. Направьте поддомен mail.yourdomain.com на IP-адрес вашей VPS.

  3. MX-запись. Укажите, какой сервер принимает почту для домена. Запись выглядит так:

    @ MX 10 mail.yourdomain.com.
  4. PTR-запись (Reverse DNS). Связывает IP-адрес сервера обратно с его именем. Она настраивается в панели хостинга VPS, а не у регистратора домена.

    PTR-запись важна для доставки почты. Многие почтовые серверы проверяют обратную DNS-запись IP-адреса, а её отсутствие или несоответствие может привести к отклонению писем или попаданию в спам.

    Рекомендуется согласовать прямую и обратную DNS-записи:

    1.2.3.4 → mail.yourdomain.com
    mail.yourdomain.com → 1.2.3.4

2. Настройка SPF

SPF — это запись в DNS, которая указывает, каким серверам разрешено отправлять почту от имени вашего домена.

Создайте TXT-запись:

  • Тип записи: TXT

  • Хост/Имя: @ (или пустое поле, в зависимости от DNS-панели)

  • Значение:

    v=spf1 ip4:1.2.3.4 ~all

    Вместо 1.2.3.4 подставьте IP-адрес своего сервера.

Что значит ~all

~all означает SoftFail: сообщения с IP-адресов, не перечисленных в SPF, не проходят проверку с мягким результатом. Принимающий сервер самостоятельно решает, как обработать такое письмо.

После проверки конфигурации можно использовать -all, если все легитимные источники отправки перечислены в SPF.


3. Генерация ключей DKIM через OpenSSL

DKIM — это цифровая подпись, которая помогает проверять подлинность отправителя и целостность письма. Сервер подписывает письмо приватным ключом, а получатель проверяет подпись с помощью публичного ключа из DNS.

Для генерации пары ключей зайдите на сервер по SSH и выполните следующие команды.

1. Создаём приватный ключ длиной 2048 бит

openssl genrsa -out dkim.private 2048

2. Генерируем публичный ключ

openssl rsa -in dkim.private -pubout -out dkim.public

3. Выводим публичный ключ на экран

cat dkim.public

В терминале появится текст примерно такого вида:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...
-----END PUBLIC KEY-----

Для DNS-записи нужно взять только Base64-содержимое ключа между заголовками и объединить его в одну строку без пробелов и переносов.

Затем создайте TXT-запись dkim._domainkey (где dkim — имя вашего селектора).

  • Тип записи: TXT

  • Хост/Имя: dkim._domainkey

  • Значение:

    v=DKIM1; k=rsa; p=ТУТ_ВАШ_СКОПИРОВАННЫЙ_КЛЮЧ

Если DNS-провайдер поддерживает разбиение длинных TXT-записей на несколько строк, используйте эту возможность для ключей, которые не помещаются в одну строку.


4. Подключение DKIM к почтовому серверу

Вариант А: если у вас Exim

В конфигурационном файле Exim (точный путь зависит от дистрибутива и способа установки) найдите транспорт, который отвечает за отправку почты наружу. Обычно он называется remote_smtp.

Пример конфигурации:

remote_smtp:
  driver = smtp
  dkim_domain = yourdomain.com
  dkim_selector = dkim
  dkim_private_key = /etc/exim/dkim.private
  dkim_canon = relaxed

Выдайте права на чтение файла приватного ключа пользователю, от имени которого работает Exim. Имя пользователя зависит от дистрибутива. Например, в некоторых системах это exim, а в Debian может использоваться Debian-exim.

Пример для системы с пользователем exim:

chown exim:exim /etc/exim/dkim.private
chmod 600 /etc/exim/dkim.private

Перезапустите сервис:

systemctl restart exim4
# или
systemctl restart exim

Проверьте, что используемый пользователь Exim действительно имеет доступ к приватному ключу.


Вариант Б: если у вас Postfix

Postfix использует внешнюю утилиту OpenDKIM для добавления DKIM-подписей.

1. Установите пакеты

apt install opendkim opendkim-tools

2. Настройте OpenDKIM

Откройте конфигурационный файл /etc/opendkim.conf и добавьте или настройте следующие параметры:

Syslog                 yes
RequiredHeaders        yes
Mode                   sv
SubDomains             no
Socket                 inet:8891@localhost
KeyTable               /etc/opendkim/KeyTable
SigningTable           /etc/opendkim/SigningTable
ExternalIgnoreList     /etc/opendkim/TrustedHosts
InternalHosts          /etc/opendkim/TrustedHosts

3. Подключите OpenDKIM к Postfix

В конец основного конфига Postfix /etc/postfix/main.cf добавьте:

milter_protocol = 6
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

4. Настройте таблицы OpenDKIM

В этом примере используется один домен и один ключ DKIM. Имя ключа в KeyTablemail._domainkey.yourdomain.com.

/etc/opendkim/KeyTable

Этот файл связывает имя ключа с доменом, селектором и путём к приватному ключу:

mail._domainkey.yourdomain.com yourdomain.com:mail:/etc/opendkim/keys/dkim.private

Здесь:

  • mail._domainkey.yourdomain.com — имя ключа в таблице.
  • yourdomain.com — домен, который попадёт в DKIM-подпись (d=).
  • mail — селектор (s=).
  • /etc/opendkim/keys/dkim.private — путь к приватному ключу.

/etc/opendkim/SigningTable

Этот файл связывает домен отправителя с именем ключа из KeyTable:

yourdomain.com mail._domainkey.yourdomain.com

Если необходимо использовать шаблон для адресов отправителей домена, можно указать:

*@yourdomain.com mail._domainkey.yourdomain.com

Для wildcard-варианта необходимо настроить соответствующий тип таблицы refile: в директиве SigningTable. В данной инструкции используется простой вариант сопоставления по домену без refile.

/etc/opendkim/TrustedHosts

Внесите localhost и IP-адрес своего сервера:

127.0.0.1
localhost
1.2.3.4

5. Перенесите приватный ключ и перезапустите службы

Создайте каталог для ключей:

mkdir -p /etc/opendkim/keys/

Переместите приватный ключ:

mv dkim.private /etc/opendkim/keys/

Назначьте владельца и права:

chown -R opendkim:opendkim /etc/opendkim/
chmod 600 /etc/opendkim/keys/dkim.private

Перезапустите службы:

systemctl restart opendkim postfix

Проверьте статус:

systemctl status opendkim
systemctl status postfix

При необходимости изучите журнал OpenDKIM:

journalctl -u opendkim -n 50 --no-pager

5. Настройка DMARC

DMARC — это механизм, который позволяет домену сообщить принимающим почтовым серверам, как обрабатывать сообщения, не прошедшие необходимые проверки SPF и DKIM с учётом соответствия домена в поле From.

Создайте TXT-запись:

  • Тип записи: TXT

  • Хост/Имя: _dmarc

  • Значение для начала:

    v=DMARC1; p=none; rua=mailto:admin@yourdomain.com

Что это значит

  • p=none — режим мониторинга. Домен просит не применять специальное действие к сообщениям, не прошедшим DMARC. Можно наблюдать за результатами проверок и собирать отчёты.
  • rua=mailto:... — адрес, на который почтовые сервисы могут отправлять агрегированные отчёты о проверках.
  • p=quarantine — просит принимающий сервер обрабатывать сообщения, не прошедшие DMARC, как подозрительные, например помещать их в спам.
  • p=reject — просит отклонять сообщения, не прошедшие DMARC. Реальное действие определяется принимающим сервером.

После проверки и исправления конфигурации можно изменить политику с p=none на p=quarantine или p=reject.


6. Как проверить DNS-записи через терминал

Проверить, что настройки обновились в DNS, можно из консоли с помощью утилит dig или nslookup.

Проверка SPF

dig yourdomain.com TXT +short

Или:

nslookup -type=TXT yourdomain.com

Проверка DKIM

Запрос выполняется по имени вашего селектора:

dig mail._domainkey.yourdomain.com TXT +short

Или:

nslookup -type=TXT mail._domainkey.yourdomain.com

Проверка DMARC

dig _dmarc.yourdomain.com TXT +short

Или:

nslookup -type=TXT _dmarc.yourdomain.com

Проверка PTR (обратной записи)

dig -x 1.2.3.4 +short

Или:

nslookup 1.2.3.4

Проверка hostname

hostname -f

Убедитесь, что имя согласовано с A- и PTR-записями.

Рекомендуемая схема:

Hostname: mail.yourdomain.com
A:        mail.yourdomain.com → 1.2.3.4
PTR:      1.2.3.4 → mail.yourdomain.com

Имя хоста, используемое сервером, и обратная DNS-запись должны быть настроены согласованно.

Search