Если настройка OpenDKIM производится для сервера servername.example.com который отвечает за почту домена example.com, то последовательность действий будет следующая.

Перед выполнением инструкций убедитесь что:

  • команда hostname -f возвращает FQDN вида servername.example.com
  • hostname без аргументов возвращает servername
  • hostname -d возвращает example.com

Если у вас это не так, смотрите подсказку после инструкций.

Только при выполнении этих условий указанные ниже команды сработают корректно.

Делаем по шагам

  1. Создадим набор ключей для сервера исходя из его имени.

    mkdir /etc/opendkim/
    opendkim-genkey -D /etc/opendkim/ -d $(hostname -d) -s $(hostname)
    
  2. Зададим корректные права на доступ к ключам и защитим их от случайной перезаписи.

    chgrp opendkim /etc/opendkim/*
    chmod g+r /etc/opendkim/*
    chown opendkim /etc/opendkim/*.private
    chmod go-rwx,a-w /etc/opendkim/*.private
    chmod a+r /etc/opendkim/*.txt
    chattr +i /etc/opendkim/*.txt /etc/opendkim/*.private
    
  3. Пропишем ключи в конфигурационных файлах.

    echo $(hostname -f | sed s/\\./._domainkey./) $(hostname -d):$(hostname):$(ls /etc/opendkim/*.private) | 
        tee -a /etc/opendkim/keytable
    echo $(hostname -d) $(hostname -f | sed s/\\./._domainkey./) | 
        tee -a /etc/opendkim/signingtable
    
  4. Запишем базовую конфигурацию для OpenDKIM включающую только добавление подписей.

    tee -a /etc/opendkim.conf  <<EOF
    Canonicalization relaxed/relaxed
    Mode s
    KeyTable file:/etc/opendkim/keytable
    SigningTable file:/etc/opendkim/signingtable
    X-Header yes
    EOF
    
  5. Дадим Postfix доступ к сокету OpenDKIM.

    gpasswd -a postfix opendkim
    
  6. Настроим Postfix на использование OpenDKIM с учетом работы того в chroot.

    postconf -e milter_default_action=accept
    postconf -e milter_protocol=2
    postconf -e smtpd_milters=unix:/var/run/opendkim/opendkim.sock
    postconf -e non_smtpd_milters=unix:/var/run/opendkim/opendkim.sock
    echo 'SOCKET="local:/var/spool/postfix/var/run/opendkim/opendkim.sock"' | 
        tee -a /etc/default/opendkim
    mkdir -p /var/spool/postfix/var/run/opendkim
    chown opendkim:opendkim /var/spool/postfix/var/run/opendkim
    
  7. Перезапустим все задействованные службы.

    service opendkim restart
    service postfix reload
    
  8. Посмотрим публичный ключ и добавим его в DNS.

    cat /etc/opendkim/*.txt
    
  9. Наконец, проверим что публичный ключ виден миру.

    dig +short TXT $(hostname -f | sed s/\\./._domainkey./)
    

Для желающих разобраться есть и более подробное описание настройки связки Postfix + OpenDKIM с разбором каждого шага и детальными объяснениями.

Что дальше?

Можно попросить весь интернет не принимать письма без DKIM-подписи с вашего домена.

_adsp._domainkey IN TXT "dkim=all"

Что если hostname у меня работает не так?

Имя хоста в Debian и родственных дистрибутивах задаётся в двух местах:

  1. В /etc/hostname указывается имя сервера без домена. В нашем случае в /etc/hostname должна быть только одна строка:

    servername
    
  2. FQDN задаётся в /etc/hosts в следующем формате:

    172.31.64.88    servername.example.com  servername
    

    Где 172.31.64.88 - публичный IP сервера.

При успешной настройке вы должны получить аналогичный вывод:

$ hostname -f; hostname; hostname -d
servername.example.com
servername
example.com