Предисловие


На моем сервере крутится интернет-магазин освещения sevenlight.ru и интернет-магазин строительных материалов st-goods.ru До истории с блокировками Роскомнадзора мы собирали трафик около 2000 посещений в сутки, а почтовый сервер отправлял в сутки около 200 писем на все популярные почтовые сервисы, в т.ч. Гугл и Яндекс. Все было здорово. Но как говорится в известном ролике: «Все было так хорошо, пока не пришел Роскомнадзор!» Теперь, когда нам удалось найти хостера, чьи IP адреса не попадают под блокировки государственной цензуры появилась другая проблема.

Недавно я обнаружил, что мои письма mx сервер google выбрасывает мою почту с примерно следующим сообщением: «Твое сообщение похоже на нежелательное, до свидания».

log соединения sendmail
050 <legale.legale@gmail.com>... Connecting to gmail-smtp-in.l.google.com. via esmtp...
050 220 mx.google.com ESMTP v6-v6si38552789wrc.432 - gsmtp
050 >>> EHLO sevenlight.ru
050 250-mx.google.com at your service, [2a02:c207:2018:3546::1]
050 250-SIZE 157286400
050 250-8BITMIME
050 250-STARTTLS
050 250-ENHANCEDSTATUSCODES
050 250-PIPELINING
050 250-CHUNKING
050 250 SMTPUTF8
050 >>> STARTTLS
050 220 2.0.0 Ready to start TLS
050 >>> EHLO sevenlight.ru
050 250-mx.google.com at your service, [2a02:c207:2018:3546::1]
050 250-SIZE 157286400
050 250-8BITMIME
050 250-ENHANCEDSTATUSCODES
050 250-PIPELINING
050 250-CHUNKING
050 250 SMTPUTF8
050 >>> MAIL From:<root@sevenlight.ru> SIZE=297
050 250 2.1.0 OK v6-v6si38552789wrc.432 - gsmtp
050 >>> RCPT To:<legale.legale@gmail.com>
050 >>> DATA
050 250 2.1.5 OK v6-v6si38552789wrc.432 - gsmtp
050 354 Go ahead v6-v6si38552789wrc.432 - gsmtp
050 >>> .
050 550-5.7.1 [2a02:c207:2018:3546::1 7] Our system has detected that this
050 550-5.7.1 message is likely unsolicited mail. To reduce the amount of spam sent
050 550-5.7.1 to Gmail, this message has been blocked. Please visit
050 550-5.7.1 https://support.google.com/mail/?p=UnsolicitedMessageError
050 550 5.7.1 for more information. v6-v6si38552789wrc.432 - gsmtp


Этой командой я пытался отправить тестовое сообщение.

echo "Subject: Hello baby!" | sendmail -v legale.legale@gmail.com

Писать о своих танцах с бубном в попытках пробиться через спам-фильтры я не буду. Скажу только, что провозился я всю ночь, но добиться успеха смог только на следующий день. Именно поэтому я и решил написать сей мануал.

Инструкция по настройке SFP+DKIM на UBUNTU 18.04


У меня на сервере крутится несколько доменов, поэтому настройки будут для такой мультидоменной конфигурации.

1. Устанавливаем нужные пакеты


apt-get install sendmail opendkim -y

Настраиваем opendkim


1. Конфиг лежит тут: /etc/opendkim.conf

Пример моего конфига
AutoRestart Yes
UMask 002
Syslog yes
AutoRestartRate 10/1h
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts

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

LogWhy Yes
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
Socket inet:8891@localhost
SyslogSuccess Yes
TemporaryDirectory /var/tmp
UserID opendkim:opendkim


2. Настраиваем ключи и правила подписывания

Я опишу процедуру по созданию собственных ключей для тех, кто хочет полной автономности. Лично у меня используется яндексовый сервис «Почта для домена» pdd.yandex.ru, поэтому у меня ключи сгенерированные яндексом.

#сначала делаем каталог
mkdir -p /etc/opendkim/keys/st-goods.ru
#переходим туда
cd /etc/opendkim/keys/st-goods.ru
#делаем ключи
#-s определяет селектор -d домен для которого делать ключ
opendkim-genkey -s mail -d st-goods.ru
#должны появится 2 файла mail.txt с открытым ключом и mail.private с закрытым
#назначим владельцем файлов ключей opendkim:opendkim
chown opendkim:opendkim mail.*
#ограничим доступ к секретному ключу
chmod 600 mail.private

Подключаем наш секретный ключ opendkim


Нас интересуют вот эти три строчки из конфига opendkim:

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

