Настройка записей SPF и DKIM для сервера (opendkim + sendmail)


В связи с тем, что почтовые гиганты постоянно борются со спамом, вводятся всё новые способы проверки почты. К ним относятся два основных способа, это SPF и DKIM подписи домена.
SPF привязан к IP сервера, а DKIM к домену отправителя.

Для настройки SPF в DNS вносится запись типа TXT со следующим содержанием:

@.vashdomen.ru     v=spf1 ip4:ip-vashego-servera a ~all
  например:
@.google.ru              v=spf1 ip4:8.8.8.8 a ~all

После внесения SPF записи в домен, переходим к настройке DKIM. В Redhat подобных системах необходимо установить sendmail sendmail-cf и opendkim:

#yum install -y sendmail sendmail-cf opendkim

Раскомментируем строчку Domain в файле /etc/opendkim.conf и впишем наш домен:

Domain moysayt.ru

Раскомментируем строчки:

SigningTable refile:/etc/opendkim/SigningTable
KeyTable /etc/opendkim/KeyTable
InternalHosts refile:/etc/opendkim/TrustedHosts
 

Важно поменять режим подтверждения (v) на режим подписывания (s) или подписывания с подтверждением (sv):

Mode sv

Генерируем ключ:

#cd /etc/opendkim/keys && openssl genrsa -out default.private 1024 -outform PEM
#openssl rsa -in default.private -out dkim-public.pem -pubout -outform PEM

Чтоб  opendkim запустился меняем владельца и группу файла default.private

#chown opendkim.opendkim default.private

Добавляем для нашего домена TXT запись субдоменом default._domainkey , она должна иметь следующий вид:

(Domain)
default._domainkey.moysayt.ru
(TXT)
v=DKIM1; k=rsa;  p=MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAKJ2lzDLZ8XlVambQfMXn3LRGKOD5o6lMIgulclWjZwP56LRqdg5ZX15bhc/GsvW8xW/R5Sh1NnkJNyL/cqY1a+GzzL47t7EXzVc+nRLWT1kwTvFNGIoAUsFUq+J6+OprwIDAQAB;

код красного цвета берём из файла dkim-public.pem, это публичный ключ, в зависимости от генерации он может находиться в файле dkim-public.pem, defaul.txt (описано ниже) или в каком-нибудь другом файле.

-----BEGIN PUBLIC KEY-----
MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAKJ2lzDLZ8XlVambQfMXn3LRGKOD5o6l
MIgulclWjZwP56LRqdg5ZX15bhc/GsvW8xW/R5Sh1NnkJNyL/cqY1a+GzzL47t7E
XzVc+nRLWT1kwTvFNGIoAUsFUq+J6+OprwIDAQAB
-----END PUBLIC KEY-----

Другим вариантом генерации ключа является команда:

#opendkim-genkey -D /etc/opendkim/keys/ -d moysayt.ru -s default

Сгенерируются закрытый (default.private) и открытый (default.txt) ключи.

Если все эти варианты вызывают ошибки в CentOS, то используйте эту команду:

#openssl genrsa -out default.private 1024 && openssl rsa -in default.private -pubout > default.txt

Файлы должны быть с правами 400 и владельцем opendkim:

#chown opendkim.opendkim * && chmod 400 *

Для тестирования связки открытого и закрытого ключа используем команду:

#opendkim-testkey -d moysayt.ru -s default -k default.private

В файле SigningTable раскомментируем и изменяем строчку:

*@moysayt.ru default._domainkey.moysayt.ru

В файле KeyTable раскомментируем и изменяем строчку:

default._domainkey.moysayt.ru moysayt.ru:default:/etc/opendkim/keys/default.private

В файл TrustedHosts добавить:

moysayt.ru

Если у нас несколько доменов, то описываем их в файлах :

/etc/opendkim/SigningTable
moysayt.ru default._domainkey.moysayt.ru
moysayt2.ru default._domainkey.moysayt2.ru
moysayt3.ru default._domainkey.moysayt3.ru
 
/etc/opendkim/KeyTable
default._domainkey.moysayt.ru moysayt.ru:default:/etc/opendkim/keys/default.private
default._domainkey.moysayt2.ru moysayt2.ru:default:/etc/opendkim/keys/moysayt2/default.private
default._domainkey.moysayt3.ru moysayt3.ru:default:/etc/opendkim/keys/moysayt3/default.private 

Меняет строчку в файле /etc/mail/sendmail.mc (если используем специальный relay, например, всё оправляется только через сервер провайдера):

