no-style

Почтовый сервер на основе Mailcow в Docker контейнере

docker-compose + mailcow
Рассмотрим ещё один современный и хорошо зарекомендовавший себя почтовый сервер Mailcow. Он позволит забыть о томительной настройке всех отдельных сервисов, необходимых для поднятия почтового сервера. Ведь с помощью Mailcow мы выполним большую часть конфигурации в удобном веб интерфейсе. А поднимать всё это добро будем в удобном Docker контейнере.


Необходимые требования

Чтобы всё получилось нам понадобится:

  • Сервер с Root доступом. Рекомендую вот этот
  • На хостинге должна быть предусмотрена возможность менять PTR запись для своего домена
  • Доменное имя. Можно бесплатный домен или поддомен
  • Установленный Docker + Docker-Compose
  • 30 - 60 минут времени






В двух словах про Mailcow

Mailcow обладает каким то невообразимым количеством настроек, в которых с непривычки можно легко заблудиться. В качестве основных настроек тут есть: добавление и администрирование почтовых доменов, создание и редактирование почтовых ящиков, управление ключами DKIM и другими.

Дополнительно присутствуют такие вещи как: управление через API, настройка входа 2fa, конфигурация мини-фаервола fail2ban, управление квотами / очередями и каратнином. Конфигурация и статистика Rspamd. Роутинг. Настройки для системных оповещений. Логи всех выполняемых сервисов. Алиасы и Catch-All фильтры. Система напоминающая создание cron заданий. Фильтры. Перезапись адресов. Политики TLS.

Одним словом настроек очень много и все их влепить в 1 мануал явно не получится. Однако базовую настройку с нуля до инбокса в Gmail, мы все таки сделаем, с небольшими бонусами по типу настройки Catch-All фильтра.

Стоит так же обязательно напомнить что Mailcow является OpenSource проектом, в том виде в котором его принято видеть, без каких либо скрытых возможностей, которые приобретаются за деньги. Всё прозрачно и бесплатно, для всех!







Особенности почтового сервера

Установка почтового сервера предусматривает что Вы будете добавлять PTR запись, что в свою очередь приведёт к деанону ip адреса сервера из за специфики работы почтовых протоколов. Настоятельно рекомендуется ставить почтовый сервер на отдельной впске или сервере.







Основы электронной почты

MTA (Mail Transfer Agent) - агент пересылки почты.

MDA (Mail Delivery Agent) - агент доставки почты.

MUA (Mail User Agent) - почтовый клиент.


SMTP (Simple Mail Transfer Protocol) - основной протокол обмена эл.почты. Стандартный порт 25

POP3 - протокол для приёма сообщений электронной почты.

IMAP - протокол для приёма сообщений электронной почты.







Предварительная настройка (PTR, DNS, ETC)

Первым делом нам понадобиться поменять PTR запись для домена, на котором мы планируем держать Mailcow. Это делается в интерфейсе вашего хостинга. В каждом хостинге это делается по разному, покажу как это сделано у меня.

mailcow PTR  1

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



PTR запись может обновляться долгое время, зависит от хостинга и DNS. Проверить что она установилась корректно можно несколькими способами


Первый способ nslookup

nslookup -type=PTR ip-адрес-вашего-сервера
ptr-nslookup  1



Второй способ dig

dig -x ip-адрес-вашего-сервера
ptr-dig  1



Также обязательно стоит внести необходимые изменения в DNS зону вашего домена, если это ещё не сделано.

Я все свои домены леплю на cloudflare, поэтому на его примере и буду показывать

dns  1



Желательно установить hostname для Вашего сервера. Впишите свой домен

sudo hostnamectl set-hostname mail.mymailcow.cf
hostname  2

Дополнительно добавим наш домен в /etc/hostname

sudo nano /etc/hostname
hostname  3



Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для mailcow

sudo mkdir -p /app/mail


Переходим в созданную директорию

cd /app/mail


Сделаем нашего пользователя (не root !) владельцем этой директории

sudo chown -R $USER:$USER /app/mail


Загружаем последнюю версию Mailcow с github

git clone https://github.com/mailcow/mailcow-dockerized


На этом предварительная настройка завершена







Установка Mailcow

Переходим в созданную на предыдущем шаге директорию

cd /app/mail/mailcow-dockerized


Теперь необходимо сгенерировать конфигурацию под свой домен. Для этого выполняем команду

./generate_config.sh

После чего последовательно отвечаем на поступающие вопросы:
Указываем FQDN(домен) я указал mail.mymailcow.cf
Выбираем таймзону
По желанию можно отключить ClamAV
И выбираем ветвь обновлений, я выбрал master

