HOWTO setup ubuntu 18.04 sendmail+DKIM+SPF+DMARC или о том как мне удалось пробиться в бастион Gmail +12



Предисловие


На моем сервере крутится 2 отдельных домена. До истории с блокировками Роскомнадзора мы собирали трафик около 2000 посещений в сутки, а почтовый сервер отправлял в сутки около 200 писем на все популярные почтовые сервисы, в т.ч. Гугл и Яндекс. Все было здорово. Но как говорится в известном ролике: «Все было так хорошо, пока не пришел Навальный Роскомнадзор!

Теперь, когда нам удалось найти хостера, чьи IP адреса не попадают под блокировки государственной цензуры появилась другая проблема. Корпорация добра Гугл перестала дальше порога пускать нашего почтальона.

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

лог соединения с SMTP сервером гугла
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

/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

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 для подписывания писем.

/etc/opendkim/TrustedHosts
127.0.0.1
localhost
######.ru
******.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 лежит таблица правил подписывания писем. Тут указано чьи письма и каким именно ключом подписывать.

/etc/opendkim/SigningTable
*@sevenlight.ru mail._domainkey.sevenlight.ru
*@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= определяет номер версии 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

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

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):

  1. vesper-bot
    /#18825105

    Пока вы жили на яндексе, они занимались поддержкой SPF за вас, а как переехали, ваш айпишник перестал проходить SPF от яндекса, если вы забрали ещё и домен, то SPF или MX могли и не настроить сразу, вот и получили блок. Вроде как SPF для того, чтобы пролезть в гуглпочту, хватает, во всяком случае у нас пока не настроен DKIM, а письма нормально ходят — но у нас hardfail в SPF-записи, это может влиять на гугловскую логику спам-проверок после проверки SPF.

  2. axilirator
    /#18825295

    В чем заключается полезная нагрузка данной статьи?

    «SPF и DKIM — это такие технологии защиты, но рассказывать о них я не буду».

    Существует довольно много гайдов, как правильно настроить отправку писем, причем с довольно подробным описанием этих «технологий защиты». Зачем дублировать?

    • johovich
      /#18826271 / -2

      Ты сделай по такому гайду, а потом спрашивать будешь: "В чем польза?"

  3. demimurych
    /#18825575

    Вообще то Шифрование+DKIM+SPF+DMARC это как бы стандарт де факто для современного почтового сервера, по крайней мере там, где администратор не хочет получать выговоры за «пропавшую в спаме» почту.

    • johovich
      /#18826277

      В нашей деревне об этом не знали, пока все работало само собой. Возможно хостер был более авторитетный для гугла.

      • ArsenAbakarov
        /#18830415

        А может быть вы просто не знали что оно работало криво? Правильно выше написали, SPF, DKIM, DMARC — стандарты, а если еще хотите чтобы google не рисовал красный замочек в письме, то еще и TLS/SSL надо настраивать.
        Кстати, почему sendmail?

        • johovich
          /#18831193

          Без особой причины. Просто ничего больше, чем письма от CRON и mail() у PHP не требовалось, а sendmail с задачей справлялся.

  4. tenhi_shadow
    /#18825621

    даже mail.ru ещё в 16 году об этом писал

    corp.mail.ru/ru/press/releases/9593
    и вполне себе нормальные инструкции уже 100 раз тут были.
    Единственное, что стоит добавить — публичный ключ 2048 DKIM не всегда влезает в поле, если вы хостите DNS у недопровайдеров.

  5. hamnsk
    /#18825731

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

  6. johovich
    /#18826305 / -3

    Претензии в духе: "Зачем нам это тут?" принимаются только после того, как недовольный покажет мне рабочий гайд на нужную конфигурацию.

  7. abashurov
    /#18827503

    2018 год. Sendmail в качестве MTA, вместо чего-нибудь нормального вроде Postfix, или Exim.

    • johovich
      /#18827513

      Вон у нас президент уже шестой десяток разменял, и ничего. Хотя он то постарше sendmail будет и надоел хуже горькой редьки. :-)

  8. ArsenAbakarov
    /#18827627

    я буквально три дня назад закончил настройку postfix + spf + dkim + dmarc + ssl, кто угадает, почему я не полез статью писать об этом?
    А рабочий гайд находится в интернете — свободный доступ

    • johovich
      /#18831179

      Хорошо, теперь есть рабочий гайд и на sendmail

  9. valdem
    /#18830923

    Небольшая ремарка на счет открытого ключа. Под спойлером выделено только первая часть ключа. При создании DKIM записи надо соеденить обе части. Они разделены потому что есть ограничение на длину записи.

    • johovich
      /#18830945

      Не понял. Речь про открытый ключ? AFAIK ключ между парных кавычек. А как именно он разделен?