Установка почтового сервера Postfix, OpenDKIM и SPF

Postfix – это популярный Mail Transfer Agent (MTA), он используется для того, чтобы доставлять или перенаправлять электронную почту на сервере. Примерно 25% серверов использует Postfix 1).

sudo -s
apt update && apt upgrade
apt install postfix opendkim opendkim-tools s-nail
  • General type of mail configuration?: Дальше запустится интерфейс конфигурации Postfix. Указываем в качестве использования "Internet Site", или что-то другое, если это соответствует вашим нуждам.
  • System mail name: Здесь нужно ввести адрес основного домена, даже если у нас почтовый сервер находится на mail.example.com, нам надо указать просто example.com.
  • Root and postmaster mail recipient: Аккаунт, на который будет приходить почта, основной аккаунт. Например, hello@example.com, в таком случае указываем просто hello.
  • Other destinations to accept mail for: Например, localhost, mail.example.com, structure.example.com.

Указываем папку нашего почтового ящика и создаем список пользователей/адресов.

postconf -e 'home_mailbox= Maildir/'
sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'
nano /etc/postfix/virtual
# указываем ящики в таком формате
contact@example.com user
root@example.com root
# сохраняем ^C
postmap /etc/postfix/virtual
# перезапуск Postfix
systemctl restart postfix
sudo ufw allow Postfix
echo 'export MAIL=~/Maildir' | sudo tee -a /etc/bash.bashrc | sudo tee -a /etc/profile.d/mail.sh
# Смотрим
source /etc/profile.d/mail.sh
nano /etc/s-nail.rc
# Добавляем в конец
set emptystart
set folder=Maildir
set record=+sent
echo 'init' | mail -s 'init' -Snorecord user
nano ~/test_message # Вводим что-нибудь
cat ~/test_message | mail -s 'Test Subject' -r user user@gmail.com
# -s [Тема, поле Subject]
# -r [Имя пользователя, от которого будет отправлено письмо]
# user@gmail.com - почта, на которую придет письмо

И видим, что письмо попало в спам. Чтобы этого не случалось, нам надо настроить SPF и DKIM 2).

Чтобы отправляемые с сервера письма не попадали в спам, нам надо указать MX запись и SPF запись. Это делается у хостера в панели настройки DNS, у Digital Ocean она называется Networking.

Указываем параметры, как на скриншоте, DKIM мы рассмотрим дальше.

Для SPF создаем новую запись TXT, где Hostname - адрес вашего сайта, а то, что запись возвращает v=spf1 mx a ip4:your.ip.is.here ~all. В MX записи просто указываем домен.

nano /etc/opendkim.conf

Добавляем в файл следующее.

opendkim.conf
# Вносим в этот файл
AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes
 
Canonicalization        relaxed/simple
 
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
 
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256
 
UserID                  opendkim:opendkim
 
Socket                  inet:12301@localhost

И проводим дальнейшую настройку.

nano /etc/default/opendkim

Добавляем в файл:

SOCKET="inet:12301@localhost"

Теперь конфигурируем Postfix:

nano /etc/postfix/main.cf

В этом файле должно быть две строчки, если они комментированы – раскомментируем, если их нет – добавляем.

milter_protocol = 2
milter_default_action = accept

Также добавляем:

smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

Или, если на сервере установлен SpamAssasin или что-то подобное:

smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301
non_smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301

Создаем структуру папок для ключей разрешенных хостов:

mkdir /etc/opendkim
mkdir /etc/opendkim/keys

И указываем эти хосты:

sudo nano /etc/opendkim/TrustedHosts
127.0.0.1
localhost
192.168.0.1/24
 
*.example.com

Создаем таблицу ключей:

sudo nano /etc/opendkim/KeyTable
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private

И таблицу доменов:

nano /etc/opendkim/SigningTable
*@example.com mail._domainkey.example.com

Сначала создаем каталог для ключей, имя каталога должно быть таким же, как и мы указывали ранее, то есть имя нашего домена.

cd /etc/opendkim/keys
mkdir example.com
cd example.com

Генерируем ключи, и выставляем нужные права доступа на приватный ключ, чтобы другие пользователи не имели к нему доступа.

opendkim-genkey -s mail -d example.com
chown opendkim:opendkim mail.private

Теперь нам осталось только внести запись ключа в Networking.

cat mail.txt
Name: mail._domainkey.example.com
Text: "v=DKIM1; k=rsa;" "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"

В итоге все должно получиться согласно скриншоту.

Перезапускаем Postfix и OpenDKIM.

sudo service postfix restart
sudo service opendkim restart

Для того, чтобы убедиться, что мы настроили все корректно, отправляем пустое письмо на адрес check-auth@verifier.port25.com, если все в порядке, то мы получим примерно такой ответ:

==========================================================
Summary of Results
==========================================================
SPF check:          pass
DomainKeys check:   neutral
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham

И заодно можно себе отправить на e-mail, и убедиться, что письма в спам больше не попадают.

Если ответ такой:

==========================================================
Summary of Results
==========================================================
SPF check:          pass
"iprev" check:      fail
DKIM check:         pass
SpamAssassin check: ham

"iprev" check: fail означает, что проблема с Reverse DNS, в случае с Digital Ocean это решается переименованием Droplet'а в имя домена.