Долгое время не мог понять почему мои письма приходят в спам. Обратная зона PTR была прописана.
Первое что нужно проверить не занесен ли наш IP в «черный список». Это можно сделать на сайте http://whatismyipaddress.com/blacklist-check
Мой IP был занесен в черный список нескольких баз , я по удалял его от туда . Описывать процедуру не буду там все интуитивно понятно .
Вот так выглядел мой емейл который я отправил со своего сервера на почтовый ящик Gmail:

Delivered-To: blablabla@gmail.com
Received: by 10.58.141.199 with SMTP id rq7csp89807veb;
        Fri, 18 Apr 2014 07:45:50 -0700 (PDT)
X-Received: by 10.15.22.201 with SMTP id f49mr23135255eeu.18.1397832349454;
        Fri, 18 Apr 2014 07:45:49 -0700 (PDT)
Return-Path: <aleksei@blablabla.ru>
Received: from mx.blabla.ru (mx.blablabla.ru. [111.111.111.111])
        by mx.google.com with ESMTP id q5si40531402eem.201.2014.04.18.07.45.48
        for <blablabla@gmail.com>;
        Fri, 18 Apr 2014 07:45:48 -0700 (PDT)
Received-SPF: neutral (google.com: 111.111.111.111 is neither permitted nor denied by best guess record for domain of aleksei@blablabla.ru) client-ip=111.111.111.111;
Authentication-Results: mx.google.com;
       spf=neutral (google.com: 111.111.111.111 is neither permitted nor denied by best guess record for domain of aleksei@blablabla.ru) smtp.mail=aleksei@blablabla.ru
Received: from mail.blablabla.ru  (localhost [127.0.0.1])
	by mx.blablabla.ru (Postfix) with ESMTP id 55ADD4B007
	for <blablabla@gmail.com>; Fri, 18 Apr 2014 17:45:13 +0300 (EEST)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8;
 format=flowed
Content-Transfer-Encoding: 8bit
.....

Настройка SPF:
Оказывается нужно было прописать в «пямой зоне» named одну строку ,которая указывает список серверов, имеющих право отправлять email-сообщения с обратными адресами в моём домене.
SPF расшифровывается как – Sender Policy Framework дословно (структура политики отправителя).

blablabla.ru. IN TXT "v=spf1 +a +mx -all"

Существующие опции:

    "v=spf1" - используемая версия SPF.
    "+" - принимать корреспонденцию (Pass). Этот параметр установлен по умолчанию. То есть, если никаких параметров не установлено, то это "Pass";
    "-" - Отклонить (Fail);
    "~" - "мягкое" отклонение (SoftFail). Письмо будет принято, но будет помечено как СПАМ;
    "?" - нейтральное отношение;
    "mx" - включает в себя все адреса серверов, указанные в MX-записях домена;
    "ip4" - опция позволяет указать конкретный IP-адрес или сеть адресов;
    "a" - указываем поведение в случае получения письма от конкретного домена;
    "include" - включает в себя хосты, разрешенные SPF-записью указанного домена;
    "all" - все остальные сервера, не перечисленные в SPF-записи.

Итак, попробуем разобраться, что же значит SPF-запись, указанная выше.

    "+a" - разрешает прием писем от узла, IP-адрес которого совпадает с IP-адресом в A-записи для example.org;
    "+mx" -  разрешает прием писем, если отправляющий хост указан в одной из MX-записей для example.org;
    "-all" - все сообщения, не прошедшие верификацию с использованием перечисленных механизмов, следует отвергать.

Вот описание моей зоны:

$TTL    3600
@               IN      SOA     ns.blablabla.ru. admin.blablabla.ru. (
                                2014042102;     Serial
                                3600;           Refresh
                                900;            Retry
                                360000;         Expire
                                3600;           Minimum
                                )
                IN      NS      ns.blablabla.ru.
                IN      NS      ns2.blablabla.ru.
                IN      A       111.111.111.111
                IN      MX  10  mx
.......
blablabla.ru. IN TXT "v=spf1 +a +mx -all"
.......
www             IN      A       111.111.111.111

Сайт для настройки и проверки SPF- записи Sender ID Framework SPF Record Wizard
После добавления этой строчки почта стала проходить проверку SPF , но и этого было мало…
Далее поставил пару программ для подписания почты ключами , чтоб все таки gmail ложил наши письма во входящие , а не в спам .
Итак приступим :
перед установкой OpenDKIM , добавим пользователя opendkim .

