Продолжение этого поста. Настраиваем наш smtp, что-бы письма не попадали в спам.
Немного теории для начала.
DKIM (расшифровывается как DomainKeys Identified Mail) — метод идентификации письма по доменным ключам.
DKIM настраивается на почтовом сервере для того, чтобы подписывать исходящие письма цифровой подписью. Наличие такой подписи в заголовке отправленного письма сообщает серверу-получателю, что оно действительно было отправлено с указанного домена.
Известно, что в СПАМ-письмах часто в поле From: ставят е-mail, не имеющий совершенно никакого отношения к отправителю. В этом случае DKIM поможет распознать реальное письмо от спама. В отличие от других методов цифровой подписи письма, DKIM совместим с существующими форматами и протоколами и может быть плавно интегрирован в имеющиеся системы доставки и получения почты.
Подпись письма происходит на SMTP-сервере с помощью секретного ключа (Private key), а расшифровка подписи происходит на сервере-получателе или клиентской программе с помощью публичного ключа (Public key). Что интересно, публичный ключ хранится в DNS, что позволяет убить сразу двух зайцев. Во-первых, нет необходимости прикладывать Public key с каждым письмом для его расшифровки. А во-вторых, в таком случае DKIM позволяет сообщать серверам-получателям что делать с письмом, которое не имеет цифровой подписи, но якобы отправлено от вас. Эта технология называется ADSP (Author Domain Signing Practices). ADSP также хранится в DNS SMTP-сервера и доступен всем и отовсюду.
Настройка DKIM
Для работы потребуется, что бы Exim был собран с поддержкой SPF/DKIM. Для Debianэто означает установку пакета exim4-daemon-heavy.
apt-get install exim4-daemon-heavy opendkim opendkim-tools
Для начала надо сформировать пару Private key + Public key.
opendkim-genkey -D /etc/exim4/dkim -d mydomain.com -s dkim
/etc/exim4/dkim — директория, где будут лежать ключи
mydomain.com — доменное имя
-s — указываем селектор, (например, mail или dkim). Селектор будет использоваться в DNS записи и указываться в настройке транспортов exim`а.
Итак, создается два файла — dkim.txt (dkim — выбранный нами селектор) и dkim.private.
[su_spoiler title=»dkim.txt»]
dkim._domainkey IN TXT «v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2RM2t1S03pfVPATl9vv8Iw4BZFWdjgKZDH7tfQhs0G9vRuAmaZgCI09sn+6ZK9irIFHaP7CBrpsSE0IPi+g1v7z9+PlvQ7RP5Q6DlhUHM01Zts86HL2dkLB3zilagUzYPPgARjEniTWlWMxj8uex0KtfpKdie4mb0tuK8LBJrOwIDAQAB» ;
—— DKIM key dkim for mydomain.com
[/su_spoiler]
[su_spoiler title=»dkim.private»]
——BEGIN RSA PRIVATE KEY——
MIICXQIBAAKBgQC2RM2t1S03pfVPATl9vv8Iw4BZFWdjgKZDH7tfQhs0G9vRuAma
ZgCI09sn+6ZK9irIFHaP7CBrpsSE0IPi+g1v7z9+PlvQ7RP5Q6DlhUHM01Zts86H
L2dkLB3zilagUzYPPgARjEniTWlWMxj8uex0KtfpKdie4mb0tuK8LBJrOwIDAQAB
AoGBAIDNxG+oqyidLeqj2eXj2ERwK75IYuStIFFlFjtt8t1zJndgz+B9XrlSxZfO
vShSJ892roZsfki09EFLPThkLqOOqwaxJzdtaH2vhRsdlrdnF+yhT6J0ntiv+kYs
UtttkKCJZFJyW7pXPsVPsM8HAeHwzVKFO/mrcAHr68z6zZbhAkEA5JwJLeI6X14i
4sWWRVuWTxa9BHzlTzLyUd3BY3XYbb1Temy46LGfVnLquCv+uUl6+8AJpExRO8aO
gwyuwMc2MQJBAMwbZK32ZIfieOl4/I2DaDSONLAzqyCqh358uOwyYuHwbXtehnyc
9jKMr0pQuQqFPZyni3zpRGJj2ncK1J6gISsCQQCUhO7NuWi05oKBk15iJvNK5Hne
PYn4Xx/godHu3PPDr7lZEuM6gZMD5dqp1iNBmwRkI8nfzJkF3aRebVHm+kUxAkA/
7pSqqPL0XUviVbNF4FNTovd9+bEwmjm2tPp3gZDXlKe2bPVTMxcq3kZJ0N8lHHcg
Cpr2lVqGNyDHCO1wglfhAkBJW1EyrrKn9vQqChmDD14UnvnqE/GCX4BFwMMH6T7b
h5FNtyi1Q2gXH78thPrM5AU4x73WbF5oRri5U6wca5y/
——END RSA PRIVATE KEY——
[/su_spoiler]
Правим DNS
Добавляем DKIM селектор
Содержимое файла dkim.txt добавим в DNS зону example.com, причем вот в таком виде (скобки и кавычки нужно удалить):
IN TXT "v=DKIM1; k=rsa; t=s; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzNINDkom8ZxTA4aImiZk...;"
Если у вас BIND то просто отредактируем файл с зоной
nano /etc/bind/db.maydomain.com
$TTL 300 $ORIGIN mydomain.com. @ IN SOA mydomain.com. root.mydomain.com. ( 2016090801 ; Serial 1d ; Refresh 1h ; Retry 1w ; Expire 2h ; Negative Cache TTL ) @ IN NS ns1.fdns.tk. @ IN NS ns2.fdns.tk. @ IN NS mydomain.com. @ IN A 109.248.32.106 IN TXT "v=DKIM1; k=rsa; t=s; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzNINDko TksVpEL2Lxb4CMUgfrpzU8GjJRXa2701iYDEybIlsnhDy1VJWqwv6WEeF2bdyglRPlW2ZRhXb9biYoqVj7 X99pfKEbJneJkY8h8JZc4Yh/AV1PMaKMHzsDBRfPmyKm+dopUdGTt4lnTbREBBS0FvDHkbFDBGjc9IJS+J vwIDAQAB;"
Проверяем:
host -t txt dkim._domainkey.mydomain.com
dkim._domainkey.mydomain.com descriptive text "\"v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2RM2t1S03pfVPATl9vv8Iw4BZFWdjgKZDH7tfQhs0G9vRuAmaZgCI09sn+6ZK9irIFHaP7CBrpsSE0IPi+g1v7z9+PlvQ7RP5Q6DlhUHM01Zts86HL2dkLB3zilagUzYPPgARjEniTWlWMxj8uex0KtfpKdie4mb0tuK8LBJrOwIDAQAB\" \;"
Правим opendkim.conf
nano /etc/opendkim.conf
Приводим его к следующему виду
Syslog yes UMask 002 Domain sdns.tk KeyFile /etc/exim4/dkim/dkim.private Selector dkim OversignHeaders From
Выставим права /usr/sbin/opendkim (иначе получим ошибку при перезапуске «Restarting OpenDKIM: No /usr/sbin/opendkim found running; none killed.
opendkim») и перезапустим opendkim
chmod 777 -R /usr/sbin/opendkim
service opendkim restart
Настроим exim
nano /etc/exim4/exim4.conf.template
Добавляем после ### transport/10_exim4-config_transport-macros
### transport/10_exim4-config_transport-macros ## DKIM: DKIM_DOMAIN_NAME=${lc:${domain:$h_from:}} DKIM_FILE=/etc/exim/dkim/${lc:${domain:$h_from:}}.key DKIM_PRIVATE_KEY_NAME=${if exists{DKIM_FILE}{DKIM_FILE}{0}} ... ## чуть правим транспорт: remote_smtp: ... driver = smtp dkim_domain = DKIM_DOMAIN_NAME dkim_selector = dkim dkim_private_key = DKIM_PRIVATE_KEY_NAME ...
Будьте внимательны с именами, т.к. exim, по крайней мере, не чувствителен к регистру!!!
По этому DKIM_DOMAIN и dkim_domain для него будет одним и тем-же, в следствии возникает ошибка повторения «dkim_domain» option set for the second time
Для решения этой проблемы просто переименуйте DKIM_DOMAIN например в DKIM_DOMAIN_NAME
Если получите ошибку при рестарте exim
ALERT: exim paniclog /var/log/exim4/paniclog has non-zero size, mail system possibly broken
просто очистите содержимое файла/var/log/exim4/paniclog
Настройка SPF
Добавляем в DNS такие записи (предпочтительнее):
mydomain.com. IN TXT "v=spf1 a mx ~all"
а если позволяет DNS, то такую:
mydomain.com. IN SPF "v=spf1 a mx ~all"
Для проверки того, что запись добавилась и работает, её нужно проверить через spfquery:
# dig -t spf mydomain.com +short
PS: И всё же я попал в спам. DKIM в заголовке сообщения почему-то не валидный. Где-то происходит изменение dkim при отправке через exim. Как разберусь — допишу этот пост.