По завершении первых двух этапов у нас теперь функционирует SMTP-сервер Postfix и IMAP-сервер Dovecot. Мы имеем возможность отправлять и получать электронные письма через почтовый клиент на компьютере. Несмотря на правильную настройку записей MX, A и PTR, мои письма оказались в папке спама в Gmail и Outlook. В этой части мы обсудим, как повысить вероятность доставки электронной почты в «Входящие» получателя, настроив SPF и DKIM на сервере CentOS/RHEL.
Содержание статьи
- 1 Что представляют собой записи SPF и DKIM?
- 2 Настройка записи SPF в DNS.
- 3 Конфигурация SPF-политики агента
- 4 Конфигурация DKIM
- 5 Установка и конфигурация OpenDKIM на CentOS 8/RHEL 8
- 6 Формирование таблицы подписей, ключевой таблицы и документа с доверенными хостами.
- 7 Создайте пару ключей (закрытый и открытый).
- 8 Разместите ваш открытый ключ в записях DNS.
- 9 Проведите проверку DKIM-ключа.
- 10 Настройка Postfix для работы с OpenDKIM
- 11 Проверка SPF и DKIM-записей.
- 12 Некорректная настройка в почтовом приложении.
- 13 Оценка и тестирование электронной почты и её размещения.
- 14 Почтовые службы Microsoft (Hotmail.com, Outlook.com)
- 15 Как поступить, если ваши письма всё ещё попадают в папку «спам»?
- 16 Следующий этап
Что представляют собой записи SPF и DKIM?
SPF и DKIM представляют собой два вида TXT-записей в DNS, которые могут помочь избежать подделки электронной почты и гарантировать, что легитимные письма будут доставляться в папку «Входящие» у получателя, а не в спам. Если ваш домен подвергается злоупотреблениям, связанным с подменой электронной почты, ваши сообщения, вероятнее всего, окажутся в папке спама у получателя, если он не добавил вас в свои контакты.
Запись SPF (Sender Policy Framework) определяет, какие хосты или IP-адреса могут отправлять электронные сообщения от имени вашего домена. Разрешите отправку писем исключительно с вашего почтового сервера или сервера вашего интернет-провайдера.
DKIM (DomainKeys Identified Mail) применяет приватный ключ для создания подписи в электронных письмах, исходящих с вашего домена. SMTP-серверы, принимающие письма, осуществляют проверку подписи с помощью открытого ключа, который размещен в DNS-записях вашего домена.
Настройка записи SPF в DNS.
В вашем DNS-менеджере добавьте новую TXT-запись, следуя приведенным ниже инструкциям.
TXT @ v=spf1 mx ~all
- TXT обозначает, что это запись формата TXT.
- Введите символ @ в поле имени, чтобы указать корневое доменное имя.
- Запись v=spf1 обозначает, что это запись SPF, а версия данной записи — первая.
- MX обозначает, что все хосты, перечисленные в MX-записях, могут отправлять электронные письма от имени вашего домена, в то время как остальные хосты лишены такого права.
- ~Все указывает на то, что электронные письма с вашего домена должны отправляться только с хостов, указанных в записи SPF. Сообщения, отправленные с других хостов, будут считаться ненадежными. Существуют и другие варианты, такие как +all, — all,?all, но их использование довольно редко.
-all указывает на то, что сообщения, отправленные с неподдерживаемых серверов, должны быть отклонены и не должны попадать ни в папку «Входящие», ни в спам-папку получателя. Я заметил, что это применяет facebook.com, однако нам обычно не требуется такая жесткая политика.
Некоторые могут считать, что использование — all предпочтительнее, так как оно блокирует письма от ненадежных источников. Однако включение — all в SPF-политику может вызвать проблемы с доставкой ваших писем. Например, если у получателя настроены два SMTP-сервера, и основной сервер временно выходит из строя, письма будут перенаправлены на резервный сервер. Когда основной сервер снова заработает, почта будет передана с резервного на основной. Но если резервный сервер получателя не указан в вашей SPF-записи, основным сервером письмо будет отклонено. Поэтому рекомендуется применять…~Все в вашей SPF-политике.
Учтите, что в некоторых DNS-менеджерах запись SPF необходимо заключать в двойные кавычки, как показано в примере ниже.
TXT @ "v=spf1 mx ~all"
Чтобы убедиться, что ваша SPF-запись стала доступной в публичном Интернете, можно воспользоваться утилитой dig на Linux. Например, на CentOS или RHEL перед этим необходимо установить пакет bind-utils с помощью команды:
sudo dnf install bind-utils
.
dig your-domain.com txt
Параметр txt указывает dig, что необходимо выполнить запрос исключительно для TXT-записей.

