Настройка DKIM и SPF на Ubuntu 12.04 + Sendmail
Наличие DKIM на отправляемой корреспонденции крайне положительно сказывается на прохождении antispam тестов, поэтому лучше бы её настроить.
Краткий принцип работы заключается в том, что на сервере лежит закрытый ключ, которым подписываются исходящие письма. Удалённый почтовый сервер (Яндекс или Google) при получении письма видит в заголовках эту подпись и проверяет ее путем запроса открытого ключа из DNS домена.
Пример заголовка с DKIM:
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=modx-test.com; s=mail; t=1378025116; bh=E27pqP5aWa/XXOeVzzjMW+iw0W7wbbCe2B4toIRxP9M=; h=To:Subject:Date:From:Reply-To:From; b=GqprdvEYgq/Ff95fCDNzV4k1JLaMA9Pz5p5PUyv2bI0UVZ/S1xl6IyAZK4j3FwMCW 5cLe4IGcmnd+dNzNhe2bSj/kCIJg7ZyLM3mXAzEirGXdiqCc/LAZQOGR7udbMmm5YP 42pkMa2lI9FqKxAKq5BrtXbrWE+n+Mxc5dpQcGMw=
Если подпись, сгенерированная сервисом, используя содержимое письма и открытой подписи совпадает с той, что указана в заголовке, значит — письмо настоящее и его не модифицировали после отправки с родного сервера.
Если нет — это подделка и, скорее всего, спам.
Под катом пошаговое how-to с картинками, для серверов, настроенных по этой инструкции, как научить Sendmail работать с DKIM.
Настройка
Обновляем индекс пакетов и устанавливаем opendkim:
sudo apt-get update sudo apt-get install opendkim
Приводим /etc/opendkim.conf к следующему виду:
Syslog yes UMask 002 Domain имявашегодомена.ru KeyFile /etc/mail/dkim.key Selector mail SubDomains yes OversignHeaders From Socket inet:8891@localhost
В параметре Domain можно указать несколько доменов, через пробел. Вся почта от них, и их поддоменов будет подписана DKIM.
Например
Domain bezumkin.ru modx-test.com
подпишет все письма от modx23.modx-test.com, от bezumkin.ru, от tefile.modx-test.com и т.д.
Теперь нам нужно сформировать ключи (закрытый и открытый) на сервисе DKIMCore. Вводим имя своего домена и кликаем generate.
В результате получаем 2 ключа
Первый ключ, закрытый, нужно сохранить в /etc/mail/dkim.key. Обязательно задаём права для чтения только владельцем (root), иначе opendkim не запустится:
chmod 0600 /etc/mail/dkim.key
Этот закрытый ключ будет подписывать всю исходящую почту от указанных доменов в конфиге. Чтобы удалённый почтовый сервис мог проверить эту подпись, мы должны указать открытый ключ в DNS.
Для этого создаём новый домен mail._domainkey и добавляем в него только одну TXT запись:
v=DKIM1;k=rsa;t=s;p=здесь открытый ключ
Такие поддомены нужно создать для всех указанных доменов. Правильность указания можно проверять в консоли вот так:
dig mail._domainkey.modx-test.com TXT
Вот мой открытый ключ. Имейте в виду, что записи в DNS обновляются далеко не сразу.
Теперь осталось только заставить sendmail отдавать исходящие письма на подпись. Для этого добавляем в конец файла/etc/mail/sendmail.mc, строку:
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')dnl
Конвертируем этот файл в конфиг
m4 sendmail.mc > sendmail.cf
И перезапускаем сервисы
service opendkim restart service sendmail restart
Консольная команда netstat -nlp должна показывать, что sendmail и opendkim слушают свои порты, то есть — работают.
Проверяем подпись
Для проверки работы DKIM, нужно отправить письмо на сервис, который его проверяет (а это почти все публичные почтовики), например — на Яндекс.
Это можно сделать из консоли:
echo -e "To: вашемаил@yandex.ru\\nFrom: noreply@вашдомен.ru\\nSubject: Test\\nTest\\n" | sendmail -bm -t -v
Или прямо с сайта MODX, при помощи пакета QuickEmail.
[[!QuickEmail? &to=`вашемаил@yandex.ru` &debug=`1` ]]
С сегодняшнего дня, все письма с bezumkin.ru и modx-test.com подписываются DKIM.
Настройка SPF
Есть еще одна технология, попроще — это SPF.
Она позволяет указать в DNS, какие серверы могут отправлять посту от имени вашего домена. Делается это так же записью TXT, но уже не поддомену, а самому основному домену, или записи @ (если есть):
v=spf1 ip4:151.236.219.215 ip6:2a01:7e00::f03c:91ff:feae:4fa1 a ~all
Здесь указаны 2 ip адреса (версий 4 и 6), которые могут отправлять письма от моего домента. ~all разрешает мягкую проверку. То есть, даже если тест SPF не проходит, то письма будут приняты удалённым сервисом, но он обратит на них повышенное внимание.
Сочетание настроенных SPF и DKIM сводит вероятность попадания писем от вашего сервера в спам практически к нулю.
Смотреть результаты тестов нужно в заголовках принятого письма.
Вот, что говорит Яндекс:
Authentication-Results: mxfront4m.mail.yandex.net; spf=pass (mxfront4m.mail.yandex.net: domain of modx-test.com designates 151.236.219.215 as permitted sender) smtp.mail=info@modx-test.com; dkim=pass header.i=@modx-test.com
А вот — Google:
Received-SPF: pass (google.com: domain of noreply@bezumkin.ru designates 2a01:7e00::f03c:91ff:feae:4fa1 as permitted sender) client-ip=2a01:7e00::f03c:91ff:feae:4fa1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of noreply@bezumkin.ru designates 2a01:7e00::f03c:91ff:feae:4fa1 as permitted sender) smtp.mail=noreply@bezumkin.ru; dkim=pass header.i=@bezumkin.ru
Обратите внимание, мой сервер на Linode общается с Google через ipv6. Но независимо от способа соединения, вы должны видеть spf=pass и dkim=pass.
Обновлено 30.06.2016
Судя по всему, настройка для нескольких доменов уже не работает. Для этого нужно делать так —dev.kafol.net/2013/01/dkim-spf-sendmail-for-multiple-domains.html