generate_config  1

Если мы хотим вручную посмотреть или отредактировать конфигурационные фаил

nano mailcow.conf

Например на сервере с достаточным количеством оперативной памяти вопрос про отключение антивируса ClamAV могут и не задать, поэтому мы можем вручную ограничить это в этом фаиле, изменив строку на SKIP_CLAMD=y


Наконец запускаем всю эту красоту

sudo docker-compose up -d

Мне посчастливилось наткнуться на мини-баг, в результате которого в конфиг не была занесена информация на каком ip запускаться контейнеру nginx.
После того как я вручную внёс HTTP_BIND=0.0.0.0 и HTTPS_BIND=0.0.0.0 в фаил mailcow.conf всё успешно завелось.
fix-bind-address  1

successful-start  1

После того как контейнеры поднялись можем сразу идти на наш домен, который мы указали на этапе генерации конфига, у меня это mail.mymailcow.cf

Но дело в том что по стандарту там будет работать протокол http, который небезопасен. Исправим это



Настроим автоматический редирект HTTP на HTTPS

Как следует из официальной документации, находясь в главной папке mailcow создадим новый фаил

nano data/conf/nginx/redirect.conf

С таким содержанием

server {
  root /web;
  listen 80 default_server;
  listen [::]:80 default_server;
  include /etc/nginx/conf.d/server_name.active;
  if ( $request_uri ~* "%0A|%0D" ) { return 403; }
  location ^~ /.well-known/acme-challenge/ {
    allow all;
    default_type "text/plain";
  }
  location / {
    return 301 https://$host$uri$is_args$args;
  }
}


После этого изменения необходимо перезапустить контейнеры

sudo docker-compose up -d

Теперь вводя наш домен мы будем автоматически переадресованы на https протокол. Сертификат генерируется самоподписной поэтому в некоторых браузерах понадобиться подтвердить риск его использования, тут нет ничего такого, это наш сертификат и мы ему доверяем. Наконец мы увидим страницу авторизации


mailcow-login-page  1

Вводим стандартные данные для авторизации
Login: admin
Password: moohoo

Для того чтобы мануал получился более универсальным я выберу язык EN



Залогинившись сразу меняем пароль для администратора. Нажимаем кнопку Edit

change-password  1



Теперь, пожалуй, посмотрим состояние сервера. В верхней навигационной панельке выбираем пункт Configuration > System Information

system-information  1

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

system-information  2





Настройка Mailcow

Пришло время настроить Mailcow, отправляемся в раздел Configuration > Mail Setup.



Добавление домена

Для того чтобы работать с почтой мы должны сначала добавить домен. Самих доменов может быть несколько, но мы пока добавим 1. Желательно чтобы это был покупной домен, хотя для тестов можно воспользоваться бесплатным фриномовским доменом. В моём случае домен будет mymailcow.cf

Для того чтобы добавить домен нажимаем кнопку + Add domain

Заполняем поля

  • Domain: желаемый домен
  • Description: описане (по желанию)
  • Tags: теги (по желанию)
  • Алиасы и квоты: можно оставить по умолчанию
  • Max. possible mailboxes: максимальное количество почтовых ящиков
  • DKIM key length (bits): желательно выбрать 1024 (т.к. не все днс умеют работать с 2048)


Наконец нажимаем Add domain and restart SOGo

add-domain  1

Спустя какое то время увидим как добавился наш домен

add-domain  2

Посмотрим конфигурацию DNS добавленного домена. Для этого в разделе Action нажимаем кнопку DNS

add-domain  3





Добавление дополнительных DNS записей для домена

Теперь нужно добавить все необходимые записи DNS. Как я уже неоднократно писал, свои домены я леплю на cloudflare именно поэтому я и буду показывать на его примере. Если у Вас не cloudflare ищите как добавить все записи конкретно для Вашего случая.

Я буду показывать сразу на конкретном примере для домена mail.mymailcow.cf Вы же замените на свои данные. Итак, начнём по порядку:



MX запись

MX (Mail Exchanger) - тип DNS записи. Определяет HOST, на который будут отправлены сообщения.

  • Type: MX
  • Name: @
  • Mail server: mail.mymailcow.cf
  • TTL: Auto
  • Priority: 10




CNAME запись

CNAME это тип записи DNS, которая привязывает псевдоним к действительному (каноническому) доменному имени. Записи CNAME обычно используются для привязки субдомена, такого как www или mail к домену, в котором размещен контент этого субдомена.

  • Type: CNAME
  • Name: autodiscover.mymailcow.cf
  • Target: mail.mymailcow.cf