Вы можете воспользоваться онлайн-валидатором SPF, например spf. myisp. ch, чтобы проверить, какие серверы имеют право отправлять письма от имени вашего домена, и исправить возможные ошибки в SPF-записи. Инструмент от dmarcian также пригодится для проверки правильности синтаксиса вашей записи SPF.
Конфигурация SPF-политики агента
Необходимо настроить SMTP-сервер Postfix на проверку SPF-записей для входящей почты, чтобы выявлять фальшивые письма. Для начала установите требуемые пакеты:
sudo dnf install epel-release sudo dnf install pypolicyd-spf
Далее создайте пользователя для policyd-spf.
sudo adduser policyd-spf --user-group --no-create-home - s /bin/false
Измените конфигурационный файл основного процесса Postfix.
sudo nano /etc/postfix/master.cf
В конец файла необходимо добавить строки, которые указывают Postfix на запуск демона политики SPF при старте. Демон policyd-spf будет функционировать от имени пользователя policyd-spf.
policyd-spf unix - n n - 0 spawn user=policyd-spf argv=/usr/libexec/postfix/policyd-spf

Обратите внимание: не следует запускать policyd-spf в окружении chroot.
Сохраните изменения и закройте файл. Затем внесите изменения в основной конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
В конце файла следует добавить указанные строки. Первая из них устанавливает тайм-аут для агента политики Postfix (при обращении к DNS). Остальные строки будут вводить ограничения на входящие сообщения, проверяя запись SPF.
policyd-spf_time_limit = 3600 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_policy_service unix:private/policyd-spf
Сохраните изменения в файле и закройте его. После этого перезапустите Postfix.
sudo systemctl restart postfix
В следующий раз, когда вы получите электронное письмо от домена, имеющего SPF-запись, вы сможете найти результаты проверки SPF в исходном заголовке сообщения. Пример заголовка показывает, что письмо было отправлено с разрешенного хоста.
Received-SPF: Pass (mailfrom) identity=mailfrom;
Конфигурация DKIM
Среди популярных программных решений для подписания и проверки DKIM на Linux выделяются OpenDKIM и Amavis. Мы остановимся на использовании OpenDKIM, поскольку он обладает небольшой нагрузкой, а OpenDMARC не совместим с Amavis.
Установка и конфигурация OpenDKIM на CentOS 8/RHEL 8
Установите OpenDKIM из репозитория EPEL (Extra Packages for Enterprise Linux).
sudo dnf install epel-release sudo dnf install opendkim opendkim-tools perl-Getopt-Long
Измените основной файл конфигурации OpenDKIM.
sudo nano /etc/opendkim.conf
Укажите следующую строку.
Mode v
По умолчанию OpenDKIM функционирует в режиме проверки (v), что позволяет ему проверять подписи DKIM для поступающих электронных писем. Чтобы подписывать исходящие сообщения, необходимо изменить эту строку на следующую, чтобы активировать режим подписи.
Mode sv
После этого найдите следующие строки.
Если проверка подписи не удалась, и подпись содержала запрос на отчет (“r=y”), а домен, осуществляющий подпись, предоставляет адрес для отчетов (т. е. ra=user) в своей DNS-записи, OpenDKIM направит структурированный отчет на указанный адрес. Этот отчет будет включать информацию, необходимую для анализа возникшей проблемы. Для отправки отчета вы можете использовать конкретный адрес электронной почты в поле From. Для этого необходимо раскомментировать параметр ReportAddress и указать нужный адрес электронной почты. Учтите, что это не вызовет проблемы с обратной связью, так как отчеты будут отправляться на адрес, указанный в DNS-записи домена отправителя.
Найдите следующую строку и закомментируйте её, так как мы будем применять отдельные ключи для каждого домена.
KeyFile /etc/opendkim/keys/default. private
Затем откройте следующие четыре строки и уберите символы комментария.
# KeyTable /etc/opendkim/KeyTable # SigningTable refile:/etc/opendkim/SigningTable # ExternalIgnoreList refile:/etc/opendkim/TrustedHosts # InternalHosts refile:/etc/opendkim/TrustedHosts
Сохраните изменения и закройте документ.
Формирование таблицы подписей, ключевой таблицы и документа с доверенными хостами.
Пожалуйста, внесите изменения в файл с таблицей подписей.
sudo nano /etc/opendkim/SigningTable
Вставьте следующую строку в конец файла. Это указывает OpenDKIM, что если отправитель на вашем сервере использует адрес @your-domain.com, его сообщения должны подписываться частным ключом, который определяется как 20200308._domainkey. your-domain.com.
*@your-domain.com 20200308._domainkey.your-domain.com
20200308 — это селектор DKIM, который позволяет выбрать определённый ключ DKIM для доменного имени, которое может иметь несколько таких ключей. Вы можете использовать любое название для селектора DKIM, но мне удобно использовать текущую дату (8 марта 2020 года). После этого сохраните файл и закройте его, затем отредактируйте файл таблицы ключей.
sudo nano /etc/opendkim/KeyTable
Вставьте следующую строку, указывающую путь к файлу с приватным ключом DKIM.
20200308._domainkey.ваш-домен.com ваш-домен.com:20200308:/etc/opendkim/keys/ваш-домен.com/20200308.private
Сохраните файл и закройте его. Затем выполните редактирование файла с доверенными хостами.
sudo nano /etc/opendkim/TrustedHosts
В этом файле по умолчанию уже указаны адреса 127.0.0.0.1 и ::1. Теперь необходимо добавить следующую строку. Она сообщает OpenDKIM, что если письмо поступает с вашего собственного доменного имени, то проверка DKIM для этого письма не требуется.
.ваш-домен.com
Сохраните изменения и закройте документ.
Важно: в доменное имя не следует добавлять звездочку, как в приведенном примере: *.ваш-домен.com. Перед доменным именем должна быть только точка.
Создайте пару ключей (закрытый и открытый).
DKIM применяется для подписи исходящих писем и проверки входящих. Для этого необходимо создать приватный ключ для подписания исходящей корреспонденции и публичный ключ для SMTP серверов, которые смогут проверить DKIM-подпись вашего сообщения. Публичный ключ публикуется в DNS.
Создайте специальную директорию для домена.
sudo mkdir /etc/opendkim/keys/ваш-домен.com
Используйте инструмент opendkim-genkey для создания ключей.
sudo opendkim-genkey - b 2048 - d ваш-домен.com-П /etc/opendkim/ключи/ваш-домен.com - s 20200308 - v
Эта команда создаст ключи с длиной 2048 бит. Параметр — d обозначает домен, а — D указывает на директорию для хранения ключей. В качестве селектора DKIM используется значение 20200308. После выполнения команда сохранит приватный ключ в файл 20200308.private, а публичный — в файл 20200308.txt.
По умолчанию только root имеет доступ на чтение и запись ключевых файлов. Назначьте владельцем приватного ключа пользователя opendkim.
sudo chown opendkim:opendkim /etc/opendkim/keys/ - R
Разместите ваш открытый ключ в записях DNS.
Покажите открытый ключ.
sudo cat /etc/opendkim/keys/ваш-домен.com/20200308.txt
Публичный ключ следует за параметром p.
В вашем DNS-менеджере добавьте запись типа TXT, указав в поле имени 20200308._domainkey (замените 20200308 на ваш собственный селектор DKIM). Затем вернитесь в терминал, скопируйте всё содержимое в скобках и вставьте его в поле значения записи DNS. Убедитесь, что удалили все двойные кавычки и переносы строк из значения. В противном случае тест ключа на следующем этапе может завершиться неудачей.
Проведите проверку DKIM-ключа.
Запустите следующую команду на сервере CentOS 8/RHEL 8, чтобы проверить ваш ключ.
sudo opendkim-testkey - d ваш-домен.com - s 20200308 - vvv
Если всё прошло успешно, отобразится сообщение с ключом OK.
opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key '20200308._domainkey. linux16.ru' opendkim-testkey: key OK
Учтите, что процесс распространения вашей DKIM-записи в сети может занять некоторое время. Время обновления DNS-записи зависит от вашего доменного регистратора: это может произойти сразу или занять до 24 часов. Чтобы проверить состояние записи DKIM, можно перейти на сайт https://www.dmarcanalyzer.com/dkim/dkim-check/, ввести селектор 20200308 и указать ваше доменное имя.
Если вы обнаружили сообщение «Ключ не защищен», не стоит беспокоиться. Это связано с тем, что для вашего доменного имени не активирован DNSSEC. DNSSEC представляет собой стандарт безопасности, предназначенный для защиты DNS-запросов. Большинство доменных имен не используют активированный DNSSEC. Вы можете продолжать следовать этому руководству.
Теперь мы можем инициировать работу службы opendkim.
sudo systemctl start opendkim
И настроить автоматический запуск при загрузке системы.
sudo systemctl enable opendkim
OpenDKIM принимает подключения на 127.0.0.1:8891.
Настройка Postfix для работы с OpenDKIM
Измените главный конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
Включите указанные строки в конец данного файла, чтобы Postfix мог взаимодействовать с OpenDKIM через протокол milter. Учтите, что необходимо использовать адрес 127.0.0.1, а не localhost.
# Конфигурация Milter milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters
Сохраните файл и закройте его. После этого добавьте пользователя postfix в группу opendkim.
sudo gpasswd - a postfix opendkim
Перезапустите службу Postfix.
sudo systemctl restart postfix
Проверка SPF и DKIM-записей.
Теперь у вас есть возможность отправить тестовое сообщение с вашего почтового сервера на аккаунт Gmail для проверки работы SPF и DKIM. С правой стороны открытого письма в Gmail, нажав на кнопку «Показать оригинал» в выпадающем меню, вы сможете ознакомиться с результатами аутентификации.
Если ваше сообщение не имеет подписи и проверка DKIM не была успешной, вам следует изучить журнал postfix (/var/log/maillog), чтобы выяснить, в чем проблема с вашей конфигурацией. Ваш почтовый сервер также проверяет SPF и DKIM для домена отправителя. Результаты этих проверок можно увидеть в заголовках электронной почты. Ниже представлены результаты проверки SPF и DKIM для отправителя, использующего Gmail.
Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::c2d; helo=mail-yw1-xc2d. google.com; [email protected]; receiver= Authentication-Results: mail.linux16.ru; dkim=pass (2048-bit key; unprotected) header. d=gmail.com [email protected] header. b="XWMRd2co"; dkim-atps=neutral
Некорректная настройка в почтовом приложении.
Подпись DKIM может не функционировать должным образом, если в вашем почтовом клиенте неправильно настроены параметры SMTP или IMAP.
Корректные параметры:
- Протокол SMTP: укажите mail.your-domain.com в качестве адреса сервера, выберите порт 587 и активируйте STARTTLS. В качестве метода аутентификации выберите стандартный пароль.
- Протокол IMAP: укажите mail.your-domain.com в качестве адреса сервера, выберите порт 143 и активируйте STARTTLS. В качестве метода аутентификации выберите обычный пароль.
- Протокол SMTP: укажите mail.your-domain.com в качестве сервера, выберите порт 465 и активируйте SSL/TLS. В качестве метода аутентификации выберите стандартный пароль.
- Протокол IMAP: введите mail.your-domain.com в качестве адреса сервера, установите порт 993 и выберите SSL/TLS. В качестве способа аутентификации выберите стандартный пароль.
Неверные конфигурации:
- Для отправки исходящих писем в почтовых клиентах настройте использование порта 25 в качестве SMTP.
- Метод шифрования не был выбран.
Порт 25 предназначен для обмена данными между SMTP-серверами. Рекомендуется не применять его в почтовом клиенте для отправки исходящих сообщений.
Необходимо выбрать способ шифрования (STARTTLS или SSL/TLS) в вашем почтовом клиенте.
Оценка и тестирование электронной почты и её размещения.
Теперь вы можете зайти на сайт https://www.mail-tester.com. Там будет представлен уникальный адрес электронной почты. Отправьте письмо с вашего домена на этот адрес, а затем оцените результат. Как видно, я получил отличный рейтинг.

