Персональный почтовый сервер

Персональный почтовый сервер #

Если у Вас онлайн магазин или блог или любой другой сайт, которому требуется рассылать почтовые сообщения клиентам и Вы хотите, чтобы почта отправлялась с вашего домена — Вам нужен собственный SMTP сервер, построенный с использованием правильно настроенных Postfix и DKIM. Вы можете воспользоваться уже готовыми многофункциональными SMTP серверами, которые предоставляют различные почтовые службы, например, «GMAIL» или «Yandex.Почта», но если Вам нужен именно ваш собственный сервер, то эта небольшая, но полноценная инструкция для Вас!

Как всегда, инструкция состоит из простых коротких шагов с минимумом текста. По возможности, конечно же…

Будет рассмотрена установка почтового агента (SMTP) Postfix, а также DKIM, TLS и всех необходимых записей на NS-серверах, чтобы добиться результата в 10 баллов на mail-tester.com.

Все примеры показаны на базе ОС Debian. Они также должны подойти без изменения для Ubuntu. Также за основу берется настройка почты для моего домена denisbondar.com.

DNS #

Здесь и далее под доменом будет пониматься полное имя домена (FQDN). Я буду использовать везде имя своего домена denisbondar.com. Обратите внимание на то, что мой блог имеет адрес blog.denisbondar.com.

Для работы нашего почтового сервера необходимы три основные обязательные записи на NS-сервере, обслуживающем этот домен.

Вам необходимо открыть раздел управления серверами имен (NS) панели управления вашим хостингом. Она может называться как-то иначе, например, в DigitalOcean она называется Domains.

A-запись #

Для вашего домена должна быть обязательно настроена A-запись (соответствие IP-адреса доменному имени). Но если на этом же домене работает ваш сайт, то запись уже есть. В моем случае сайт имеет адрес blog.denisbondar.com, а в качестве почтового я буду использовать denisbondar.com, поэтому я должен создать A-запись для denisbondar.com. Если у вас несколько субдоменов, то для каждого из них должна быть такая запись.

MX-запись #

Эта запись указывает, какой mail exchanger используется в нашем домене. Так как мы используем наш собственный mail exchanger, то необходимо добавить следующую запись:

@ IN MX 0 "denisbondar.com."

Если у вас несколько субдоменов, то для каждого из них должна быть такая запись.

В пользовательском интерфейсе DigitailOcean это выглядит следующим образом. MX-запись для домена в панели управления DigitalOcean

PTR-запись #

Также Вам необходимо настроить PTR-запись для Вашего IP-адреса сервера. Обычно это делается автоматически, если Вы пользуетесь услугами хостинговых компаний. Но в некоторых случаях, если Ваш сервер находится у Вас, а не в облаках, то эту настройку должен выполнить ваш интернет-провайдер, которому принадлежит IP-адрес вашего сервера. Также обратите внимание, есть ли у вас PTR для IPv6 — это пригодится далее.

В DigitalOcean ничего для этого делать не нужно — там PTR создается автоматически и соответствует указанному доменному имени вашего Droplet. У меня это выглядит вот так. PTR-запись для моего IP-адреса в панели DigitalOcean

Подтвердить домен в Google #

Google может и скорее всего будет отклонять почту с неподтвержденных доменов. Поэтому подтвердите домен перейдя по ссылке https://postmaster.google.com — это займет всего минуту.

Больше информации здесь.

Postfix #

Установка и настройка SMTP агента Postfis.

sudo apt update
sudo apt install -y postfix mailutils

Во время установки вам нужно будет выбрать Internet Site и далее указать ваш домен (в моем случае это denisbondar.com).

После установки отредактируйте файл /etc/postfix/main.cf

sudo nano /etc/postfix/main.cf

Найдите строку inet_interfaces и замените ее значение по умолчанию all на loopback-only. Это необходимо для того чтобы почтовый сервер принимал подключения только на локальном интерфейсе. Нам ведь нужно чтобы только наш сайт/блог/магазин мог отправлять почту через наш сервер, а не весь интернет. Если в будущем понадобится отправлять почту с других ваших серверов через этот, нужно будет добавить интерфейсы здесь.

Найдите строку mydestination и отредактируйте ее указав все домены, с которых сервер будет отправлять почту (через запятую):

mydestination = $myhostname, denisbondar.com

Здесь первым в списке идет переменная $myhostname, значение которой соответствует имени вашего хоста. В моем случае оно denisbondar.com и конкретно в моем случае нет смысла также добавлять denisbondar.com в этот список, но у Вас имя хоста и почтовый домен могут отличаться. Обратите на это внимание.

Если ваш хостер не поддерживает PTR IPv6, то нужно оставить только протокол IPv4, иначе при попытке работы через IPv6 возникнут проблемы с PTR:

inet_protocols = ipv4

Работа с файлом main.cf завершена.

