Как стать автором
Обновить

Настраиваем свой send-only почтовый сервер postfix с DKIM в docker-контейнере

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров2.3K

Если вы читаете этот материал, скорее всего вы уже знаете что поднять свой почтовик это страдание и внезапно нетривиальная задача. Цель статьи - без лишней лирики дать пошаговый мануал тем, кто хочет настроить свой собственный мейлер и не платить деньги mailgun и подобным SMTP-relay сервисам.

Стек

VPS OS: Ubuntu 22.04 server // 1Gb RAM // 1vCPU
Soft: docker, certbot

Также на этом этапе предполагается что у вас уже куплен домен, и он добавлен в панель управления CloudFlare. Настраивать DNS мы будем там, если вы не хотите использовать CF по аналогии все делается и в других панелях регистратора.

Установка нужного софта

По стандарту, обновляем сервер:

apt update && apt upgrade -y

Ставим docker из репозиториев самого докера (пока все из под root):

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
apt update

apt install ca-certificates curl

install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

chmod a+r /etc/apt/keyrings/docker.asc

Ниже одна команда, копируем целиком и вставляем в терминал

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Ставим наконец докер

apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Ставим certbot

apt install certbot

Теперь, чтобы выпустить сертификат, нам нужно добавить А-запись в CloudFlare. Идем в панель управления домена в раздел DNS и добавляем запись типа А следующим образом: в Name пишем mail, в ipv4 address пишем IP вашего VPS, и обязательно отключаем проксирование.

Теперь возвращаемся в терминал и выпускаем SSL-сертификаты:

certbot certonly --standalone -d mail.yourdomain.com

Certbot обычно сам создает cron-запись для ежедневного обновления сертификатов, и этого нам делать не нужно. Но ввиду того что у нас postfix живет в докере, он не в курсе что ему нужно перезапускаться для загрузки новых сертификатов. Поэтому мы должны подцепить перезапуск контейнера к хуку certbot-а.

Для этого мы создаем файл:

nano /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh

И в него помещаем:

#!/bin/bash
docker restart postfix

Теперь после перевыпуска сертификатов докер рестартнет наш контейнер, и новые сертификаты подгрузятся в postfix.

Создаем пользователя

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

useradd -m emailuser -G docker -s /bin/bash

Задаем этому пользователю пароль

passwd emailuser

Переключаемся на свежесозданного пользователя

su emailuser

Настраиваем docker-compose.yml

Создаем файл docker-compose.yml

nano docker-compose.yml

И вставляем туда, не забыв подставить свой домен везде вместо yourdomain.com и задать пароль для авторизации:

services:
  postfix:
    image: boky/postfix
    container_name: postfix
    restart: unless-stopped
    ports:
      - "587:587"
    volumes:
      - ./dkim:/etc/opendkim/keys
      - /etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem:/etc/opendkim/keys/mail.crt:ro
      - /etc/letsencrypt/live/mail.yourdomain.com/privkey.pem:/etc/opendkim/keys/mail.key:ro
    environment:
      HOSTNAME: mail.yourdomain.com
      DOMAIN: yourdomain.com
      DKIM_SELECTOR: mail
      DKIM_DOMAINS: yourdomain.com
      DKIM_KEY_LENGTH: 2048
      ENABLE_DKIM: 1
      ENABLE_TLS: 1
      TLS_KEY: /etc/opendkim/keys/mail.key
      TLS_CERT: /etc/opendkim/keys/mail.crt
      SMTP_USER: noreply@yourdomain.com|password
      RELAY_NETWORKS: 127.0.0.1/32
      FORCE_HELO: 1
      LOG_TO_STDOUT: 1
      ALLOWED_SENDER_DOMAINS: proxy.expert
      DKIM_AUTOGENERATE: "true"

В результате запуска этого контейнера командой docker compose up -d мы получим следующее:

  • Докер подтянет образ boky/postfix в котором помимо postfix есть также и opendkim, необходимый для подписи писем и непопадания их в папку "спам".

  • Будут созданы DKIM-ключи при первом запуске и мы сможем смотреть их в папке /home/emailuser/dkim на нашем VPS

  • Сервер будет доступен на порту 587 нашего VPS

  • Появится возможность отправлять письма только из localhost ИЛИ тем, кто знает логин и пароль из директивы SMTP_USER

После первого запуска и генерации ключей директиву DKIM_AUTOGENERATE можно удалить или закомментировать.

Дальнейшая настройка DNS-записей

Теперь мы продолжаем настройку DNS, поскольку имеем все необходимое для этого. Идем в папку dkim и находим файл, который заканчивается на .txt

В нем будет нечто такого вида:

mail._domainkey	IN	TXT	( "v=DKIM1; h=sha256; k=rsa; s=email; "
	  "p=МНОГО_СИМВОЛОВ"
	  "ЕЩЕ_МНОГО_СИМВОЛОВ" )  ; ----- DKIM key mail for yourdomain.com

Открываем текстовый редактор и делаем следующую конструкцию там:

v=DKIM1; h=sha256; k=rsa; s=email; p=МНОГО_СИМВОЛОВЕЩЕ_МНОГО_СИМВОЛОВ

То есть мы без ковычек и скобок копируем параметры из файла, и две части ключа мы соединяем вместе в одну длинную строку. Далее мы идем в DNS-записи на CloudFlare и создаем запись типа TXT, в поле "Name" пишем:

mail._domainkey

В поле Content вставляем получившуюся у нас в текстовом редакторе конструкцию, и сохраняем.

Таким образом мы настроили сверку DKIM-подписи, которая подтвердит подлинность наших email-соощений, гарантируя что они происходят с нашего домена и нашего сервера, т.к. адрес отправителя email легко подделывается.

Далее мы создаем еще одну TXT запись, в Name указываем наш домен вида mydomain.com, в Content прописываем:

"v=spf1 a mx ip4: -all"

Этой записью мы указываем, что единственный IP адрес который имеет право отправлять письма с нашего домена - это адрес нашего VPS.

Настройка rDNS и открытие порта 25 у хостера

Это еще не всё. Теперь нам предстоит пообщаться с хостинг-провайдером, который продал нам VPS. Потому что по умолчанию почти на всех хостерах запрещены исходящие сообщения на порт 25, и нам нужно попросить их открыть. Для этого обычно нужно написать тикет в техподдержку.

А также нам нужно включить reverse dns (rDNS) для адреса mail.mydomain.com. У разных провайдеров это делается по-разному, где-то есть такой пункт в настройках VPS, где-то нужно писать тикет в поддержку.

Тесты

После того как все это будет проделано, можно приступить к тестам. Есть сервисы, которые позволяют вам увидеть скоринг вашего письма:

https://www.mail-tester.com/
https://www.appmaildev.com/en/dkim

Они дадут вам одноразовый адрес, куда вам нужно отправить письмо с вашего свежесозданного почтового сервера.

Чтобы отправить письмо, мы на VPS выполняем команду для входа в консоль контейнера:

docker exec -it postfix bash

И там выполняем:

echo -e "Subject: DKIM Test\n\nThis is a test message" | sendmail -f noreply@mydomain.com recipient@example.com

подставив вместо mydomain.com наш домен, вместо recipient@example.com адрес который вам выдал сервис.

Если вы видите что у вас все ОК с DKIM и прочими параметрами, можно попробовать отправить таким же способом письмо себе на gmail и ощутить приятную годрость, видя как оно попало во "входящие".

Теги:
Хабы:
+4
Комментарии13

Публикации

Работа

DevOps инженер
27 вакансий

Ближайшие события