Настройка SPF и DKIM

SPF, DKIM, PostfixSPF и DKIM — это механизмы верификации почтового сервера, позволяющие проверить его подлинность. Многие почтовые сервера используют их при получении почты, чтобы быть уверенным в том, что получаемая почта не является спамом. Если вы организуете рассылку со своего почтового сервера, например, периодическую рассылку, либо рассылку писем от вашего интернет-магазина, вам, скорее всего, придется настраивать оба механизма, поскольку это позволит быть уверенным в том, что ваши письма доставляются и автоматически не определяются как спам.

Настройка SPF (Sender Policy Framework).

Настройка SPF является достаточно простой. Для этого достаточно создать записи DNS, определяющие, с каких серверов разрешена отправка почты для данного домена. Использоваться могут два типа записи — TXT и SPF.

domain.ru    TXT    "v=spf1 a mx ip4: -all"
domain.ru    SPF    "v=spf1 a mx ip4: -all"

В данном примере указывается,  что отправка почты данного домена разрешена только с хоста с адресом , для которого есть записи типа A и MX, со всех остальных отправка запрещена.

Для своего домена можно сгенерировать SPF-запись, например, здесь.
Поправка: Microsoft прикрыл лавочку, поэтому рекомендую официальную страницу OpenSPF, на которой можно подробно почитать о структуре записи SPF на английском языке.

После добавления записей не забудьте изменить serial для зоны DNS и перезагрузить информацию о доменной зоне. Если вы всё сделали правильно, то при отправке письма на другой домен, например, на gmail.com, в заголовках письма вы увидите следующий заголовок:

Received-SPF: pass

Настройка DKIM (DomainKeys Identified Mail).

Настройка DKIM несколько сложнее, чем настройка SPF. Для работы этого механизма необходимо следующее:

— Почтовый сервер должен уметь подписывать письма
— Должны быть созданы приватный и публичный ключи
— Должны присутствовать записи в DNS, указывающие на наличие поддержки DKIM

Генерация ключей.

Ключи можно сгенерировать при помощи OpenSSL. Генерация приватного ключа:

# openssl genrsa -out dkimprivate.key 1024
Generating RSA private key, 1024 bit long modulus
.++++++
.....................++++++
e is 65537 (0x10001)

После генерации приватного ключа необходимо изменить права доступа к нему:

chmod 400 /etc/ssl/private/dkimprivate.key

Генерация публичного ключа:

# openssl rsa -pubout -in dkimprivate.key -out dkimpublic.key
writing RSA key

Ключи готовы. Их можно разместить в директории, где хранятся другие ключи. Для Debian’а это директория /etc/ssl/private. Сгенерировать их можно также при помощи программы opendkim-genkey, входящую в пакет opendkim-tools. Теперь надо добавить записи в DNS. Записей будет две.

_domainkey.domain.ru.      TXT "o=~;"
mail._domainkey.domain.ru. TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoCH8kcKOUHIx1Gbv461a9iZYaqS3LfjGLHR1aJEQkAChMEB5xc74UeEcTWo0rx5sBAgbhUj/5nefL4K4cxFLnFIKkPZZp/e2euTsKd0c3kE3Go5vu9jERzXnsb0jAQO0K85Jfw/gQahTC4qDOce5B5REsXtMtUR8r9J+dnACpzQIDAQAB"
_adsp._domainkey.domain.ru.   TXT "dkim=all"

То, что идет после «p=» — это ключ, содержащийся в файле dkimpublic.key, он записывается в одну строчку. А запись «_adsp._domainkey.domain.ru» определяет, должны ли подписываться письма. Возможные варианты:
«dkim=all» — все письма должны подписываться
«dkim=discardable» — неподписанные письма не должны приниматься
«dkim=unknown» — то же самое, что и отсутствие такой записи.
После создания записей изменяем serial и перезагружаем настройки bind’а, если у вас установлен он. И теперь осталось последнее — настроить почтовый сервер. В качестве почтового сервера возьмем Postfix.

Настройка поддержки DKIM почтовым сервером Postfix.

Последняя и, пожалуй, самая важная часть — включение подписи писем почтовым сервером. Самое первое, что нужно сделать на этом этапе, — это установить opendkim:

apt-get install opendkim

Теперь необходимо настроить этот сервис. Первым делом поменяем файл /etc/default/opendkim. Впишем туда следующую строчку:

