2026-09-18
Настройка DKIM + Postfix на Ubuntu и Rocky Linux

Настройка DKIM + Postfix на Ubuntu и Rocky Linux

DKIM (DomainKeys Identified Mail) — цифровая подпись исходящих писем. Получатель проверяет подпись по открытому ключу из DNS домена, что подтверждает подлинность отправителя и улучшает доставляемость. Настроим OpenDKIM + Postfix.

Примеры для Ubuntu/Debian/Astra Linux и Rocky Linux/CentOS/Red Hat.


1. Установка OpenDKIM

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

Ubuntu / Debian / Astra Linux:

apt update
apt install opendkim opendkim-tools

Rocky Linux / CentOS:

dnf install opendkim opendkim-tools

2. Настройка OpenDKIM и Postfix

OpenDKIM

mv /etc/opendkim.conf /etc/backup.opendkim.conf
vi /etc/opendkim.conf
AutoRestart             Yes
AutoRestartRate         10/1h
Umask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes
Canonicalization        relaxed/simple
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256
UserID                  opendkim:opendkim
Socket                  inet:12301@localhost

Все параметры можно оставить как есть; Socket — можно указать другой порт вместо 12301.

mkdir -p /etc/opendkim
vi /etc/opendkim/TrustedHosts
127.0.0.1
localhost

Сюда вносятся IP и сети почтовых серверов, которые могут использовать наш сервер как релей.

touch /etc/opendkim/{KeyTable,SigningTable}
vi /etc/default/opendkim
SOCKET=inet:12301@localhost
systemctl enable opendkim
systemctl restart opendkim

Postfix

vi /etc/postfix/main.cf
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

Если параметры smtpd_milters/non_smtpd_milters уже есть — допишите значения к имеющимся. Порт 12301 должен совпадать с opendkim.conf.

systemctl restart postfix

3. Сертификат и настройка домена

Можно воспользоваться онлайн-инструментом dkimcore.org, но сгенерируем ключ сами через opendkim-genkey. Замените домен на свой.

DKIM_DOMAIN=imaxis.ru
mkdir -p /etc/opendkim/${DKIM_DOMAIN}
opendkim-genkey -D /etc/opendkim/${DKIM_DOMAIN}/ --domain ${DKIM_DOMAIN} --selector relay

где ${DKIM_DOMAIN} — домен отправки, relay — имя селектора (любое).

Появятся два файла: .private (закрытый ключ, хранится на сервере) и .txt (готовая TXT-запись для DNS).

chown :opendkim /etc/opendkim/${DKIM_DOMAIN}/*
chmod g+rw /etc/opendkim/${DKIM_DOMAIN}/*

Если группы opendkim нет — создайте пользователя пакетом (обычно создаётся автоматически).

echo "*.${DKIM_DOMAIN}" >> /etc/opendkim/TrustedHosts

KeyTable — соответствие селектор/домен/файл ключа, формат:

<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к ключу>
echo "relay._domainkey.${DKIM_DOMAIN} ${DKIM_DOMAIN}:relay:/etc/opendkim/${DKIM_DOMAIN}/relay.private" >> /etc/opendkim/KeyTable

SigningTable — соответствие email-адресов записям KeyTable:

echo "*@${DKIM_DOMAIN} relay._domainkey.${DKIM_DOMAIN}" >> /etc/opendkim/SigningTable

В оригинале строка была без @ (*${DKIM_DOMAIN}) — корректный формат шаблона адреса требует *@domain.

systemctl restart opendkim

4. Настройка DNS

cat /etc/opendkim/${DKIM_DOMAIN}/relay.txt

Создаём TXT-запись:

relay._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqG...rhyaj8OcbwIDAQAB"

где relay — селектор, p=... — открытый ключ (в файле он полный).

Необязательные записи

_domainkey IN TXT "o=~; r=postmaster@imaxis.ru"

o=~ — подписываются не все письма; o=- — все.

_adsp._domainkey IN TXT "dkim=all"

all — запретить приём писем от домена без подписи; discardable — блокировать на стороне получателя; unknown — по умолчанию.


5. Проверка

DNS-записи обновляются от 15 минут до 24 часов — при неудаче повторите тест позже.

Отправляем письмо

Отправьте письмо на mail.ru, gmail.com, yandex.ru.

Red Hat / CentOS:

dnf install s-nail    # mailx заменён на s-nail в RPM 9+
echo "Test DKIM" | mail -s "Testing DKIM" -S smtp://localhost:25 -S from="DKIM Tester <postmaster@${DKIM_DOMAIN}>" -S return-path="<postmaster@${DKIM_DOMAIN}>" master@imaxis.ru

Debian / Ubuntu:

apt install mailutils
echo "Test DKIM" | mail -s "Testing DKIM" -a "Smtp: localhost:25" -a "From: DKIM Tester <postmaster@${DKIM_DOMAIN}>" -a "Return-path: <postmaster@${DKIM_DOMAIN}>" master@imaxis.ru

Второй способ — настроить почтовый клиент, отправляющий через наш сервер.

Проверяем заголовки

В полученном письме смотрим служебные заголовки (в mail.ru: Еще → Служебные заголовки):

dkim=pass header.d=imaxis.ru

Подпись работает.


Добавление новых записей DKIM

DKIM_DOMAIN=domain.zone
mkdir -p /etc/opendkim/$DKIM_DOMAIN
opendkim-genkey -D /etc/opendkim/$DKIM_DOMAIN/ --domain $DKIM_DOMAIN --selector relay
chown :opendkim /etc/opendkim/$DKIM_DOMAIN/*
chmod g+rw /etc/opendkim/$DKIM_DOMAIN/*
cat /etc/opendkim/$DKIM_DOMAIN/relay.txt

Создаём TXT-запись по содержимому файла, затем:

echo "*.$DKIM_DOMAIN" >> /etc/opendkim/TrustedHosts
echo "relay._domainkey.$DKIM_DOMAIN $DKIM_DOMAIN:relay:/etc/opendkim/$DKIM_DOMAIN/relay.private" >> /etc/opendkim/KeyTable
echo "*@$DKIM_DOMAIN relay._domainkey.$DKIM_DOMAIN" >> /etc/opendkim/SigningTable
systemctl reload opendkim

Что дальше

  1. Убедитесь, что для домена настроена корректная запись SPF (TXT) — она определяет, с каких серверов можно отправлять почту домена.
  2. Настройте DMARC — политику обработки писем; требует настроенных SPF и DKIM.

Решение проблем

Логи OpenDKIM попадают в общий почтовый лог:

Red Hat / CentOS:

tail -f /var/log/maillog

Debian / Ubuntu:

tail -f /var/log/mail.log

Частые причины проблем:

  • Права на ключи — слишком широкие права (например, 644) вызывают ошибку error loading key. Ключи должны принадлежать группе opendkim с правами g+rw.
  • opendkim: no signing table match for ... — для домена отправки нет записи в SigningTable (опечатка или домен не должен подписываться).
  • Порт милтераSocket в opendkim.conf, SOCKET в /etc/default/opendkim и smtpd_milters в Postfix должны совпадать.

Тонкости и подводные камни

  • Селектор — имя произвольное, но в DNS-записи и KeyTable/SigningTable должно совпадать.
  • Права ключей — OpenDKIM отказывается работать с излишне открытыми правами.
  • SigningTable — шаблон адреса пишется как *@domain, а не *domain.
  • Порт 12301 — должен быть одинаков во всех трёх конфигах.
  • SPF и DMARC — без них DKIM сам по себе не гарантирует доставляемость.
  • dkim=all (ADSP) — устаревшая практика; современные системы полагаются на DMARC.
  • milter_default_action = accept — при недоступности OpenDKIM письма всё равно уйдут (без подписи). Для строгого режима — tempfail.

Шпаргалка

apt install opendkim opendkim-tools    # Ubuntu/Debian
dnf install opendkim opendkim-tools    # Rocky/CentOS

# opendkim.conf: Socket inet:12301@localhost, KeyTable/SigningTable/TrustedHosts
# postfix main.cf: smtpd_milters = inet:localhost:12301

DKIM_DOMAIN=imaxis.ru
opendkim-genkey -D /etc/opendkim/$DKIM_DOMAIN/ --domain $DKIM_DOMAIN --selector relay
chown :opendkim /etc/opendkim/$DKIM_DOMAIN/* && chmod g+rw /etc/opendkim/$DKIM_DOMAIN/*
cat /etc/opendkim/$DKIM_DOMAIN/relay.txt   # -> TXT в DNS

systemctl restart opendkim postfix
# проверка заголовка: dkim=pass header.d=imaxis.ru

Проверено на: Ubuntu 22.04/24.04, Rocky Linux 9 + OpenDKIM, Postfix.
Дата: Сентябрь 2026.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *