Развернул сайт на выделенном сервере с ОС Ubuntu Server 22.04. Надо бы на том же сервере организовать отправку писем для одного домена. Пока для одного. Естественно, это будет домен internet-lab.ru.
Наш почтовый сервер будет только отправлять письма.
Установка Postfix
Устанавливаем почтовый сервер:
apt-get update
apt-get install postfix
Общий тип почтовой настройки выбираем "Без настройки":
Создаём главный файл настроек main.cf:
vim /etc/postfix/main.cf
myorigin = post.internet-lab.ru myhostname = post.internet-lab.ru mydomain = internet-lab.ru smtpd_banner = post.internet-lab.ru biff = no alias_maps = hash:/etc/postfix/aliases mynetworks = 127.0.0.0/8 10.0.0.7/32 [::ffff:127.0.0.0]/104 [::1]/128 message_size_limit = 35840000 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = ipv4 masquerade_classes = envelope_sender, header_sender maximal_queue_lifetime = 3d compatibility_level = 2 smtp_use_tls = yes disable_mime_output_conversion = yes milter_protocol = 2 milter_default_action = accept smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
Последние 4 строки — конфигурация для DKIM, позже настроим. mynetworks — список сетей, с которых можно слать, в моём случае без авторизации и только самому себе.
Создаём файл /etc/postfix/aliases:
vim /etc/postfix/aliases
postmaster:root
Выполняем:
postalias /etc/postfix/aliases
Перезагружаем Postfix.
service postfix restart
SPF, DMARC и прочее
SPF (Sender Policy Framework) — это TXT запись в DNS домена, которая содержит информацию о списке серверов, которые имеют право отправлять письма от имени этого домена и механизм обработки писем, отправленных от других серверов.
Разрешим отправку писем для нашего домена с данного сервера. У сервера прямой IP адрес, укажем его в DNS в SPF записи, добавив блок ip4:176.109.108.64.
@ IN TXT "v=spf1 ip4:46.39.246.23 ip4:176.109.108.64 -all" @ IN TXT "spf2.0/mfrom,pra ip4:46.39.246.23 ip4:176.109.108.64 -all"
SPF2.0 не входит в стандарт RFC, но каши не просит, тоже добавил.
Раз уж мы полезли в DNS, то настроим за одно DMARC.
DMARC (Domain-based Message Authentication, Reporting and Conformance) — это TXT запись в DNS домена, которая устанавливает стандарт для идентификации электронных сообщений принимающими узлами если письмо не проходит проверку SPF (Sender Policy Framework) или DKIM (DomainKeys Identified Mail).
_dmarc.internet-lab.ru. IN TXT "v=DMARC1; p=reject; sp=reject; rua=mailto:info@internet-lab.ru"
В настройках Postfix я указал имя хоста как post.internet-lab.ru, так он и пишет в HELO. Почтовики могут проверять эту запись, так что добавим её в DNS.
Первая проверка отправки письма
Пытаемся отправить письмо с помощью telnet по 25 порту с самого сервера без аутентификации. Отправляем, к примеру, на Mail.Ru.
Письмо пришло.
В служебных заголовках можно увидеть, что письмо прошло проверки SPF и DMARC.
Received-SPF: pass (mx254.i.mail.ru: domain of internet-lab.ru designates 176.109.108.64 as permitted sender) client-ip=176.109.108.64; envelope-from=test@internet-lab.ru; helo=post.internet-lab.ru; X-Mailru-Dmarc-Auth: dmarc=pass header.from=test@internet-lab.ru
Настройка DKIM
Настроим DKIM, чтобы наши письма меньше попадали в спам.
DomainKeys Identified Mail (DKIM) — метод e-mail аутентификации, разработанный для обнаружения подделывания сообщений, пересылаемых по email. Метод дает возможность получателю проверить, что письмо действительно было отправлено с заявленного домена.
Настройки для DKIM мы уже добавляли в /etc/postfix/main.cf:
milter_protocol = 2 milter_default_action = accept smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891 disable_mime_output_conversion = yes
Здесь "disable_mime_output_conversion = yes" — патч для исправления ошибки с кириллицей.
Postfix — не работает DKIM с кириллицей
Ставим opendkim.
apt-get install opendkim opendkim-tools
Создаём каталог для ключей и сгенерируем ключ (пока для одного домена):
mkdir /etc/opendkim
chown opendkim:opendkim /etc/opendkim
opendkim-genkey -D /etc/opendkim/ --domain internet-lab.ru --selector post
Где:
- internet-lab.ru — наш домен
- post — наш селектор который мы выбрали для данного почтового сервера
Появится два файла /etc/opendkim/post.private и /etc/opendkim/post.txt с секретным и публичным ключами.
Публичный ключ нужно добавить в соответствующую TXT запись нашего домена.
post._domainkey IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCA....QAB"
Ключ может не влезать, тогда его нужно разбить на несколько строк (открывающиеся кавычки должны быть в начале строки, перед ними не должно быть пробелов и табуляции).
myselector._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQK"
"..."
"..."
"........DAQAB" )
Если раньше не добавляли, то добавляем и остальные необходимые записи для DKIM.
_domainkey.internet-lab.ru. IN TXT "t=y; o=~;" _adsp._domainkey.internet-lab.ru. IN TXT "dkim=all"
Настраиваем /etc/opendkim.conf.
Syslog Yes SyslogSuccess Yes LogWhy Yes UMask 007 Mode sv SOCKET inet:8891@localhost PidFile /run/opendkim/opendkim.pid OversignHeaders From TrustAnchorFile /usr/share/dns/root.key UserID opendkim InternalHosts refile:/etc/opendkim/TrustedHosts KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable
Создаём файл /etc/opendkim/TrustedHosts. Здесь те же сети, что и в файле настроек /etc/postfix/main.cf в пункте mynetworks.
vim /etc/opendkim/TrustedHosts
127.0.0.1 localhost 10.0.0.7/32
Создаём файл /etc/opendkim/KeyTable.
vim /etc/opendkim/KeyTable
post._domainkey.internet-lab.ru internet-lab.ru:post:/etc/opendkim/post.private
Создаём файл /etc/opendkim/SigningTable.
vim /etc/opendkim/SigningTable
*@internet-lab.ru post._domainkey.internet-lab.ru
Задаем группу владельца opendkim для созданных ключей и файлов.
chown :opendkim /etc/opendkim/*
Устанавливаем права на секретный ключ.
chmod 640 /etc/opendkim/post.private
В /etc/default/opendkim необходимо указать сокет, который будет слушать opendkim (другие директивы SOCKET необходимо закомментировать). Это не обязательно, вроде бы, потому как сокет уже ранее мы указали, но для совместимости со старыми версиями пусть будет.
SOCKET="inet:8891@localhost"
Перезапускаем postfix и opendkim:
service opendkim restart
service postfix restart
Осталось только проверить и отправить письмо. Тестовое письмо отправлено и дошло. В логах видим:
opendkim[245183]: D572446BE9: DKIM-Signature field added (s=post, d=internet-lab.ru)
В служебных заголовках можно увидеть, что письмо прошло проверку DKIM.
dkim=pass header.d=internet-lab.ru; dmarc=pass header.from=info@internet-lab.ru
Подкручиваем гайки
Я не собираюсь считать статистику сколько писем не дошло. Поэтому отключаю отправку отчетов от MAILER_DAEMON. В файле /etc/postfix/master.cf меняем строку:
bounce unix - - y - 0 discard
Не забываем про:
service postfix restart