DomainKeys, DKIM, SPF, SpamAssassin Email валидатор
Установка:
sudo apt-get install postfix
Выбираем «Internet Site» и затем вводим доменное имя, закреплённое за сервером. Далее Postfix автоматически установится. Останется небольшой штрих:
Если Postfix уже установлен, то перекофигурируем его:
sudo dpkg-reconfigure postfix
sudo nano /etc/postfix/main.cf
Пишем доменное имя:
myhostname = example.com
Правим строку с ключом mydestination, отвечающим за список доменов которые будет обслуживать Postfix. В нашем случае тут останется только домен, localhost.localdomain и localhost:
mydestination = example.com, localhost.localdomain, localhost
Ключ relayhost оставляем пустым. Убедитесь, что ключ mynetworks содержат эту запись.
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
Ключ указывает на то, кто может отправлять почту с данного сервера. Этой записью мы разрешаем слать письма только с локальных адресов.
Перезагружаем MTA:
sudo service postfix reload
Внесём изменения в DNS-записи:
- создадим A-запись:
- название — mail
- IP — IP сервера, тот, что указан в основной A-записи
- создадим MX-запись:
- имя хоста: mail.example.com. (с точкой на конце, меняем на свой домен)
- приоритет: 5
Откроем файл конфигурации Postfix:
sudo nano /etc/postfix/main.cf
заменим ключ alias_maps на:
virtual_alias_maps = hash:/etc/postfix/virtual
Добавим дополнительный e-mail, для этого заведём файл содержащий алиасы:
sudo nano /etc/postfix/virtual
Пример алиасов:
[email protected] username
# где username - имя пользователя в системе
# вся почта будет тут: /var/mail/username
# или перенаправим почту на другой домен
[email protected] [email protected]
# или на несколько доменов
[email protected] [email protected],[email protected]
Сохраним, создадим хэш:
postmap /etc/postfix/virtual
Перезагрузим MTA:
sudo service postfix reload
Reverse DNS lookup, или reverse DNS resolution (rDNS), нужен для определения доменного имени сервера по его IP. Нужна эта процедура для верификации отправителя:
- берётся IP сервера, с которого письмо было отправлено
- с помощью rDNS определяется домен
- полученный домен сравнивается с доменом указанным в заголовках письма, в поле «From»
- если доменные имена совпадают, то считаем что отправитель тот, за кого он себя выдает.
По умолчанию rDNS скорее всего не указывает на ваш сервер. Исправить это просто. Пишем своему хостинг-провайдеру письмо с просьбой настроить Reverse DNS lookup для вашего домена и сервера, IP указываем.
Как и всё, что связано с DNS, изменения для записей Reverse DNS lookup пройдут не сразу, потому ждём, и через некоторое время проверяем с помощью любого онлайн-сервиса Reverse DNS lookup.
Настройка rDNS на DigitalOcean:
- Выбираем пункт «Droplets»
- Выбираем нужный дроплет
- Настройки (Settings)
- Переименовать (Rename)
- Вставляем новый hostname. Hostname равен домену закреплённому за этим дроплетом, типа «example.com».
- Ждём обновления DNS.
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install opendkim opendkim-tools
mkdir /etc/postfix/dkim/
opendkim-genkey -D /etc/postfix/dkim/ -d your-site.ru -s mail
Только что мы создали секретный (/etc/postfix/dkim/mail.private) и публичный (/etc/postfix/dkim/mail.txt) ключи. Получаем содержимое публичного ключа:
cat /etc/postfix/dkim/mail.txt
mail._domainkey IN TXT "v=DKIM1;=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnv6Qp34EnmUQMGDFs3tA2f9kRlTQCit3ST3l3xt4Zj3JBeIHnoaMk0Vos/hR/JtNnS16MEMMnX5OgZ3pAJjrk3CCw4hr5THW5zuGfqjSjusEbNckL6+E57Q2DwOjk4d+AjL7cb/fR7MWMMTY6hVVXbRc5VxKUaPp+34mecVyHSQIDAQAB" ; ----- DKIM mail for your-site.ru
Содержимое помещаем в DNS запись типа TXT для вашего домена
Узел: mail._domainkey
Содержимое записи: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnv6Qp34EnmUQMGDFs3tA2f9kRlTQCit3ST3l3xt4Zj3JBeIHnoaMk0Vos/hR/JtNnS16MEMMnX5OgZ3pAJjrk3CCw4hr5THW5zuGfqjSjusEbNckL6+E57Q2DwOjk4d+AjL7cb/fR7MWMMTY6hVVXbRc5VxKUaPp+34mecVyHSQIDAQAB"
Чиним доступ для OpenDKIM:
chgrp opendkim /etc/postfix/dkim/*
chmod g+r /etc/postfix/dkim/*
В файл конфигурации /etc/opendkim.conf записываем:
Syslog yes
SyslogSuccess yes
# на время отладки включим расширенное логгирование
LogWhy yes
X-Header yes
Canonicalization relaxed/relaxed
# подпись и проверка подписей
Mode sv
# если только подписываем
#Mode s
# список ключей -
KeyTable file:/etc/postfix/dkim/keytable
# соответствие адресов/доменов и ключей -
SigningTable file:/etc/postfix/dkim/signingtable
# если вы подписываете и на других серверах -
#ExternalIgnoreList file:/etc/postfix/dkim/trusted
# список внутренних хостов, почта которых требует подписи -
#InternalHosts file:/etc/postfix/dkim/internal
Список имеющихся ключей укажем в файле /etc/postfix/dkim/keytable:
# формат: "название домен:селектор:/путь/до/ключа"
# в качестве названия удобно использовать имя DNS записи с ключем
mail._domainkey.your-site.ru your-site.ru:mail:/etc/postfix/dkim/mail.private
# ключей может быть сколько угодно
mx._domainkey.example.net example.net:mx:/etc/postfix/dkim/mx.private
# (список ключей может быть и в БД - продробней в манах)
В файле /etc/postfix/dkim/signingtable указываем соответсвие домен-ключ:
# формат: "домен-или-адрес название-ключа"
your-site.ru mail._domainkey.your-site.ru
# все остальные адреса тоже подписываем
# в таком случае вся исходящая почта будет подписана
# этим ключом
* mail._domainkey.your-site.ru
# (подробное описание формат есть в man)
В файле /etc/default/opendkim объясним DKIM-демону где ему ждать подключений:
SOCKET="inet:8891@localhost"
Наконец, добавим в конец /etc/postfix/main.cf следующие строки:
# Все письма будут отправлены на подпись
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
Не забываем добавить TXT запись и проверить, что она на месте:
dig txt mail._domainkey.your-site.ru
Или прогнать через валидатор валидатор.
Перезапускаем postfix и opendkim
sudo service postfix reload
sudo service opendkim reload
Проверяем работу. Самый простой способ — отправка письма на ящик Яндекс.Почты. Если всё верно настроено, появится зеленый бейджик «Подпись верна». Если неудачно, то в письме (Яндекс) жмём «Подробно -> Свойства письма», ищем слово dkim. Должно быть «dkim=pass». Верху есть ссылки на другие сервисы.
Помним про то, что DNS обновляется не сразу.
Запретим всем серверам принимать письма без подписи с вашего домена, добавим ADSP запись:
_adsp._domainkey IN TXT "dkim=all"
Требуется для указания IP с которых мы разрешаем отправку. Настройка идёт через DNS-записи.
Мне обычно хватает простой записи говорящей что почту можно отправлять только с адресов, указанных в записях A и MX:
your-site.ru. TXT v=spf1 a mx ~all
Проверить работу можно с помощью DomainKeys, DKIM, SPF, SpamAssassin Email валидатор. Также можно посмотреть исходники письма в Яндекс.Почте или Gmail.
Проверка на примере Gmail Отправьте почту через ваш сервис на любой GMail-аккаунт. Откройте полученное письмо и выберите в меню действий пункт Show Original.
Если вы найдете следующие строчки, то всё в порядке:
Received-SPF: pass
Authentication-Results: ... spf=pass
Помним про то, что DNS обновляется не сразу.