И ещё одну запись

  • Type: CNAME
  • Name: autoconfig.mymailcow.cf
  • Target: mail.mymailcow.cf




SPF запись

SPF (Sender Policy Framework) - текстовая запись в TXT-записи DNS домена. Позволяет указать кто имеет право отправлять письма от имени домена.

  • Type: TXT
  • Name: @
  • TTL: Auto
  • Content: v=spf1 ip4:185.104.114.103 include:mail.mymailcow.cf ~all

Замените ipv4 адрес и домен на свои. Либо можно воспользоваться мастером добавления SPF записи в cloudflare, для этого в настройках DNS надо нажать Use wizard to add an SPF record и ввести свои данные. Подробнее про разновидность написания SPF записи можно посмотреть тут.





DMARC запись

DMARC (Domain-based Message Authentication, Reportingand Conformance) - набор правил для писем от вашего имени, которые не прошли аутентификацию по SPF и DKIM.

Для того чтобы сгенерировать правильную DMARC запись воспользуемся специальным сервисом.

Вводим домен в соответствующее поле. Далее указываем что мы хотим делать с письмами не прошедшими проверку SPF. Я выбирал quarantine в обоих полях Requested policy type и Subdomain Policy: Defaults to same as domain. После чего нажимаем Get DMARC Record и получившуюся запись добавляем в DNS в качестве TXT записи.

add-domain  4

  • Type: TXT
  • Name: _dmarc.mymailcow.cf
  • TTL: Auto
  • Priority: v=DMARC1; p=quarantine; sp=quarantine




DKIM запись

DKIM (DomainKeys Identified Mail) - метод E-mail аутентификации. Предназначен для антифишинга и антиспама. Уберегает содержимое сообщения при передаче между почтовыми серверами.

Сам ключ указан в свойствах DNS для домена в Mailcow. В более старых версиях необходимо было вручную создать этот ключ зайдя на главную страницу Configuration & Details и выбрав там Configuration > ARC/DKIM keys. В этом же разделе мы можем перегенерировать, экспортировать и импортировать ключи.

add-domain  5

  • Type: TXT
  • Name: dkim._domainkey
  • TTL: Auto
  • Priority: v=DKIM1; k=rsa; p=...




TLSA запись

TLSA является необязательной записью. Она используется для связывания сертификата сервера TLS или открытого ключа с доменным именем, в котором находится запись. С записью TLSA вы можете хранить отпечаток сертификата TLS/SSL в DNS вашего домена.

  • Type: TLSA
  • Name: _25._tcp.mail
  • TTL: Auto
  • Usage: 1 число из настроек днс TLSA mailcow
  • Selector: 2 число из настроек днс TLSA mailcow
  • Matching type: 3 число из настроек днс TLSA mailcow
  • Certificate (hexadecimal): 4 число из настроек днс TLSA mailcow

Числа указаны в свойствах домена в mailcow

add-domain  6

А вот так необходимо внести в cloudflare

add-domain  7



В конечном итоге при проверке DNS записей вашего домена в mailcow у Вас должно получиться вот так

add-domain  8

Я не стал заполнять SRV запись потому что она является не обязательной



А вот так это выглядит в cloudflare

add-domain  9

На этом настройка DNS завершена.







Создание почтовых ящиков

Переходим в раздел Configuration > Mail Setup > Mailboxes и нажимаем кнопку + Add mailbox

И заполняем поля своими данными

  • Username: имя пользователя (то что идёт перед символом @)
  • Domain: домен
  • Full name: полное имя (по желанию)
  • Quota: квота места на диске, занимаемое почтовым ящиком (0 = безлимит)
  • Password: пароль, минимально 6 символов, я советую от 20
  • статус: active

add-mailbox  1

И нажимаем кнопку Add.

add-mailbox  2

Наш почтовый ящик успешно добавлен. Можно добавить сколько угодно почтовых ящиков. Если Вы превысили лимит например 10 / 10 - зайдите в свойства домена и увеличьте на необходимое значение. 10 это дефолтное значение для всех новых доменов.

После добавления каждого почтового ящика необходимо нажать кнопку в верхнем навигационном меню Restart SOGo.

add-mailbox  3





Проверяем работу

Для того чтобы проверить работу воспользуемся встроенным почтовым веб клиентом SoGo.

Для этого в верхней навигационной панели нажимаем Apps > Webmail. Далее вводим логин и пароль от только что созданного почтового ящика.

