В этой записи я опишу процесс настройки OpenDKIM для почтового сервера Postfix. Следует отменить, этот этап настроек следует выполнять очень внимательно. Можно запутаться на этапе подготовки к генерации ключей. Поэтому я выделил эту задачу в отдельный пост.
Устанавливаем OpenDKIM и копируем базовый настройки файл:
pacman -S opendkim
install -d /etc/opendkim
Создайте файл:
nano /etc/opendkim/opendkim.conf
Скопируйте в конец файла либо примените настройки к следующему виду:
Mode sv
SendReports yes
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
Socket local:/run/opendkim/opendkim.sock
UMask 002
Создайте файл /etc/opendkim/SigningTable. Селектор можно выбрать любой, у меня — mail, домен — codebeer.ru меняете на ваш.
Имя DKIM-записи в DNS всегда такое <selector>._domainkey.<domain>
*@codebeer.ru mail._domainkey.codebeer.ru
Создайте файл /etc/opendkim/KeyTable
mail._domainkey.codebeer.ru codebeer.ru:mail:/etc/opendkim/keys/codebeer.ru/mail.private
Аналогично селектор указываете такой же, как в предыдущем пункте, у меня mail, домен codebeer.ru, вы меняете значения на свои.
Создайте файл TrustedHosts
cat > /etc/opendkim/TrustedHosts <<'EOF'
127.0.0.1
localhost
::1
mx.codebeer.ru
EOF
Домен codebeer.ru меняете на ваш.
Далее генерируем ключи.
pacman -S perl
mkdir -p /etc/opendkim/keys/codebeer.ru
opendkim-genkey -b 2048 -d codebeer.ru -D /etc/opendkim/keys/codebeer.ru -s mail -v
Назначаем права на файлы:
chown -R opendkim:opendkim /etc/opendkim/keys/codebeer.ru
chmod 0400 /etc/opendkim/keys/codebeer.ru/mail.private
Установите права на сокет, для этого добавьте postfix в группу opendkim:
gpasswd -a postfix opendkim
Добавляем OpenDKIM в автозагрузку и перезапускаем Postfix:
systemctl enable --now opendkim
systemctl restart postfix
Авто-перезапуск при падении opendkim:
mkdir -p /etc/systemd/system/opendkim.service.d
cat > /etc/systemd/system/opendkim.service.d/restart.conf <<'EOF'
[Unit]
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
Restart=on-failure
RestartSec=5s
EOF
Применяем настройки:
systemctl daemon-reload
systemctl restart opendkim
Убиваем процесс opendkim, что бы убедится что он подымится снова:
pkill -9 opendkim
sleep 2
systemctl status opendkim --no-pager
Добавляем запись DKIM в DNS
Добавляем в DNS TXT запись с именем mail._domainkey и значением:
cat /etc/opendkim/keys/codebeer.ru/mail.txt
Важно удалить все кавычки в середине текста. Запись должна выглядеть следующим образом:
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuxfSSuNL66k9K7d/maqp39cMANuqlHthD+4w7F9ck0NOFbKoYwJxFL7XiZi2tQPM/8HdITuKPG/a9n2qiLtTWzKzv5bsoY4bnjkCzycRcV/uK8XrfZg6yni3UmaFuN10q6bJVZ77ePRIjqQGiHUrgTqTiS6X/EmxiMmPNUf5BQhDKw/N3rdf2gm8suVVP1je+YZrVqdnXesyEJl3SqBuIGZrp8x9BD5abkF4069BsSOm5OqLsr6Eioc/7zWTETraNcGbPROtNKQenEEmWnPpGFYgxtxcagSadm05vjVtKUIukGABot2UleLVsZDwiFGfnSmStvWXQmFWlu1Rtne9cwIDAQAB"
Тест ключа:
[root@mx opendkim]# opendkim-testkey -d codebeer.ru -s mail -vvv
opendkim-testkey: using default configfile /etc/opendkim/opendkim.conf
opendkim-testkey: checking key 'mail._domainkey.codebeer.ru'
opendkim-testkey: key not secure
opendkim-testkey: key OK
Подключаем OpenDKIM к Postfix
Postfix должен иметь доступ к /run/opendkim/opendkim.sock:
usermod -aG opendkim postfix
systemctl restart opendkim postfix
Для интеграции с Postfiх добавить в /etc/postfix/main.cf:
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
smtpd_milters — проверка входящих по SMTP.
non_smtpd_milters — чтобы локально сгенерированная почта (cron/sendmail) тоже подписывалась DKIM.
Применяем настройки:
postfix check
systemctl restart postfix
Далее сделаем настройку, если DKIM нет или не валидный, отправляем письмо в спам.
Пакет pigeonhole необходим для sieve-плагина и компилятор sievec.
pacman -S --needed pigeonhole
Необходимо добавить в /etc/opendkim/opendkim.conf параметры:
AuthservID mx.codebeer.ru
AlwaysAddARHeader yes
On-BadSignature accept
On-NoSignature accept
Замените домен mx.codebeer.ru на свой.
Применяем настройки:
systemctl restart opendkim
Включаем Sieve на LMTP-доставке:
nano /etc/dovecot/dovecot.conf
Добавить в конец файла:
protocol lmtp {
mail_plugins {
sieve = yes
}
}
Автосоздание папки Junk. Найдите секцию namespace inbox и приведите ее к виду:
namespace inbox {
inbox = yes
separator = /
mailbox Trash {
auto = create
special_use = \Trash
}
mailbox Junk {
auto = create
special_use = \Junk
}
}
Добавляем в конец файла глобальный скрипт обработки почты, выполняемый до пользовательских:
sieve_script dkim_policy_before {
type = before
path = /etc/dovecot/sieve/00-dkim-to-junk.sieve
}
Создаем каталог и файл:
install -d -m 0755 /etc/dovecot/sieve
nano /etc/dovecot/sieve/00-dkim-to-junk.sieve
Добавляем в содержимое файла:
require ["fileinto"];
# === ИСКЛЮЧЕНИЯ (разрешаем без DKIM / с проблемным DKIM) ===
# Впиши сюда домены, которым доверяешь:
if address :domain :is "from" ["trusted.example", "partner.example"] {
stop;
}
# === ПЕРЕКЛАДЫВАЕМ В JUNK ЕСЛИ OpenDKIM сказал fail/none ===
# Важно: доверяем только нашей строке Authentication-Results (AuthservID)
if allof (
header :contains "Authentication-Results" "mx.codebeer.ru",
anyof (
header :contains "Authentication-Results" "dkim=fail",
header :contains "Authentication-Results" "dkim=permerror",
header :contains "Authentication-Results" "dkim=temperror",
header :contains "Authentication-Results" "dkim=none"
)
) {
fileinto "Junk";
stop;
}
# Фолбэк: если по какой-то причине нет Authentication-Results,
# но подписи DKIM тоже нет — считаем спамом (можешь убрать, если не нужно)
if not exists "DKIM-Signature" {
fileinto "Junk";
stop;
}
Не забываем исправить на свой домен строку:
header :contains "Authentication-Results" "mx.codebeer.ru",
Компилируем файл правил:
sievec /etc/dovecot/sieve/00-dkim-to-junk.sieve
Следующий этап настройки Настройка Dovecot