pw useradd -n opendkim -d /var/db/opendkim -g mail -m -s "/usr/sbin/nologin" -w no

Устанавливаем OpenDKIM (во время установки во всех всплывающих окнах я ничего не добавлял и оставил все по умолчанию) :

cd /usr/ports/mail/opendkim
make install clean

Позволим OpenDKIM стартовать во время загрузки системы и укажем нашего opendkim пользователя :

echo 'milteropendkim_enable="YES"' >> /etc/rc.conf
echo 'milteropendkim_uid="opendkim"' >> /etc/rc.conf

Редактируем конфигурационный файл Postfix:

ee /usr/local/etc/postfix/main.cf

и поручим Postfix использовать DKIM Milter:

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

Используем образец файла для конфигурации OpenDKIM:

cp /usr/local/share/doc/opendkim/opendkim.conf.simple /usr/local/etc/opendkim.conf

Редактируем файл конфигурации:

ee /usr/local/etc/opendkim.conf

В моем случае конфигурационный файл выглядит так :

LogWhy                  yes
Syslog                  yes
SyslogSuccess           yes

Canonicalization        relaxed/simple

Domain                  blog.barkov.eu
Selector                linkin
KeyFile                 /var/db/opendkim/linkin.private  \\Проверьте чтоб путь совпадал с ключем который мы создадим дальше

Socket                  inet:8891@localhost

ReportAddress           root
SendReports             yes

Теперь сгенерируем ключи , один будет использоваться opendkim для подписи наших сообщений, а другой должен быть вставлен в нашей NS зоне :
-d доменное имя (поменять на свое)
-s селектор любой какой вы укажите(поменять на свое)

opendkim-genkey -D /var/db/opendkim -d blog.barkov.eu -s linkin

Убедимся , что ключи созданы :

ls /var/db/opendkim

увидим в моем случае :
linkin.private
linkin.txt

Меняем пользователя на файл

1
sudo chown opendkim:mail /var/db/opendkim/linkin.private

Теперь вставьте содержание linkin.txt в NS зону у меня это blog.barkov.eu

cat /var/db/opendkim/linkin.txt

Копируем текст :

linkin._domainkey IN TXT "v=DKIM1;k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOcRbLGARxEFI9Ibwx79tk1kMi36rFeAT4aLu4iI3ctPUWa7y0WcuMZGCBQMMutolT8IM9e55AToqtr/W/rbKlhoeiA0r8qJZiIX/NkjkLIXzR+9h1i47dD5zCu4u436YN0y4DgZU9bZ3D4hvoC9hSHCcCwzosSRwBpaxIMZuRGQIDAQAB" ; ----- DKIM linkin for blog.barkov.eu

Также нужно вставить запись ADSP в нашей NS зоне:

_adsp._domainkey.blog.barkov.eu    IN    TXT    "dkim=unknown"

У меня NS зона после ключа стала выглядеть так:

$TTL    3600
@               IN      SOA     ns.blog.barkov.eu. admin.blog.barkov.eu. (
                                2014042203;     Serial
                                3600;           Refresh
                                900;            Retry
                                360000;         Expire
                                3600;           Minimum
                                )
                IN        NS    ns.blog.barkov.eu.
                IN        NS             ns2.trifle.net.
                IN      A               159.224.81.251
                IN      MX  10  mx
mx              IN       A              159.224.81.251
ns              IN      A       159.224.81.251
ns2             IN      A       195.24.128.164
linkin._domainkey       IN      TXT     ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOcRbLGARxEFI9Ibwx79tk1kMi36rFeAT4aLu4iI3ctPUWa7y0WcuMZGCBQMMutolT8IM9e55AToqtr/W/rbKlhoeiA0r8qJZiIX/NkjkLIXzR+9h1i47dD5zCu4u436YN0y4DgZU9bZ3D4hvoC9hSHCcCwzosSRwBpaxIMZuRGQIDAQAB" ; ----- DKIM linkin for blog.barkov.eu
_adsp._domainkey.blog.barkov.eu    IN    TXT    "dkim=unknown"
www             IN      A       159.224.81.251
..............

Сделаем запрос для проверки :

dig +norec @localhost -t TXT linkin._domainkey.blog.barkov.eu

; <<>> DiG 9.8.4-P1 <<>> +norec @localhost -t TXT linkin._domainkey.blog.barkov.eu
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<
dig +norec @localhost -t TXT _adsp._domainkey.blog.barkov.eu

