Как я поднял свой почтовый сервер и понял, что зря ввязался
Почему я решил сделать свою почту
Я хотел свой почтовый ящик на своём домене. Не через Яндекс.Почту для домена, не через Google Workspace — свой, личный, чтобы письма хранились на моём сервере.
Я думал это будет круто: полный контроль, никакой рекламы, никакого чтения моих писем алгоритмами. Спойлер: я оказался прав, но путь к этому был тернистым.
На самом деле идея зрела давно. Я смотрел на ящик вида admin@mysurik.ru и понимал — это выглядит солидно. Когда отправляешь письмо с Gmail, тебя воспринимают как обычного пользователя. А когда с почты на своём домене — ты уже «владелец инфраструктуры». Мелочь, а приятно.
Установка iRedMail
Решил ставить iRedMail на Ubuntu 24.04. Скачал скрипт, запустил:
bash iRedMail.sh
Скрипт задал всего несколько вопросов: домен, пароль админа, какие компоненты ставить (Postfix, Dovecot, MySQL, Roundcube). Всё остальное сделал сам. Через 10 минут почтовый сервер был готов.
Но это была только вершина айсберга.
iRedMail, кстати, штука удобная. Он сам ставит Postfix для отправки, Dovecot для приёма, MySQL для хранения, Roundcube для веб-интерфейса. И спам-фильтр SpamAssassin докидывает. Всё из коробки. Я только глянул, что порты открылись: 25, 465, 587, 993, 995. Проверил:
ss -tlnp | grep -E ':(25|465|587|993|995)'
Всё висело и слушало. Красота.
Но первая проблема пришла откуда не ждали — iRedMail включает Fail2ban и активно блокирует подборщиков. Я об этом узнал, когда сам не смог зайти в Roundcube. Пришлось добавлять свой IP в whitelist:
echo '[Dovecot]
enabled = true
ignoreip = 192.168.0.xxx' >> /etc/fail2ban/jail.local
И перезапустить Fail2ban. Мелочь, а минус час жизни.
Настройка DNS — ад на неделю
Чтобы почта не уходила в спам, нужно настроить кучу DNS-записей: SPF, DKIM, DMARC, PTR.
SPF — чтобы другие серверы знали, что мой сервер имеет право отправлять почту с моего домена. Прописал TXT запись:
v=spf1 mx ip4:192.168.0.130 ~all
Но я тут же наступил на грабли: сначала написал v=spf mx -all без единицы в версии. И серверы возвращали «PermError». Тупил полчаса, пока не заметил.
DKIM — цифровая подпись писем. iRedMail сгенерировал ключи, я добавил публичный ключ в DNS. Без этого Yahoo и GMail помечали письма как спам.
Ключи лежат в /var/lib/dkim/. iRedMail сам добавил запись в DNS — мне осталось только скопировать TXT-значение в панель управления доменом. Но я умудрился скопировать не весь ключ — он длинный, переносы строк сбивают. Пришлось перепроверять через dig:
dig TXT 2024._domainkey.mysurik.ru +short
Если возвращает пустоту — значит, запись кривая. Я потратил вечер на то, чтобы вбить ключ одной строкой без кавычек внутри.
DMARC — политика, что делать с письмами, которые не прошли SPF/DKIM. Я поставил p=quarantine. Потом почитал логи и понял, что некоторые письма всё равно уходят в спам. Переключил на p=reject — и количество жалоб упало.
PTR — обратная DNS-запись. Это настроил у хостинг-провайдера. Без неё многие почтовые серверы отклоняют письма.
Вот тут самое больное. У моего провайдера настройка PTR была в личном кабинете, но применялась она только через тикет в поддержку. Я написал: «Установите PTR-запись 192.168.0.130 → mail.mysurik.ru». Ответили через сутки: «Готово». Проверил:
dig -x 192.168.0.130 +short
И правда — вернуло mail.mysurik.ru. Ура.
Самое обидное — настройка DNS заняла неделю, потому что изменения распространяются не сразу, и я не мог проверить, правильно ли всё настроил. Сидишь, ждёшь, перепроверяешь через whatsmydns.net, а там то одно, то другое не видно.
Борьба со спамом — рутина, которая бесит
Первые письма с моего сервера улетали в спам даже на GMail. Оказалось, IP моего сервера был в чёрных списках (мой IP из диапазона, который использовался спамерами раньше).
Пришлось писать запросы на удаление из базы Spamhaus, Barracuda, и ещё нескольких. Это заняло дня три.
Spamhaus — самый строгий. Заявку рассматривали дольше всех. Для каждого нужно было доказать, что я не спамер: показать PTR-запись, SPF, DKIM. Я заполнил форму, приложил скриншоты DNS-записей. Через пару дней IP убрали из чёрного списка.
Но я заметил ещё одну вещь: Postfix по умолчанию не проверяет, что письма от легитимных отправителей. Я настрол её через opendkim — проверку подписей входящих писем. Без этого любой мог подделать мой домен и слать письма от моего имени.
Проверить, не подделывают ли мой домен, можно через DMARC-отчёты. Я получаю их раз в день на почту и вижу, кто пытался отправить письмо якобы от меня. Один раз пришёл отчёт из Китая — кто-то пробовал слать спам с моего домена. DMARC отклонил. Я тогда выдохнул.
Ещё я поставил Postscreen — лёгкий спам-фильтр перед Postfix. Он проверяет, кто стучится в 25 порт, по нескольким тестам: делает ли клиент правильное SMTP-рукопожатие, не тупит ли. Настраивается парой строк в main.cf:
postscreen_access_list = permit_mynetworks
postscreen_dnsbl_sites = zen.spamhaus.org, bl.spamcop.net
postscreen_dnsbl_threshold = 2
После включения Postscreen число соединений от спам-ботов упало с нескольких сотен в день до десятка. И нагрузка на сервер снизилась.
Про очереди и битые письма
Была ситуация: письмо ушло, а адресат не получил. Я полез в логи Postfix:
tail -f /var/log/mail.log
Там увидел, что удалённый сервер отвечает: «550 Sender rejected — not yet authenticated». Оказалось, что на моём сервере была включена аутентификация SMTP, а я отправлял письмо через локальный скрипт без логина. Пришлось добавить авторизацию в скрипте.
Или ещё: я отправил письмо с вложением 30 МБ, а GMail отказался его принимать, потому что лимит — 25 МБ. Postfix вернул письмо обратно в очередь и пытался отправить снова каждый час. Чистил очередь:
postqueue -p — смотрим, что зависло
postsuper -d ALL — удаляем всё.
Потом я вписал лимит в main.cf: message_size_limit = 26214400 — и проблема ушла.
Мониторинг и алерты
Я поставил проверку: раз в час скрипт пытается отправить тестовое письмо на Gmail и проверяет, дошло ли. Если нет — шлёт уведомление в Telegram. За месяц было три сбоя: два раза падал Dovecot (кончилась память), один раз Postfix переставал принимать соединения после перезагрузки сервера (забыл включить автозапуск).
Скрипт простой: swaks --to myuser@gmail.com --server localhost — отправляет письмо, а потом через IMAP проверяет его наличие в отправленных. Если не находит — бьёт тревогу. swaks, кстати, крутая штука для тестирования SMTP, советую.
Стоит ли игра свеч
Честно: если вам нужна почта для себя — проще взять Яндекс.Почту для домена (бесплатно) или Google Workspace (дёшево). Свой сервер — это геморрой.
Но если вам нужен контроль над данными, и вы готовы возиться — iRedMail лучший выбор. Он собирает Postfix + Dovecot + Roundcube + спам-фильтр в одну работающую систему. Главное — терпение с DNS и репутацией IP.
Сейчас моя почта работает стабильно уже три месяца. Письма доходят, спам-фильтр работает, DMARC-отчёты приходят. Я могу зайти в Roundcube с телефона, могу настроить любой почтовый клиент. Но если честно — я бы не стал проходить этот путь снова.
Раз в месяц я вспоминаю эту эпопею, захожу на сайт Яндекса, вижу бесплатную почту для домена с их фильтрами, и думаю: «Может, ну его?» Но потом опять лезу в логи, смотрю, как всё работает, и остаюсь. Потому что это моё. И я знаю, что письма не читает никто, кроме меня. И блэклисты я чищу сам. И если что-то сломается — я знаю, где чинить. Это даёт странное чувство уверенности, даже если оно иррационально.