Предисловие
На моем сервере крутится 2 отдельных домена. До истории с блокировками Роскомнадзора мы собирали трафик около 2000 посещений в сутки, а почтовый сервер отправлял в сутки около 200 писем на все популярные почтовые сервисы, в т.ч. Гугл и Яндекс. Все было здорово. Но как говорится в известном ролике: «Все было так хорошо, пока не пришел
Теперь, когда нам удалось найти хостера, чьи IP адреса не попадают под блокировки государственной цензуры появилась другая проблема. Корпорация добра Гугл перестала дальше порога пускать нашего почтальона.
MX сервер google выбрасывает мою почту с примерно следующим сообщением: „Твое сообщение похоже на нежелательное, давай до свидания...“
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
Писать о своих танцах с бубном в попытках пробиться через спам-фильтры я не буду. Скажу только, что провозился я всю ночь, но добиться успеха смог только на следующий день. Именно поэтому я и решил написать сей мануал.
ИНСТРУКЦИЯ ПО НАСТРОЙКЕ SPF+DKIM НА UBUNTU 18.04
Крутизна данной инструкции в том, что она работает, в отличие от множества других. Я гарантирую, что как минимум 2 домена на 1 сервере ты сможешь настроить без особого труда.
1. Устанавливаем нужные пакеты
apt-get install sendmail opendkim -y
2. Настраиваем opendkim
Конфиг лежит тут: /etc/opendkim.conf
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
3. Настраиваем ключи и правила подписывания
Я опишу процедуру по созданию собственных ключей для тех, кто хочет полной автономности. Лично у меня используется яндексовый сервис «Почта для домена» pdd.yandex.ru, поэтому у меня ключи сгенерированные Яндексом.
#сначала делаем каталог
mkdir -p /etc/opendkim/keys/*****.ru
#переходим туда
cd /etc/opendkim/keys/******.ru
#делаем ключи
#-s определяет селектор -d домен для которого делать ключ
opendkim-genkey -s mail -d ******.ru
#должны появится 2 файла mail.txt с открытым ключом и mail.private с закрытым
#назначим владельцем файлов ключей opendkim:opendkim
chown opendkim:opendkim mail.*
#ограничим доступ к секретному ключу
chmod 600 mail.private
Далее подключаем наш созданный или загруженный у Яндекса секретный ключ DKIM.
Нас интересуют вот эти три строчки из конфига opendkim:
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
В первом файле
/etc/opendkim/TrustedHosts
хранятся хосты, которые будут иметь доступ к серверу opendkim для подписывания писем.localhost
######.ru
******.ru
Во втором файле
/etc/opendkim/KeyTable
хранится таблица секретных ключей и связанных с ними записей DKIM, которые представляют из себя следующее: [selector]._domainkey.[domain_name]
mail._domainkey.st-goods.ru st-goods.ru:mail:/etc/opendkim/keys/st-goods.ru/mail.private
В третьем файле
/etc/opendkim/SigningTable
лежит таблица правил подписывания писем. Тут указано чьи письма и каким именно ключом подписывать.*@st-goods.ru mail._domainkey.st-goods.ru
Создаем эти файлы, указывая свой домен и свой путь к файлу ключа. На этом настройка opendkim закончена.
4. Настройка sendmail
Настройка sendmail максимально проста. Нам всего лишь нужно добавить в конец файла прототипа конфига
/etc/mail/sendmail.mc
следующие строчки:#Эта строка включает поддержу starttls
include(`/etc/mail/tls/starttls.m4')dnl
#Заставим sendmail пропускать письма через opendkim
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')dnl
Чтобы почта по умолчанию отправлялась с правильного домена надо сделать еще одно изменение в файле
/etc/mail/sendmail.mc
Ищем строку, похожую на эту:
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, который добавляет цифровую подпись и шифрует заголовки отправляемых писем. Осталось опубликовать для принимающей стороны открытый ключ, чтобы можно было расшифровать заголовки и удостоверится, что заголовки не изменялись.
5. Настройки DKIM TXT записи на DNS сервере
Ключ надо подвесить на DNS сервере в строке типа TXT следующего содержания:
хост:
mail._domainkey
значение:
v=DKIM1; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2wtGTw/5KPjtlIEh282JY7ovxZ/8eqveFn9ivhzpYJldl3fBEOKw
Пояснения:
p=
это наш открытый ключv=
определяет номер версии DKIMt=
устанавливает флаги, по умолчанию флаги не устанавливаются. Существует 2 флага 'y' и 's'. y
говорит о том, что DKIM работает в тестовом режиме. s
означает режим, когда правая часть почтового адреса после @ должна полностью совпадать с доменом указанным в параметре d= DKIM подписи письма.Хост надо указать в следующем виде:
[selector]._domainkey
У нас селектор mail, поэтому хост будет таким:
mail._domainkey
Открытый ключ надо вытащить из файла
/etc/opendkim/keys/st-goods.ru/mail.txt
“p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsLFjSAqvfSrjvF0JfMkiSzqWRhXwwVPzW5OEtRFSoDVBwDxR6hMna1iESnUQ1OzbUQQPnDPbrFXkalDCAXigZqltTSAV+JQSyOwhi0b88WS3djb1IkA/qioCobjlhMFSatvcmz5kMkG8oeoHhVFQ/BE84PwDPTXRmcObDvg7meUmkYpdxeyr+tcG5ezuC+s15I00+6NSAaj0Tj»
«Y/Bl2e2TE/WG45wVShlQ85E8IpYixscd0qDJ9/NbZrbWIfy8shujWVk5izNU4PqcWwW7/H9uTkhAbMu0fgqT8W9Jv/GRVAireOCzMl13E9PVANt4o+ywqyGk38vSY8QdgJsZPDUQIDAQAB» ); — DKIM key mail for st-goods.ru
Ключ выделен жирным.
6. Настройка 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 означал бы жесткий отказ.
7. Настройка 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)
Если строка есть, значит сервер sendmail и opendkim сработались и подписали твое письмо. Если такой строки нет, смотри раздел «Возможные проблемы».
Теперь смотрим, что получилось в почтовом ящике. Открываем письмо и нажимаем в правом верхнем углу письма кнопку со стрелкой вниз. В выпадающем меню выбираем пункт «Show original».
Вот что получилось у меня:
Message ID <201806112007.w5BK7sUS008068@******.ru>
Created on: 11 June 2018 at 22:07 (Delivered after 2 seconds)
From: info@*****.ru
To: legale.legale@gmail.com
Subject: Заказ №2221 Интернет-магазин напольных покрытий ******.ru
SPF: PASS with IP 2a02:c207:2018:3546:0:0:0:1 Learn more
DKIM: 'PASS' with domain *****.ru Learn more
DMARC: 'PASS' Learn more
PROFIT$$$
Возможные проблемы
Я искренне надеюсь, что нужды читать этот раздел не будет, но техника — вещь сложная… Иногда не понятно кто на кого работает.
Сначала проверяем все ли ты сделал в точной последовательность указанной в инструкции.
Сначала проверяем файл /etc/hosts на предмет корректности изменений в нем. У меня больше всего проблем было именно там. Дальше проверим системный лог на предмет ошибок dkim. Пока я ковырялся мне довелось столкнуться с ситуацией невозможности чтения opendkim секретного ключа, хотя я назначил владельцем файла пользователя opendkim. Дальше следует внимательно изучить лог выполнения команды sendmailconfig У меня был случай, что я использовал обычную одиночную кавычку вместо положенного грависа, а sendmailconfig ругался на это. Если ничего не помогло напиши мне и keep trying.
Комментарии (18)
axilirator
28.06.2018 16:13В чем заключается полезная нагрузка данной статьи?
«SPF и DKIM — это такие технологии защиты, но рассказывать о них я не буду».
Существует довольно много гайдов, как правильно настроить отправку писем, причем с довольно подробным описанием этих «технологий защиты». Зачем дублировать?johovich Автор
28.06.2018 19:41-2Ты сделай по такому гайду, а потом спрашивать будешь: "В чем польза?"
demimurych
28.06.2018 16:58Вообще то Шифрование+DKIM+SPF+DMARC это как бы стандарт де факто для современного почтового сервера, по крайней мере там, где администратор не хочет получать выговоры за «пропавшую в спаме» почту.
johovich Автор
28.06.2018 19:43В нашей деревне об этом не знали, пока все работало само собой. Возможно хостер был более авторитетный для гугла.
ArsenAbakarov
29.06.2018 16:14А может быть вы просто не знали что оно работало криво? Правильно выше написали, SPF, DKIM, DMARC — стандарты, а если еще хотите чтобы google не рисовал красный замочек в письме, то еще и TLS/SSL надо настраивать.
Кстати, почему sendmail?johovich Автор
29.06.2018 18:41Без особой причины. Просто ничего больше, чем письма от CRON и mail() у PHP не требовалось, а sendmail с задачей справлялся.
tenhi_shadow
28.06.2018 17:06даже mail.ru ещё в 16 году об этом писал
corp.mail.ru/ru/press/releases/9593
и вполне себе нормальные инструкции уже 100 раз тут были.
Единственное, что стоит добавить — публичный ключ 2048 DKIM не всегда влезает в поле, если вы хостите DNS у недопровайдеров.
hamnsk
28.06.2018 17:30хм а если sendmail заменить на postfix то гуглиться целая куча полезных статей, по которой можно настроить кучу всего. я например свои конфиги давно храню на гитхабе, ничего секретного в них нет.
johovich Автор
28.06.2018 19:50-3Претензии в духе: "Зачем нам это тут?" принимаются только после того, как недовольный покажет мне рабочий гайд на нужную конфигурацию.
ArsenAbakarov
29.06.2018 08:23я буквально три дня назад закончил настройку postfix + spf + dkim + dmarc + ssl, кто угадает, почему я не полез статью писать об этом?
А рабочий гайд находится в интернете — свободный доступ
valdem
29.06.2018 17:38Небольшая ремарка на счет открытого ключа. Под спойлером выделено только первая часть ключа. При создании DKIM записи надо соеденить обе части. Они разделены потому что есть ограничение на длину записи.
johovich Автор
29.06.2018 17:42Не понял. Речь про открытый ключ? AFAIK ключ между парных кавычек. А как именно он разделен?
vesper-bot
Пока вы жили на яндексе, они занимались поддержкой SPF за вас, а как переехали, ваш айпишник перестал проходить SPF от яндекса, если вы забрали ещё и домен, то SPF или MX могли и не настроить сразу, вот и получили блок. Вроде как SPF для того, чтобы пролезть в гуглпочту, хватает, во всяком случае у нас пока не настроен DKIM, а письма нормально ходят — но у нас hardfail в SPF-записи, это может влиять на гугловскую логику спам-проверок после проверки SPF.