Tech
January 23, 2024

Postfix - настраиваем SPF & DKIM

Введение

Давайте попробуем настроить SPF и DKIM, чтобы письма реже попадали в спам.

Предполагается, что вы уже используете Postfix. И возможно даже на одном из проектов у вас уже настроена smtp авторизация.

SPF

Настроить SPF запись очень легко.

  1. Необходимо добавить следующую TXT запись в DNS вашего домена "v=spf1 ip4:1.2.3.4 a -all" (двойные кавычки оставьте). Здесь вместо адреса 1.2.3.4 должено быть IP адрес, с которого вы отправляете почту.
  2. Убедитесь, что ваш почтовик отправляет почту именно с указанного адреса. Частой ошибкой бывает запись inet_protocols = all в файле настроек Postfix main.cf, из-за которой письма могут отправляться с ipv6 адреса. Рекомендую указать inet_protocols = ipv4.

Теперь принимающий почтовик (например Yandex) будет дописывать свой заголовок в письмо Authentication-Result. Там должно быть указано что то типа:

Authentication-Results: mxfront5o.mail.yandex.net; spf=pass (mxfront5o.mail.yandex.net: domain of example.com designates 1.2.3.4 as permitted sender, rule=ip4:1.2.3.4) smtp.mail=info@example.com; dkim=neutral header.i=@example.com

Нас интересует spf=pass это значение может быть в Pass, Fail, SoftFail, Neutral. Нам нужно в pass.

Помните, что с такой записью, если на этом домене есть другая почта ( с отличным от указанного IP адресом ), то она будет валиться в спам. Поэтому если вам нужны вариации SPF записи, отдельно разберитесь в этом, чтобы не угробить корпоративную жизнь клиенту.

DKIM

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

Установим opendkim opendkim-tools

yum install install opendkim opendkim-tools

Создадим папку:

mkdir /etc/postfix/dkim/

Сгенерируем туда ключ для нашего домена

opendkim-genkey -D /etc/postfix/dkim/ -d example.com -s selector

⚠️ Важно! Обратите внимание на параметры:

-d domain

-D directory

-s selector

Если вы планируете настраивать несколько DKIM, то рекомендую сразу начать использовать соответствующие проекту селекторы. Поэтому я использую название selector вы используйте свои читаемые названия.

После выполнения этой команды у вас создастся два файла .private и .txt. На папку и на приватный ключ нужно выставить правильные права:

chmod 600 /etc/postfix/dkim/example.com.private && chown -R opendkim /etc/postfix/dkim/

Отредактируем файл vim /etc/opendkim.conf. Найдем и исправим параметры в соответствии представленном ниже:

Syslog yes

Mode sv

KeyTable file:/etc/postfix/dkim/keytable

SigningTable file:/etc/postfix/dkim/signingtable

Создадим файл vim /etc/postfix/dkim/keytable и укажем информацию о приватном ключе:

#имя_ключа домен:селектор:/путь/до/ключа
selector._domainkey.example.com example.com:selector:/etc/postfix/dkim/example.com.private

Создадим файл vim /etc/postfix/dkim/signingtable и укажем домены, которые нужно подписывать (можно несколько):

example.com selector._domainkey.example.com

Откроем или создадим файл `vim /etc/default/opendkim` и пропишем там строчку

SOCKET="inet:8891@localhost"

И теперь добавим настройки в конец vim /etc/postfix/main.cf (убедитесь, что у вас там ранее ничего не настроено было, наверное в начале инструкции следовало это посоветовать)

milter_default_action = accept

milter_protocol = 2

smtpd_milters = inet:localhost:8891

non_smtpd_milters = inet:localhost:8891

Отлично, рестартуем сервисы:

service postfix restart && service opendkim restart

С этой минуты письма будут подписаны вашей DKIM сигнатурой. Теперь важно добавить запись DNS домена.

Используйте хост, который использован в keytable и signingtable.

В файле /etc/postfix/dkim/selector.txt вы найдете публичный DKIM key, но он будет рзбит на две строчки. Можно вручную объединить в одну.

В итоге у вас получится что-то типа такого:

Хост: <i>selector._domain</i><br>

Запись TXT: <i> v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA...........ADCBiQ</i>

После успеха, отправьте себе письмо (например на Yandex) и убедитесь, что в заголовках письма есть Authentication-Results где прописано dkim=pass.

Пример заголовка (вместе с SPF):

Authentication-Results: mxfront9o.mail.yandex.net; spf=pass (mxfront9o.mail.yandex.net: domain of example.com designates 1.2.3.4 as permitted sender, rule=[ip4:1.2.3.4]) smtp.mail=info@example.com; dkim=pass header.i=@example.com

Чтобы это сделать в CentOS 7, убедитесь что стоит пакет `mailx`

yum install mailx

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

echo "Hello" | mail -s "Test DKIM & SPF" -rinfo@example.com destination@email.ru

Кроме того, что в заголовках появится информация Authentication-Results, вы сможете найти в логах /var/log/maillog следующую запись о том что добавлено поле DKIM-Signature:

Jun 5 08:27:54 37-140-199-90 opendkim[15285]: 4DFFCCA0320: DKIM-Signature field added (s=example, d=example.com)

Теперь вы снизили риск попадания письма в спам. Помните, что кроме этого необходимо также не спамить, давать возможность пользователям отписаться, а также иметь белый IP адрес, который не внесен в реестр злостных рассыльщиков. И даже при соблюдении всего этого, вы всё равно можете столкнуться с тем, что письмо упало в спам (например это могут быть собственные пользовательские фильтры).

Я также рекомендую использовать SMTP шлюзы или почту популярных почтовиков, таких как gmail, yandex, mail и отправлять почту через SMTP авторизацию.

Ремарка

Убедитесь, что у вас в проекте устанавливается правильный отправитель. Если письма отправляются по крону, то настройки apahce и даже любимый /etc/php.d/* могут игнорироваться, т.к. там напрямую дергается php.