dnl define(`SMART_HOST', `smtp.moydomen.ru')dnl

для подписывания письма службой opendkim, добавляем в конце файла /etc/mail/sendmail.mc, строку:

INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')dnl

Важно, файл должен обязательно заканчиваться пустой строкой. Если последней будет выше указанная строка, то m4 будет ругаться на ошибку.

Конвертируем этот файл в конфиг:

#m4 sendmail.mc > sendmail.cf

И перезапускаем opendkim и sendmail

#service opendkim restart && service sendmail restart

Проверяем появились ли TXT записи DNS

#dig default._domainkey.moysayt.ru TXT
#dig moysayt.ru TXT

Если записи не появились, то ждём когда появятся. Как только появятся проверяем работу sendmail из консоли

#echo -e "To: testoviy-mail@yandex.ru\\nFrom: noreply@moysayt.ru\\nSubject: Test\\nTest\\n" | sendmail -bm -t -v

Если письмо дошло и не попало в СПАМ, то смотрим есть ли значок означающий наличие подписи.

Наличие DKIM подписи у письма

Наличие DKIM подписи у письма

Проверяем включена ли автозагрузка sendmail и opendkim

(CentOS 7)
#systemctl is-enabled opendkim && systemctl is-enabled sendmail.service
(CentOS 6)
#chkconfig | grep opendkim && chkconfig | grep sendmail

Если отключены, то включаем

(CentOS 7)
#systemctl enable opendkim
#systemctl enable sendmail.service
(CentOS 6)
#chkconfig opendkim on
#chkconfig sendmail on

При наличии SeLinux необходимо в его настройках дать разрешение apache-u отправлять сообщения через Sendmail, для этого проверяем права

#getsebool -a | grep mail

Получаем ответ

gitosis_can_sendmail --> off
httpd_can_sendmail --> off
logging_syslogd_can_sendmail --> off
logwatch_can_network_connect_mail --> off
mailman_use_fusefs --> off
postfix_local_write_mail_spool --> on

Включаем возможность отправки почты PHP через Sendmail (чтоб SeLinux не блокировал)

#setsebool -P httpd_can_sendmail on

Проверяем работоспособность отправкой тестового сообщения через PHP

#php -a
php >mail ('1ymth75yyoohfe@dkimvalidator.com', "Test email", "Test email from the Internet", null, "-f apache@moysayt.ru");

На сайте dkimvalidator.com вводим адрес почты и смотрим данные письма 1ymth75yyoohfe@dkimvalidator.com. Если сообщение не дошло до сервера, то нужно проверить логи:

#tail /var/log/maillog

Если в логах есть текст:

... no signing table match for ...
... no signature data ...

То могут быть две причины:

  1. неправильно настроили файлы SigningTable и/или KeyTable;
  2. фалы сохранены не в UTF8 BOOM  с форматом конца строк UNIX (LF). Если формат конца строк DOS (CRLF), то это вызывает ошибку в работе openDKIM.

Для проверки файлов SigningTable и KeyTable в командной строке набираем:

#opendkim -Q
> refile:/etc/opendkim/SigningTable
opendkim: enter 'query/n' where 'n' is number of fields to request
> moysayt.ru/1
default._domainkey.moysayt.ru/1
> Ctrl + D
#opendkim -Q
> /etc/opendkim/KeyTable
opendkim: enter 'query/n' where 'n' is number of fields to request
> default._domainkey.moysayt.ru/3
'moysayt.ru'
'default'
'/etc/opendkim/keys/default.private'
opendkim: enter 'query/n' where 'n' is number of fields to request

Если в файле /etc/opendkim.conf  используем синтаксис SigningTable refile:/etc/opendkim/SigningTable, то в файле SigningTable нужно писать:

*@moysayt.ru default._domainkey.moysayt.ru

Если SigningTable file:/etc/opendkim/SigningTable или SigningTable /etc/opendkim/SigningTable то:

moysayt.ru default._domainkey.moysayt.ru

Если в логах есть подобная ошибка:

relay=alt4.gmail-smtp-in.l.google.com., dsn=4.0.0, stat=Deferred: Connection timed out with alt4.gmail-smtp-in.l.google.com.

то это значит порт 25 закрыт (на исходящее подключение). Отключаем firewalld и проверяем, если заработает — значит проблема в нём, если нет — то обращаемся к провайдеру, чтоб тот открыл 25-ый порт. 

#service firewalld stop
#echo -e "To: testoviy-mail@yandex.ru\\nFrom: noreply@moysayt.ru\\nSubject: Test\\nTest\\n" | sendmail -bm -t -v
#service firewalld start

Подробный мануал по openDKIM можно найти здесь