sogo-login  1

И мы попадаем в web интерфейс

sogo-login  2



Чтобы убедиться что мы настроили всё правильно, воспользуемся специальным сервисом mail-tester.com. Этот сайт позволит нам делать 3 проверки в день так что используйте эти попытки экономно.

mail-check  1

Попав на сайт нам сразу же будет предоставлена временная почта, на которую мы должны отправить тестовое письмо. Копируем эту почту и переходим обратно в SoGo.

Создаём новое сообщение и вставляем адрес почты, полученный с меилтестера. И нажимаем отправить.

mail-check  2



Переходим обратно в Mail-Tester и смотрим результат. Как видим мы получили максимально возможное количество баллов

mail-check  3



Ну и напоследок проверяем инбокс в Gmail

mail-check  4

Кстати, если планируете отсылать письма по gmail'ам не лишним будет добавить свой домен на специальную страницу https://postmaster.google.com







Добавляем Catch-All filter

Создадим ещё один ящик. Для примера я назову его catchall@mymailcow.cf На этот ящик будет перенаправляться вся почта которую прислали на несуществующие почтовые ящики нашего домена (info).

Переходим в раздел Configuration > Mail Setup > Aliases > Aliases и нажимаем кнопку + Add alias

В секцию Alias address/es вписываем наш домен в таком виде @mymailcow.cf

А в секцию Goto addresses вписываем почтовый ящик на который будут перенаправлены письма, я вписываю catchall@mymailcow.cf

catchall  1

И нажимаем кнопку Add



Таким образом мы создадим наше перенаправление

catchall  2

Теперь если отправить письмо на существующий почтовый ящик, то это письмо попадёт по адресу. А если отправить письмо на несуществующий адрес, то оно попадёт на catchall@mymailcow.cf

catchall  3





Официальный сайт Mailcow

Официальная документация Mailcow

Официальный GitHub



Advanced SSL configuration

DNS setup

Client Configuration

Disable IPv6

Reverse Proxy

Rspamd UI

Backup + Restore



Mission Completed!

10 Комментарии

  1. Здравствуйте, столкнулся со следующей проблемой, после выполнения sudo docker-compose up -d
    Bind for 0.0.0.0:443 failed: port is already allocated
    но порт занят самим доекром. как быть?

    ОтветитьУдалить
    Ответы
    1. Остановить контейнер, который занимает 443 порт.
      Сам по себе докер не занимает 443 порт.

      чтобы определить что использует 443 порт попробуйте выполнить
      sudo apt install net-tools
      sudo netstat -ltnp | grep -w ':443'

      Удалить
  2. дело в том, что на нём висит nginx, настроенный по вашей же инструкции)

    ОтветитьУдалить
    Ответы
    1. В начале поста есть параграф про "Особенности почтового сервера". Категорически не рекомендуется совмещать остальные сервисы с почтовым сервером, т.к. для правильной работы SMTP и чтобы был инбокс, необходимо настраивать такие вещи как PTR, DMARC и другие, что незамедлительно приведёт к раскрытию реального ip адреса почтового сервера, т.к. это нужно для коректной работы вышеперечисленных протоколов. Я рекомендую размещать почтовый сервер на отдельном сервере, т.к. он является потенциальной мишенью для злоумышленников.

      Удалить
  3. ну я это делаю в основном для себя, для опыта, на vps крутиться vpn сервер с парой сервисов. И, вот, почту решил попробовать прикрутить, в целом не так страшно для меня раскрыть ip, тем более, что сервер будет использоваться для рассылок сервисных сообщений себе, от своих же сервисов)

    ОтветитьУдалить
    Ответы
    1. Ответы можно поискать тут:
      https://docs.mailcow.email/post_installation/firststeps-rp/

      И всё же я настоятельно не рекомендую так делать!

      Удалить
  4. Привет! никто не подскажет как заставить sogo отправлять письма в фоне? А то секунд по 5 висит это зелёное окошко что отправляется

    ОтветитьУдалить
    Ответы
    1. Я использую Thunderbird вместо sogo, поэтому не подскажу, в настройках этого нигде нет?

      Удалить
  5. Здравствуйте, не понятно, как настроить сертификаты. Переодически на клиентах их нужно подтверждать. Как я понял из документации, они должны как то сами подтягиваться, но почему то не работает.

    ОтветитьУдалить
    Ответы
    1. Приветствую. Ответ на этот вопрос в конце поста в полезных ссылках в ссылке Advanced SSL configuration

      Удалить

Отправить комментарий