Сайт Mail-tester.com предоставляет только оценку отправителя. Существует также сервис под названием GlockApps, который позволяет узнать, попало ли ваше сообщение в папку входящих, оказалось в спаме или было отклонено. Он совместим со многими известными почтовыми сервисами, включая Gmail, Outlook, Hotmail, YahooMail, iCloud mail и другие.

Почтовые службы Microsoft (Hotmail.com, Outlook.com)
Microsoft, похоже, применяет внутренний список заблокированных IP-адресов, что приводит к блокировке многих законных отправителей. Если ваши письма не доходят до адресатов в Outlook или Hotmail, необходимо отправить форму с данными отправителя. После этого письма будут доставлены, но могут оказаться в папке «Спам». В моем тесте письмо было доставлено в основной ящик Gmail, однако в Outlook оно всё равно попало в спам, несмотря на успешную проверку SPF и DKIM.
Как поступить, если ваши письма всё ещё попадают в папку «спам»?
Вот еще несколько рекомендаций в статье: Как предотвратить попадание ваших писем в папку со спамом.
Следующий этап
В пятой части мы разберем процесс создания записи DMARC для защиты вашего домена от подделки электронных писем. Если этот материал был вам полезен, подписывайтесь на нашу бесплатную рассылку для получения большего количества интересных статей, а также следите за нами в Twitter или ставьте лайки на нашей странице в Facebook.