SOCKET="inet:10024@localhost"

Теперь наш сервер будет запускаться на порту 10024 на loopback-интерфейсе. Следующий файл, который необходимо изменить, — это /etc/opendkim.conf.

Раскомментируем строчку со словом Domain, вписываем название нашего домена:

Domain    domain.ru

Теперь указываем файл с приватным ключом:

KeyFile    /etc/sll/private/dkimprivate.key

После этого указываем селектор, который мы использовали для сгенерированного ранее публичного ключа, указывая его в записи DNS. В нашем случае это «mail»:

Selector    mail

Дописываем строчку:

Background    yes

Теперь можно рестартовать opendkim:

service opendkim restart

И последний шаг — настройка непосредственно Postfix’а. Изменяем файл /etc/postfix/main.cf. Добавим туда следующие строчки:

milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:10024
non_smtpd_milters = inet:localhost:10024

Теперь перезапускаем postfix и отправляем письмо. После получения смотрим заголовки письма. В них должен присутствовать следующий заголовок:

Authentication-Results: mx.google.com;
spf=pass (google.com: domain of user@domain.ru designates 62.113.208.35 as permitted sender) smtp.mail=user@domain.ru;
dkim=pass header.i=@domain.ru

Если вы видите строчки «spf=pass» и «dkim=pass», значит вы все сделали правильно и ваш почтовый сервер теперь будет значительно лучше восприниматься другими почтовыми серверами, с чем я вас и поздравляю.


Понравилась статья?

Подпишитесь на новости сайта и получайте новые статьи на свой почтовый ящик (один раз в неделю).


Настройка SPF и DKIM: 13 комментариев

  1. Игорь

    Спасибо, полезно было почитать, жаль только не рассмотрено как включить spf проверку от других почтовиков в postfix.

  2. f3ex

    Почему-то у меня не работает «dkim=unknown», ни yandex, ни mail.ru, ни гугл не отбрасывают письмо без подписи.

    1. mnorin Автор записи

      А почему вы думаете, что они должны отбрасывать неподписанные письма?
      У всех перечисленных сервисов достаточно сложные фильтры, которые пропускают в том числе и неподписанные письма.

  3. Иван

    Если входящее письмо не прошло проверку DKIM, то в вашем случае просто добавляется соответствующий заголовок к письму.
    Если Postfix настроен на пересылку почты, как сделать так, чтобы Postfix отклонял письмо, не прошедшее проверку DKIM?

    1. mnorin Автор записи

      Обычно настраивается dkim-filter и выставляется соответствующий milter_default_action, но для сервера, который пересылает почту, делать не приходилось.

  4. Урбеч

    Привет!
    Все сделал по инструкции. Письмо в спаме.
    Dkim в письме не отображается совсем.
    spf=softfail (google.com: domain of transitioning info@urbech.com does not designate 2a04:ac00:1:29cc:5054:ff:fe00:1a21 as permitted sender
    SPF прописывал по инструкции яндекса

    1. mnorin Автор записи

      Привет. Для начала отключить использование ipv6 и перейти на ipv4. А потом уже смотреть дальше.

      1. Урбеч

        Может в SPF тоже прописать ip6:2a04:ac00:1:29cc:5054:ff:fe00:1a21 ?
        И как сказать серверу, чтобы он только как ip4 отправлял?
        У меня CentOS

        1. mnorin Автор записи

          Можно, но желательно представлять, как и что должно работать. Если вы не умеете настраивать фаервол для работы с ipv6, то я бы, пожалуй, на вашем месте на ipv6 не переходил пока.
          Для postfix можно в настройках указать, чтобы он работал только с ipv4. Сначала проверить, по каким протоколам он работает:

          postconf inet_protocols

          А потом указать, соответственно, в /etc/postfix/main.cf эту опцию.
          И можно в настройках системы глобально выключить использование ipv6:

          sysctl -w net.ipv6.conf.default.disable_ipv6=1
          sysctl -w net.ipv6.conf.all.disable_ipv6=1

          Или эти же значения записать в /etc/sysctl.conf вручную

          1. Урбеч

            IPV6 я не включал, в таком виде сервер предоставлен хостером.
            Отключить еще не успел, но после последних правок почта соовсем не отправляется:
            В логах: errormsg=’cannot connect to 127.0.0.1, port 25: Connection refused’ exitcode=EX_TEMPFAIL

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.