Далее настроим псевдонимы, если это необходимо. Было бы правильным это сделать. Системные сообщения на сервере обычно отправляются пользователю root. Мы же можем указать в качестве псевдонима для root настоящий адрес электронной почты, на который будут приходить эти письма.

echo "root: myreadlemail@gmail.com" | sudo tee -a /etc/aliases
sudo newaliases

Вместо myreadlemail@gmail.com укажите свой настоящий адрес электронной почты.

Теперь перезагрузите postfix.

sudo systemctl restart postfix

На этом базовая настройка Postfix завершена и уже можно проверить его работу. Отправьте почту пользователю root или же на любой другой адрес электронной почты для проверки (укажите его вместо root):

echo "Test email body" | mail -s "Test email subject" root

TLS-шифрование #

Шифрование можно не применять, однако почтовые клиенты ваших получателей будут видеть красный предупреждающий замок, что письма не зашифрованы. Например, gmail отображает такие письма следующим образом:

Отсутствие шифрования письма выглядит как красный замок

Подробная информация. Домен не шифрует почту.

Исправим это.

Создадим сертификат (это всё одна строка):

sudo openssl req -new -nodes -x509 -days 3650 \
    -out /etc/postfix/smtpd.pem \
    -keyout /etc/postfix/smtpd.pem

И снова отредактируем файл /etc/postfix/main.cf

sudo nano /etc/postfix/main.cf

Отыщите в файле блок настроек TLS и измените либо добавьте параметры в нем следующим образом:

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Теперь необходимо настроить Postfix на прием подключений на TLS порту (465/SMTPS). Отредактируйте файл /etc/postfix/master.cf

sudo nano /etc/postfix/master.cf

Необходимо дополнительно раскомментировать строки таким образом, чтобы команда выглядела вот так (каждый параметр в этом файле находится в отдельной строке, так что придется найти их в отдельности и расскомментировать и изменить при необходимости):

smtps inet n - y - - smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

Перезапустите Postfix и снова проверьте его работу.

sudo systemctl restart postfix
echo "Test email body with TLS" | mail -s "Test email subject with TLS" root

Теперь в почтовом клиенте вы должны увидеть, что письмо зашифровано. Красного замка нет

Подробная информация с TLS шифрованием

SPF (Sender Policy Framework) #

SPF позволяет настроить список различных серверов, которые могут отправлять почту с вашего домена.

Эта настройка производится на NS-серверах, обслуживающих Ваш домен.

Вам необходимо добавить запись типа TXT для вашего домена, которая определяет, какие хосты могут отправлять почту используя ваш домен. Добавим сюда только IP-адреса нашего сервера, чтобы только наш сервер считался авторизованным. Для всех остальных будет применено правило «жесткий отказ» -all, чтобы гарантировать, что с нашего домена никакие другие серверы не смогут отправлять сообщения.

В моем случае я добавляю запись:

@ IN TXT "v=spf1 a mx ip4:207.154.240.75 -all"

Если у вас несколько субдоменов (сайтов), то нужно добавить такую запись для каждого из них.

В панели DigitalOcean это выглядит следующим образом. Добавление TXT-записи SPF в консоли DigitalOcean

DKIM (DomainKeysIdentifiedMail) #

DKIM — цифровая подпись, подтверждающая подлинность отправителя.

Необходимо установить пакет OpenDKIM и произвести его настройку.

sudo apt install -y opendkim opendkim-tools

Стандартный файл конфигурации /etc/opendkim.conf содержит слишком много комментариев и лишних опций, поэтому лучше сразу переименовать его в backup на всякий случай и начать работу с новым конфигом.

sudo mv /etc/opendkim.conf /etc/opendkim.conf.backup
sudo nano /etc/opendkim.conf

Приведём файл к виду:

AutoRestart         Yes
AutoRestartRate     10/1h
Background          yes
DNSTimeout          5
Umask               002
Syslog              yes
SyslogSuccess       Yes
LogWhy              Yes
Canonicalization    relaxed/simple
ExternalIgnoreList  refile:/etc/opendkim/trusted.hosts
InternalHosts       refile:/etc/opendkim/trusted.hosts
KeyTable            refile:/etc/opendkim/key.table
SigningTable        refile:/etc/opendkim/signing.table
Mode                sv
PidFile             /run/opendkim/opendkim.pid
SignatureAlgorithm  rsa-sha256
UserID              opendkim
Socket              local:/var/spool/postfix/opendkim/opendkim.sock

Создадим все необходимые каталоги и файлы:

sudo mkdir -p /etc/opendkim/keys
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys

sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:opendkim /var/spool/postfix/opendkim

sudo touch /etc/opendkim/key.table
sudo touch /etc/opendkim/signing.table

Теперь в файл /etc/opendkim/trusted.hosts и помещаем доверенные узлы, с которых может осуществляться отправка. В будущем, если нужно будет разрешить отправку почты с каких-то еще узлов, нужно будет добавить их в этот файл.