В первом файле /etc/opendkim/TrustedHosts хранятся хосты, которые будут иметь доступ к серверу opendkim для подписывания писем.

/etc/opendkim/TrustedHosts
127.0.0.1
localhost
sevenlight.ru
st-goods.ru

Во втором файле /etc/opendkim/KeyTable хранится таблица секретных ключей и связанных с ними записей DKIM, которые представляют из себя следующее: [selector]._domainkey.[domain_name]

/etc/opendkim/KeyTable
mail._domainkey.sevenlight.ru sevenlight.ru:mail:/etc/opendkim/keys/sevenlight.ru/mail.private
mail._domainkey.st-goods.ru st-goods.ru:mail:/etc/opendkim/keys/st-goods.ru/mail.private

В третьем файле лежит таблица правил подписывания писем. Тут указано чьи письма и каким именно ключом подписывать.

/etc/opendkim/SigningTable
*@sevenlight.ru mail._domainkey.sevenlight.ru
*@st-goods.ru mail._domainkey.st-goods.ru

На этом настройка opendkim закончена.

Настройка sendmail


Настройка sendmail максимально проста. Нам всего лишь нужно указать в файле прототипа конфига /etc/mail/senmail.mc следующие строчки:

#Эта строка включает поддержу starttls
include(`/etc/mail/tls/starttls.m4')dnl
#Заставим sendmail пропускать письма через opendkim
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')dnl

Ищем строку: MASQUERADE_AS(`st-goods.ru')dnl

Меняем на наш домен по умолчанию. Именно этот домен будет использован в качестве обратного адреса по умолчанию. Обратите внимание, что кавычки там разные — так зачем-то заведено в конфиге sendmail.

Теперь добавим записи в файл /etc/hosts Это нужно для того, чтобы sendmail пропускал письма через фильтр. Опытным путем установлено, что если не добавлять записей, все логи остаются девственно чистыми, не показывая ни одной ошибки, однако письма не подписываются.

#ipv4
echo -e "127.0.0.1 st-goods.ru" >> /etc/hosts
#ipv6
echo -e "::1 st-goods.ru" >> /etc/hosts

Теперь надо пересобрать sendmail с новыми настройками

#запускаем скрипт 
#на все вопросы отвечаем "да"
sendmailconfig
#перезапускам службы opendkim и sendmail
service opendkim restart && service sendmail restart

Теперь наш сервер sendmail умеет пропускать исходящие письма через сервер opendkim, который добавляет цифровую подпись и шифрует заголовки отправляемых писем. Осталось опубликовать для принимающей стороны открытый ключ, чтобы можно было расшифровать заголовки и удостоверится, что заголовки не изменялись.

Настройки DKIM TXT записи


Ключ надо подвесить на DNS сервере в строке типа TXT следующего содержания:
хост:

mail._domainkey

значение:

v=DKIM1; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2wtGTw/5KPjtlIEh282JY7ovxZ/8eqveFn9ivhzpYJldl3fBEOKwGfasDunQnTk+SokncTlR4v86qLlde9892zs0RKuJe5o//uS9pN7IsIunRlD5e1rP3eN7pWbQ1byEYLziLvEr6Ssi2Kmynzyp74uacVMFdY7mt8jnCvpIEAQIDAQAB

«p=» это наш открытый ключ
«v=» определяет номер версии DKIM
«t=» устанавливает флаги, по умолчанию флаги не устанавливаются. Существует 2 флага «y» и «s».
«y» говорит о том, что DKIM работает в тестовом режиме.
«s» означает режим, когда правая часть почтового адреса после @ должна полностью совпадать с доменом указанным в параметре d= DKIM подписи письма.

Хост надо указать в следующем виде: [selector]._domainkey
У нас селектор mail, поэтому хост будет таким: mail._domainkey

Открытый ключ мы смотрим в файле /etc/opendkim/keys/st-goods.ru/mail.txt

Вот пример моего файла:

/etc/opendkim/keys/st-goods.ru
mail._domainkey IN TXT ( «v=DKIM1; h=sha256; k=rsa; „
p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsLFjSAqvfSrjvF0JfMkiSzqWRhXwwVPzW5OEtRFSoDVBwDxR6hMna1iESnUQ1OzbUQQPnDPbrFXkalDCAXigZqltTSAV+JQSyOwhi0b88WS3djb1IkA/qioCobjlhMFSatvcmz5kMkG8oeoHhVFQ/BE84PwDPTXRmcObDvg7meUmkYpdxeyr+tcG5ezuC+s15I00+6NSAaj0Tj»
«Y/Bl2e2TE/WG45wVShlQ85E8IpYixscd0qDJ9/NbZrbWIfy8shujWVk5izNU4PqcWwW7/H9uTkhAbMu0fgqT8W9Jv/GRVAireOCzMl13E9PVANt4o+ywqyGk38vSY8QdgJsZPDUQIDAQAB» ); — DKIM key mail for st-goods.ru

Ключ выделен жирным.

Настройка SPF


SPF (Sender Policy Frameword) это еще 1 технология защиты от спама, рассказывать про нее не буду. Только 2 слова для понимания сути этой технологии. В DNS записи домена аналогично открытому ключу DKIM записываются адреса серверов, которые имеют право отправлять почту с этого домена. Нам нужно прописать в этой записи ip адреса своего сервера. В моем случае в список также добавлен сервер яндекса.

Вот пример моей записи:
хост:
@

значение:
v=spf1 a mx include:_spf.yandex.net ip4:173.249.51.13 ip6:2a02:c207:2018:3546::1 ~all

Синтаксис простой: Сначала указывается версия spf, а потом через пробел с плюсом или бзе него указываются адреса серверов, которые имеют или не имеют право слать почту с этого домена. У меня указаны записи a и mx, что означает, что серверы из DNS записей A и MX тоже входят в список разрешенных. Через include: указан адрес сервера яндекса, а дальше ipv4 и ipv6 адреса моего сервера.

~all означает softfail «мягкий отказ». Т.е. все адреса, которые не перечислены в разрешенных все таки могут пройти по усмотрению принимающего сервера. -all означал бы жесткий отказ.

Настройка DMARC


Последний гвоздь для проникновения в бастион gmail — DMARC. DMARC устанавливает что нужно делать с письмами, которые не проходят проверку SPF или DKIM.
Все делаем точно также через DNS запись типа TXT.
хост: _dmarc

значение:

v=DMARC1; p=none

Здесь мы устанавливаем, что если письма не прошли SPF или DKIM ничего делать не надо. Можно поставить p=reject. Тогда такие письма будут забракованы.

Проверка


Отправляем себе письмо.

echo "Subject: Hello baby!" | sendmail -v legale.legale@gmail.com

Смотрим последние записи лога почты

tail -f /var/log/mail.log | grep dkim

Там должна появится строка похожая на эту:

Jun 11 22:07:55 sevenlight opendkim[6473]: w5BK7sl9008069: DKIM-Signature field added (s=mail, d=st-goods.ru)

Если такой строки нет, смотри раздел «Возможные проблемы».

Теперь смотрим, что получилось в почтовом ящике.

Вот что получилось у меня:

Message ID <201806112007.w5BK7sUS008068@sevenlight.ru>
Created on: 11 June 2018 at 22:07 (Delivered after 2 seconds)
From: info@st-goods.ru
To: legale.legale@gmail.com
Subject: Заказ №2221 Интернет-магазин напольных покрытий st-goods.ru
SPF: PASS with IP 2a02:c207:2018:3546:0:0:0:1 Learn more
DKIM: 'PASS' with domain st-goods.ru Learn more
DMARC: 'PASS' Learn more


PROFIT$$$

Возможные проблемы


сначала проверьте /etc/hosts на предмет корректности изменений. Проверьте системный лог на предмет ошибок dkim. Пока я ковырялся мне довелось столкнуться с ситуацией невозможности чтения службой dkim секретного ключа, но чаще всего проблемы были вызваны отсутствием или некорректностью записей в /etc/hosts Хотя кажется что уж там-то негде ошибиться.

Комментарии (4)


  1. nikitasius
    12.06.2018 17:51

    На моем сервере крутится интернет-магазин освещения sevenl...

    НЛО, вы серьезно это пропустили?


  1. mwizard
    12.06.2018 18:22

    Ого, а вы могли бы указать, какие сайты крутятся на вашем сервере?


  1. LumberJack
    12.06.2018 18:40

    Я дико извиняюсь, но как связано

    «Все было так хорошо, пока не пришел Роскомнадзор

    и
    google выбрасывает мою почту с примерно следующим сообщением: «Твое сообщение похоже на нежелательное, до свидания».


    Подозреваю я, что кого-то достали вы со своим спамом и угодили в чёрный список гугля.


  1. SkyCat
    12.06.2018 18:40

    Удивительно, как раньше почта ходила. Судя по всему, DKIM только сейчас прикрутили. Боюсь спрашивать, а PTR-запись у вас есть?