В заголовках писем от CMS моего сайта я вижу такую строку
Authentication-Results: mxfront10h.mail.yandex.net; spf=softfail (mxfront10h.mail.yandex.net: transitioning domain of noteskeeper.ru does not designate 46.254.17.128 as permitted sender) smtp.mail=www-data@noteskeeper.ru
Казалось бы, правильный IP-адрес и домен, а принимающий сервер пишет, что не дозволенный отправитель. Я начал разбираться с этим вопросом и открыл для себя SPF (Sender Policy Framework), DomainKeys и DKIM (DomainKeys Identified Mail).
Оказалось, что можно обозначить определенные IP адреса разрешенными для отправки почты конкретного домена. А потом ещё и стравить цифровую подпись, удостоверяющую, что письмо действительно было отправлено с указанного сервера.
SPF
Особенностью моей ситуации было то, что вся почта обслуживается сервисом Яндекс.Почта для домена. Но и сам хост также может отправлять письма.
У меня уже была указана spf-запись, которая приводится в инструкции по настройке «Почты для домена». Мне нужно было как-то добавить IP адрес хоста в разрешенные отправители почты. Это на деле оказалось не так уж сложно:
@ IN TXT "v=spf1 a include:_spf.yandex.ru -all"
Эта конструкция предписывает считать хост, обозначенный записью A
домена, как разрешенный и далее получить ещё дополнительные правила у Яндекса.
Синтаксис и масса других примеров описаны в документации к проекту Sender Policy Framework.
dkfilter
Я решил пойти дальше и настроить цифровую подпись всех писем, которые отсылаются с моего хоста. После недолгих поисков я нашел отличное решение для своей VPS под управлением Ubuntu — dkfilter . Не буду пересказывать принцип настройки этого фильтра. Автор достаточно подробно и точно описал, что нужно сделать.
От себя добавлю несколько изменений, которые мне потребовалось внести.
Конфигурация фильтра
Мне потребовалось руками указать домен noteskeeper.ru
, так как скрипт фильтра не мог его правильно определить. Подозреваю, что это последствия какой-то ошибки конфигурирования системы. Пока я остановился на этом варианте.
Ещё я указал метод генерации подписи simple
вместо nofws
. Если я правильно понял, то это только влияет на то, как будет преобразован текст письма с заголовками прежде, чем будет вычислена сигнатура.
DNS-запись
В инструкции указано, что открытый ключ домена нужно вводить в формате
selector1._domainkey IN TXT "k=rsa; p=MHwwDQYJK ... OprwIDAQAB; t=y"
Из RFC 4870 я узнал, что вместо селектора selector1
может быть любая строка. Главное, чтобы такой же селектор был указан в конфигурации dkfilter.
Потом выяснилось, что тег t=y
обозначает режим тестирования. Когда тестирование будет закончено, этот тег стоит убрать из записи.
sendmail
Чтобы посылать тестовые сообщения я использовал sendmail. Они, к сожалению, шли в обход фильтра. В FAQ приведены настройки, которые нужно добавить в конфигурацию postfix .
Валидируем подпись домена
Received-SPF: pass (google.com: domain of mista_k@noteskeeper.ru designates 46.254.17.128 as permitted sender) client-ip=46.254.17.128;
DomainKey-Status: good
Authentication-Results: mx.google.com; spf=pass (google.com: domain of mista_k@noteskeeper.ru designates 46.254.17.128 as permitted sender) smtp.mail=mista_k@noteskeeper.ru; domainkeys=pass header.From=mista_k@noteskeeper.ru
Received: from noteskeeper.localdomain (localhost.localdomain [127.0.0.1])
by noteskeeper.localdomain (Postfix) with ESMTP id 997CD2A78003
for <mistakster@gmail.com>; Mon, 9 Apr 2012 12:57:55 +0400 (MSK)
DomainKey-Signature: a=rsa-sha1; h=Received:To:Subject:Message-Id:Date:From
b=dQHTHUU8sQCij/EDk+sv5aR8SJRuI51BBgM7LCxfihd1xNm33zUbvGo6/Csk
spYLkwaAGGINjETWGwe0qaCZJ7AEkyZYbmNcLG2xewRGZCXyIjiygZIVyqqE
L63lhDnwEzkG5aYyxPOQciVwmWuBExBTwNFKX0Q7p8s4eWUmyIM=;
c=simple; d=noteskeeper.ru; q=dns; s=email
Подпись успешно проверена.
Коментарии к заметке
Пользуюсь SPF уже несколько лет, благо вообще никакой настройки на стороне почтового севера не требует. А недавно настроил на гугле DKIM для своего домена, там тоже для этого ничего делать не потребовалось, только запись в DNS добавить. Но я всю почту шлю через гугль, а тут советы помогут тем, у кого свой smtp сервер.
Т.е. Гугл для DKIM сгенерировал тебе запись с открытым ключом, а закрытый так у него где-то в недрах остался?
Я думал просто сделать отсылку почты через Яндекс, но замутить такую хрень было гораздо интереснее.
Да, приватного ключа от DNS записи google._domainkey у меня нет. Но если я захочу слать почту и через свой сервер, то просто сделаю для него отдельную DNS запись. Tам же метка прописывается в DKIM заголовке, и от этой метки приватный ключ уже будет у меня.
Просто пока не возникало потребности слать почту автоматом, а из MUA проще слать сразу через гугль.
Тоже занялся данным вопросом, посмотрел DKIM в Exim легко настраивается и перешел на него.
Добрый день! Подскажите, пожалуйста, как решить такую задачку.
Есть домен example.com и VPS (ubuntu 12.04). на VPS прописал FQDN example.com на провайдере прописал PTR example.com правильно настроил SPF и DKIM. проблема в том, что для почты мы используем Яндекс.Почта, но и сайт может отправлять письма (счета на оплату клиентам) были опробованы sendmail и exim4
проблема при отправке почты на внутренние адреса… т.е. например сообщение с обратной связи сайта должно уходить на info@example.com , но в логах обеих программ пишется, что адресат не найдет… я так понимаю, потому что сам хост обозначен как example.com, и программы пробуют доставлять почту локально, заставить их отсылать на яндекс у меня так и не получилось. А если менять FQDN сайта, то будет подозрение на спам (отправка с локальных доменов). Насколько я знаю ip должен соответствовать домену
Антон, я отправляю любые письма с сервера только через Яндексову «Почту для домена». Для этого завёл специальный аккаунт, который может авторизоваться на их SMTP сервере. В этом случае не важно какие будут значения полей FROM и TO. Так в итоге получилось значительно проще, чем обслуживать ещё и свой SMTP сервер.
Если вам обязательно нужен локальный SMTP сервер, то стоит поискать в интернетах что-нибудь про настройку «relay» у него. Сам дельного ничего сказать по этому поводу не могу — я не настоящий админ.
изначально я пользовался их smtp, но там есть ограничения + их уникальная «спамоборона», которая ведет себя непредсказуемо, и просто если им не нравится письмо их smtp его не принимает, т.е. оно даже не отправляется (если бы хотя бы доставлялось клиентам в папку «спам», то ладно, но отправить нельзя). Саппорт яндекса ответил, что для таких рассылок этот сервис не предусмотрен.
По поводу релея перелопатил пол интернета, ничего толкового так и не нашел. Для себя придумал единственный выход — купить домен чисто для smtp сервера, и рассылать с него уже куда мне надо.. Платные smtp уж очень много денег хотят ежемесячно…
Спасибо за ответ :)
А я вот бьюсь с gmail и никак не могу настроить… Тоже почта для домена на яндексе… Отпрвляю с яндекса на gmail — подпись есть. Отправляют с сервера на яндекс — подпись есть. Отправляю с сервера на gmail — подписи нет, пиьсмо в спаме
Вадим, подозреваю, что с сервера письма всегда уходят неподписанными. То, что прийдя на почту Яндекса они оказываются подписанными, исключительно заслуга Яндекса и ПДД. Проверяйте как работает dkfilter на вашем SMTP-сервере.