sudo tee -a /etc/opendkim/trusted.hosts <<EOT
127.0.0.0/8
[::ffff:127.0.0.0]/104
[::1]/128
localhost

denisbondar.com
*.denisbondar.com
EOT

Теперь редактируем файл /etc/default/opendkim

sudo nano /etc/default/opendkim

Здесь нужно изменить (добавить) сокет, на котором OpenDKIM будет принимать соединения.

SOCKET=local:/var/spool/postfix/opendkim/opendkim.sock

Включаем и запускаем службу opendkim.

sudo systemctl enable opendkim
sudo systemctl restart opendkim

Создание ключей #

Описанные действия также необходимо будет выполнить при добавлении новых доменов, с которых ваш почтовый сервер будет уполномочен отправлять почту. Например, если у вас на сервере появится еще один сайт, работающий на другом домене, почта с которого должна отправляться с его доменного имени.

Для создания сертификата можно воспользоваться онлайн инструментом dkimcore.org или же создать самому следующим образом:

sudo mkdir -p /etc/opendkim/keys/denisbondar.com
sudo opendkim-genkey -b 2048 --selector mail --domain denisbondar.com -D /etc/opendkim/keys/denisbondar.com/
sudo chown opendkim:opendkim /etc/opendkim/keys/denisbondar.com/mail.private
sudo chmod 600 /etc/opendkim/keys/denisbondar.com/mail.private

В результате будет создана пара ключей: mail.private (закрытый) и mail.txt (открытый). Открытый ключ далее необходимо будет прописать в NS-сервере. В данном случае mail — это селектор (он может быть любым).

Если доменов/субдоменов несколько, нужно повторить эту процедуру для каждого из них.

Создаем таблицу /etc/opendkim/key.table — в ней находится список соответствий между селекторами, доменами и файлами с закрытыми ключами.

Формат таблицы следующий:

<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>

В нашем случае таблица будет создана следующим образом:

echo "mail._domainkey.denisbondar.com denisbondar.com:mail:/etc/opendkim/keys/denisbondar.com/mail.private" \
    | sudo tee -a /etc/opendkim/key.table

Создаем таблицу /etc/opendkim/signing.table — в ней находится список соответствия между определенными email-адресами и записями в key.table.

echo "*@denisbondar.com mail._domainkey.denisbondar.com" \
    | sudo tee -a /etc/opendkim/signing.table

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

sudo systemctl restart opendkim

Настройки DNS #

Теперь необходимо внести следующие изменения в настройки вашего домена (NS-серверов).

Необходимо создать запись типа TXT и содержимым из файла открытого ключа.

Выводим в консоль содержимое файла открытого ключа:

sudo cat /etc/opendkim/keys/denisbondar.com/mail.txt | awk -F'"' '{print $2}' ORS=''

Теперь создаем TXT-запись следующего вида (значением записи является заключенная в кавычки строка, полученная по команде выше):

mail._domainkey IN TXT "v=DKIM1; ..."

Добавьте также следующие TXT записи (для каждого своего субдомена):

_domainkey IN TXT "o=~; r=postmaster@denisbondar.com"
_dmarc IN TXT "v=DMARC1; p=none"

Проверка #

Для проверки ключа, выполните:

sudo opendkim-testkey -d denisbondar.com -s mail -vvv

Postfix #

Добавить пользователя postfix в группу opendkim:

sudo adduser postfix opendkim

Теперь необходимо внести изменения в /etc/postfix/main.cf

sudo nano /etc/postfix/main.cf

Редактируем либо добавляем следующие строки. Так как Postfix работает в chroot, то путь к файловому сокету будет относительно chroot:

milter_protocol = 6
milter_default_action = accept
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

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

sudo systemctl restart opendkim postfix

Проверка #

Для полной проверки воспользуемся сервисом mail-tester.com.

На странице сервиса отображается адрес электронной почты, на который следует отправить письмо для теста. Копируем его и отправляем на него письмо из консоли сервера:

echo "Test letter." | mail \
    -s "Testing denisbondar.com" \
    -a "Smtp: localhost:25" \
    -a "From: blog@denisbondar.com" \
    -a "List-Unsubscribe: <mailto: unsubscribe@denisbondar.com?subject=unsubscribe>" \
    test-xxxxxxx@srv1.mail-tester.com

После чего нажимаем «Затем проверить оценку».

В приведенном выше примере отправки тестового письма содержится заголовок List-Unsubscribe. В данном случае он необходим только для того чтобы получить максимальный бал. Очень желательно, чтобы ваши письма по возможности имели такой заголовок — это требование для рассылок. В личной переписке в этом заголовке, конечно же, смысла нет.

Ну и, долгожданный результат!

Всё настроено превосходно

comments powered by Disqus