Настройка DKIM с Postfix в Centos

Для того чтобы письма, отправленные с сервера не попадали в СПАМ, требуется корректно настроить DKIM и SPF, настройка DMARC является желательной, но не обязательной для корректного прохождения почты.

Настройка корректна для версий Centos 7 и 8.

Установим Postfix:

yum install postfix
systemctl enable postfix

Настройки подойдут дефолтные. Обратить внимание стоит на имя сервера, так как по-умолчанию Postfix берет именно его при отправке в качестве FROM.

В случае с PHP переопределить это значение можно используя опцию -f. Например для PHP-FPM просто переопределить отправителя, задав в настройках пула, обслуживающего сайт:

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f noreply@nagg.ru

Далее установим и настроим Opendkim:

yum -y install opendkim
systemctl enable opendkim

По-умолчанию конфигурация Opendkim (/etc/opendkim.conf) нам не подойдет, так как работает в режиме только проверка (verify - v). Также у него есть режим подпись (sign - s). Мы включаем оба, поэтому правим значение переменной на следующее:

Mode    sv

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

#KeyFile        /etc/opendkim/keys/default.private

Включаем блоки (или проверяем что они включены):

Selector	default
KeyTable        /etc/opendkim/KeyTable
SigningTable    refile:/etc/opendkim/SigningTable
InternalHosts	refile:/etc/opendkim/TrustedHosts

Выписываем ключ, на примере домена nagg.ru (если требуется задать более стойкий ключ, можно использовать опцию "-b 2048"):

opendkim-genkey -D /etc/opendkim/keys/ -d nagg.ru -s default
chown -R opendkim:opendkim /etc/opendkim/keys/

mv /etc/opendkim/keys/default.private /etc/opendkim/keys/nagg.ru.private
mv /etc/opendkim/keys/default.txt /etc/opendkim/keys/nagg.ru.txt

Правим /etc/opendkim/SigningTable, добавляем в конец строку:

*@nagg.ru default._domainkey.nagg.ru

Правим /etc/opendkim/KeyTable, добавляем в конец строку:

default._domainkey.nagg.ru nagg.ru:default:/etc/opendkim/keys/nagg.ru.private

Содержимое файла /etc/opendkim/keys/nagg.ru.txt добавляем в ДНС:

default._domainkey	IN	TXT v=DKIM1; k=rsa; p=MIGfMA0....HBA

Добавляем в конфиг Postfix /etc/postfix/main.cf, в самый низ:

# Opendkim
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
milter_protocol = 2
milter_default_action = accept

Применяем изменения и проверяем что сервисы запустились, ошибок нет:

systemctl restart opendkim
systemctl restart postfix

Проверяем что ключ появился и тестируем локально DKIM ключ:

dig default._domainkey.nagg.ru TXT
opendkim-testkey -d nagg.ru -s default -k /etc/opendkim/keys/nagg.ru.private -vvvvvvvv

Вывод должен быть следующим (не пугайтесь, вывод "key not secure" означает что не используется DNSSEC):

opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: key loaded from /etc/opendkim/keys/nagg.ru.private
opendkim-testkey: checking key 'default._domainkey.nagg.ru'
opendkim-testkey: key not secure
opendkim-testkey: key OK

Для теста отправки также можете использовать консольную утилиту mutt:

yum install mutt -y
echo 'test' | mutt -e 'set from='positive@nagg.ru'' -e 'set realname='info'' -s 'DKIM' check-auth-sf=nagg.ru@verifier.port25.com

Не забудьте добавить IP вашего сервера в SPF, оставлю инструкцию от Яндекс для общего понимания: https://yandex.ru/support/connect/dns/spf.html

Все готово, ваши письма теперь подписываются!