; <<>> DiG 9.8.4-P1 <<>> +norec @localhost -t TXT _adsp._domainkey.blog.barkov.eu
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<

Вот и все.
Убедитесь, что домен прописан в

/etc/resolv.conf

Теперь проверим ключ, используя утилиту OpenDKIM :

opendkim-testkey -vvv -d blog.barkov.eu -s linkin -k /var/db/opendkim/linkin.private

Увидим примерно следующее:

opendkim-testkey: using default configfile /usr/local/etc/opendkim.conf
opendkim-testkey: key loaded from /var/db/opendkim/linkin.private
opendkim-testkey: checking key 'linkin._domainkey.blog.barkov.eu'
opendkim-testkey: key not secure
opendkim-testkey: key OK

Теперь запустим OpenDKIM и Postifix:

/usr/local/etc/rc.d/milter-opendkim start
/usr/local/etc/rc.d/postfix start

Еще мне захотелось , чтоб моя почта проходила проверку DomainKeys. Читал что эта проверка устарела и сейчас практически не используется, но есть спортивный интерес , как говорится пусть будет от этого хуже не станет , тем более , что я буду использовать ключи которые создал для DKIM.
Итак преступим , для начала установим dk-milter:

cd /usr/ports/mail/dk-milter
make install clean

Далее нужно было создать директорию и создать ключи , но мы это пропустим будем использовать ключи которые создали выше.Внесем настройки в /etc/rc.conf

milterdk_enable="YES"
milterdk_socket="inet:10027@localhost"
milterdk_domain="blog.barkov.eu"
milterdk_key="/var/db/opendkim/linkin.private"
milterdk_selector="linkin"
milterdk_uid="opendkim"

Стартуем dk-milter:

/usr/local/etc/rc.d/milter-dk start

Проверим запустился ли он :

sockstat -4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
mailnull dk-filter  78135 3  tcp4   127.0.0.1:10027       *:*

Откроем наш конфигурационный файл Postfix

ee /usr/local/etc/postfix/main.cf

Добавим к уже имеющимся строчкам,новые значения сокетов(добавленные значения выделены красным цветом):

smtpd_milters = inet:localhost:8891,inet:localhost:10027
non_smtpd_milters = inet:localhost:8891,inet:localhost:10027

Перезагрузим Postfix:

postfix reload

Убедимся что наша новая запись TXT возвращает правильный ответ на запрос:

nslookup -q=txt linkin._domainkey.barkov.eu
Server:         127.0.0.1
Address:        127.0.0.1#53

linkin._domainkey.barkov.eu     text = "v=DKIM1\; k=rsa\; p=MIGfMA0G(......)/z/TtU9a5SRwbsE0vrf3NA0b0JJTQIDAQAB"

Проверку и анализ можно сделать с помощью сайта :

http://www.brandonchecketts.com/emailtest.php

Нужно отправить пустое письмо на адрес который указан на странице сайта ( не закрывайте эту страницу ) , копируем его , отправляем письмо с нашего почтового ящика на адрес который копировали.После отправки письма переходим на страницу откуда копировали адрес и на против адреса нажимаем на кнопу «View Results»,дальше увидим развернутый ответ где можно будет увидеть все ли настроено правильно.
Второй вариант еще проще,просто отправить письмо на адрес: check-auth@verifier.port25.com.В ответ получим развернутое письмо где будет видно прошло ли проверку наше доменное имя или нет .

Создание SPF записи , настройка Opendkim+DK-milter на FreeBSD с Postfix
Метки:

Создание SPF записи , настройка Opendkim+DK-milter на FreeBSD с Postfix: 3 комментария

  • 03/04/2015 в 18:12
    Постоянная ссылка

    Интересно было почитать, но насчет spf не совсем понятно, каким образом postfix смотрит spf запись если ему не указан не 1 фильт для проверки spf?

    Ответить
    • 03/04/2015 в 18:23
      Постоянная ссылка

      не внимательно прочёл, перечитал и понял свою ошибку.
      Возник 2-ой вопрос что делать когда есть не 1 а несколько доменов ну скажем 2-3? ну в каждой dns зоне прописать ключь понятно, а что делать с конфигом?

      Ответить
      • 06/04/2015 в 10:12
        Постоянная ссылка

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

        1
        2
        3
        Domain          linkin.pp.ua,barkov.eu,barkov.pp.ua
        Selector        linkin
        KeyFile                /var/db/opendkim/linkin.private
        Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *