Настройка 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
Что дальше
- Убедитесь, что для домена настроена корректная запись SPF (TXT) — она определяет, с каких серверов можно отправлять почту домена.
- Настройте 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.