Эта статья о том, как развернуть свой почтовый сервер, обслуживающий собственный домен.
Это, разумеется, не первая публикация на Хабре на эту тему. Тем не менее, я хочу поднять ее снова и поделиться личным опытом: рассказать, как я настраивала собственную почту, показать этот процесс от начала и до конца. Одна из моих целей — максимальная прозрачность, чтобы любой человек, следуя шаг за шагом, смог повторить всё описанное здесь и получить рабочий результат.
Перед тем как мы начнём, стоит ответить на вопрос: «А зачем вообще нужна своя почта?» Ведь у нас уже есть крупные почтовые сервисы вроде Gmail, Yandex, Mail.ru — они бесплатные, привычные, надёжные. Более того, в 2025 году почта многим вообще кажется анахронизмом. Кто ей пользуется? Кто читает письма?
И вот тут становится интересно. Если честно, у меня не так уж много аргументов, чтобы вас убедить. Когда‑то e‑mail был основным каналом связи, и люди ждали прихода нового письма. Сегодня же почти всё общение переместилось в мессенджеры — Telegram, WhatsApp, соцсети. Электронную почту массово захлестнул спам и маркетинговые рассылки. Казалось бы — всё, пора прощаться. Но... нет.
Электронная почта всё ещё остаётся базовым, универсальным и технически зрелым способом связи. Она понятна, совместима с чем угодно, и работает даже там, где ничего больше не работает. А главное — она не зависит от одного сервиса, компании или приложения.
Есть ещё более глубокий мотив — желание контролировать своё цифровое пространство. С развитием технологий каждый из нас в сети становится «не просто юзером», а цифровым профилем конкретного человека. И возникает естественное стремление иметь что‑то своё. Например, вместо того чтобы использовать Gmail, вы можете настроить свою собственную почту — и тогда никто не будет читать ваши письма, кроме вас. Никто не решит за вас, какие письма доставлять, а какие — фильтровать. Да, есть провайдер, есть маршруты, но вы становитесь самостоятельным участником цифрового мира.
Третья причина — самопрезентация. В адресе vasya@pupkin.space уже звучит индивидуальность. Это не просто красивая обёртка, а сигнал: «Я знаю, как всё это устроено». Отличный способ выделиться, особенно если вы специалист в сфере IT.
И наконец — любопытство. Мне лично было чертовски интересно. Разобраться, настроить, увидеть, как летит первое письмо — от меня самой, на мой домен. Это настоящее инженерное удовольствие.
Если вы дочитали до этого места — возможно, вас уже немного зацепило. Значит, самое время начать. Статья написана в формате пошаговой инструкции, но по ходу я буду вставлять теоретические замечания и пояснения — чтобы вы не просто повторяли команды, а понимали, что делаете.
Приступим!
Подготовка
Что нужно, чтобы сделать свою электронную почту?
Для начала посмотрим, как вообще устроена обычная электронная почта.
Вот, например, адрес: vasya_pupkin@mail.ru. Вначале идёт никнейм (выбранное имя), затем символ @, а после — домен mail.ru.
mail.ru — это домен, за которым стоит чужой почтовый сервер. Нам же хочется уйти от зависимости от чужих сервисов (Mail.ru, Gmail, Yandex и др.) и настроить всё под себя. Для этого нужно зарегистрировать собственный домен в глобальной системе доменных имён.
В интернете есть множество сервисов, где можно арендовать домен и закрепить его за собой. Я не буду рекомендовать конкретную платформу — это была бы реклама. Выбор остаётся за вами. Аренда домена платная, но совсем недорогая. Цена чашки кофе за год обслуживания — это небольшая плата за вашу цифровую свободу.
Допустим, вы зарегистрировали домен. Теперь у вас есть, скажем, pupkin.space, и в перспективе ваша электронная почта будет выглядеть, например, так: vasya@pupkin.space.
Второе, что необходимо — арендовать VPS с белым (публичным) статическим IP-адресом. Теоретически, почтовый сервер можно было бы развернуть и на домашнем компьютере, но в большинстве случаев у пользователей провайдеры используют NAT. Это значит, что ваша машина не имеет постоянного внешнего IP-адреса — он может меняться, или быть вовсе недоступен извне. А для работы почтового сервера критически важно, чтобы его IP-адрес оставался стабильным и был доступен из интернета. Существуют способы обойти эти ограничения (например, с помощью туннелей или специальных прокси-сервисов), но в рамках этой статьи мы рассматриваем конфигурацию именно для полноценного статического IP-адреса. Возможно, в будущем я доработаю статью для домашнего сервера, но конкретно сейчас нам нужен VPS с белым статическим IP!
Кому-то такая необходимость может показаться неудобной, но на самом деле VPS — это довольно практичное решение. Это удалённый сервер, который работает круглосуточно, не тратит ваше электричество и освобождает вас от забот о стабильности соединения. И, что особенно приятно — на нём можно запускать не только почтовый сервер. Например, я со временем разместила там свой сайт-визитку — и до сих пор получаю удовольствие от того, что у меня все под контролем :-)
VPS тоже арендуется у провайдеров, предоставляющих такие услуги. Конкретные названия я не привожу, чтобы не превращать текст в рекламу — подходящий вариант вы без труда найдёте под свой бюджет и задачи. Вместе с тем, я призываю подойти к выбору провайдера с особым вниманием.
Дело в том, что для почтового SMTP-сервера критически важен открытый 25-й порт. Многие бюджетные хостеры по умолчанию его блокируют — и, что хуже, могут не разблокировать даже по заявке. Поэтому обязательно заранее проверьте, предоставляет ли выбранный вами провайдер возможность работы с портом 25. Без него почта с вашего сервера просто не сможет быть отправлена.
После того как вы арендовали домен и VPS, у вас на руках должно быть две основные вещи:
Доменное имя — например,
pupkin.space, только ваше и в той зоне, которую вы выбрали (.com,.org,.ruи т.д.).Виртуальный сервер — машина с установленной Linux-системой (например, Ubuntu 20.04) и статическим белым IP-адресом. В этой статье мы будем использовать для примера IP
123.123.123.123.
Далее следует полная инструкция с пояснениями по настройке DNS и SMTP серверов. В ней pupkin.space нужно заменить на ваш домен, а IP-адрес 123.123.123.123 — на ваш белый IP от хостера.
Bind9 (DNS-сервер)
Перед тем как приступить к настройке, разберёмся, зачем вообще нужен DNS‑сервер и как он связан с доменом.
В интернете существует иерархия доменных имён. На самом верху — корневой домен (обозначается как .), от него идут домены верхнего уровня (TLD): .com, .net, .ru и т. д. Ниже располагаются домены второго уровня, например google.com. или mail.ru., затем — третьего уровня и так далее.
Каждый уровень иерархии обслуживается DNS‑серверами — это распределённая система, в которую входят:
авторитетные (primary/secondary) DNS‑серверы, которые хранят полную информацию о конкретной зоне
кэширующие (резолверы) — они запоминают ответы, чтобы ускорить последующие запросы
Когда, например, вы отправляете письмо на адрес в чужом домене, например, с mail.ru на gmail.com, ваша система должна определить IP‑адрес почтового сервера получателя. Для этого она формирует DNS‑запрос, который проходит через всю цепочку DNS‑серверов — от локального резолвера и выше по иерархии, пока не найдёт нужную зону, где указано, какой сервер отвечает за приём почты для этого домена.
Именно благодаря DNS становится возможным связать доменное имя с конкретным хостом, на котором запущен почтовый сервер.
Наша задача — встроиться в эту систему. Мы уже арендовали домен, теперь хотим, чтобы его обслуживал наш собственный DNS‑сервер, а не DNS‑сервер регистратора.
Для этого мы:
Настроим DNS-сервер (Bind9)
Опишем DNS-зону для нашего домена
Пропишем в ней, где находится наш почтовый сервер и какой у него IP-адрес
Передадим DNS-серверу управление нашим доменом
Приступим!
1. Установка DNS-сервера
Устанавливаем Bind9 на VPS:
sudo apt update
sudo apt install bind9 bind9utils bind9-doc2. Конфигурация сервера
Редактируем основной конфигурационный файл:
sudo nano /etc/bind/named.conf.localДобавляем:
zone "pupkin.space" {
type master;
file "/etc/bind/zones/db.pupkin.space";
};Помимо основного, стоит добавить несколько записей в файл опций:
sudo nano /etc/bind/named.conf.optionsПример содержимого:
options {
directory "/var/cache/bind";
dnssec-validation auto;
allow-query { any; };
listen-on port 53 { any; };
listen-on-v6 { any; };
allow-recursion { none;};
recursion no;
};Это хорошие минимальные и безопасные настройки.
3. Файл зоны
Следующим шагом идет создание DNS-зоны.
DNS-зона — это часть пространства доменных имён, за которую отвечает конкретный DNS-сервер. В ней хранятся все записи, связанные с этим доменом и его поддоменами. Для нашего почтового сервера выберем поддомен
dev.
Создаём директорию зон, если её нет:
sudo mkdir /etc/bind/zonesСоздаём файл зоны:
sudo nano /etc/bind/zones/db.pupkin.spaceПример содержимого:
$TTL 604800 ;
@ IN SOA dev.pupkin.space. admin.pupkin.space. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800) ; Negative Cache TTL
;
IN NS dev
IN NS ns2
IN TXT "v=spf1 ip4:123.123.123.123 -all"
IN MX 5 dev
dev IN A 123.123.123.123
ns2 IN A 123.123.123.123
www IN CNAME devПояснение к записям:
$TTL (Time to Live) — время жизни записей в кэше других DNS-серверов. Показывает, как долго кэширующие серверы могут хранить данные зоны без повторного запроса. Значение применяется ко всем записям в файле. В данном случае записи будут храниться 7 дней (604800 секунд).
SOA (Start of Authority) — обязательная и единственная запись, с которой начинается каждая зона. Указывает:
основной DNS-сервер зоны —
dev.pupkin.space.email администратора зоны —
admin.pupkin.space.(точка вместо@)а также включает следующие параметры:
Serial — номер версии зоны. Его обязательно нужно увеличивать при каждом изменении зоны, иначе другие серверы не узнают, что произошли обновления.
Refresh, Retry, Expire, Negative Cache TTL — интервалы, которые определяют поведение secondary-серверов и кэширование ошибок.
NS (Name Server) — указывает, какие DNS-серверы обслуживают зону:
dev— наш основной (primary) серверns2— резервный (secondary) сервер (если нет альтернатив, то это тоже наш сервер)
TXT — универсальный тип записи. Здесь мы используем его для SPF (Sender Policy Framework) — механизма защиты от подделки отправителя. В записи
"v=spf1 ip4:123.123.123.123 -all"говорится: письма от имени доменаpupkin.spaceмогут отправляться только с IP-адреса123.123.123.123. Всё остальное — спам.MX (Mail Exchanger) — указывает, какой хост обрабатывает почту для домена. Мы пишем
dev, что значит: именно этот сервер будет принимать входящую почту.A (Address) — связывает доменное имя с IP-адресом. Например,
dev.pupkin.space.указывает на123.123.123.123.CNAME (Canonical Name) — задаёт псевдоним:
www.pupkin.space.будет перенаправлен наdev.pupkin.space.. Это удобно, чтобы не дублировать A-записи.
Примечание: в файле зоны имя dev мы можем указывать без полного доменного имени (dev.pupkin.space.), потому что внутри файла зоны все неполные имена интерпретируются относительно текущей зоны (pupkin.space.). То есть запись MX 5 dev автоматически понимается как MX 5 dev.pupkin.space. и тд.
DNS-зону, как правило, обслуживают два сервера: основной (primary) и резервный (secondary). Primary-сервер отвечает за зону и содержит основной файл зоны, а secondary-сервер поддерживает его копию и обрабатывает запросы, если основной недоступен.
Идеально иметь два отдельных сервера, но у нас только один. Есть несколько вариантов, как выйти из этой ситуации:
Попросить знакомого предоставить свой DNS-сервер в качестве secondary.
Указать оба — и primary, и secondary — на один и тот же сервер. Это не лучший вариант с точки зрения отказоустойчивости, но он работает и не требует второго сервера.
Использовать один сервер свой, а в качестве второго — сервер регистратора. Этот вариант я не рекомендую: регистраторы неохотно работают с внешними серверами, что может привести к дополнительным трудностям.
В нашем случае мы используем второй вариант, когда и primary, и secondary находятся на одной машине.
4. Проверка зоны и применение конфигурации:
После редактирования нужно убедиться, что файл зоны написан корректно:
sudo named-checkzone pupkin.space /etc/bind/zones/db.pupkin.space
sudo named-checkconfЕсли всё в порядке — перезапускаем сервер:
sudo systemctl restart bind9Проверка статуса:
sudo systemctl status bind9(выйти из просмотра - :q)
Если все хорошо, Bind9 покажет статус Active: active (running), если же сервер упадет, то надо еще раз проверить, нет ли ошибок конфигурации, после чего идти в логи:
sudo journalctl -u named.service -n 50или
sudo journalctl -u named.service -f(выйти из просмотра - Ctrl+C)
В качестве последнего штриха убедимся, что Bind9 слушает 53 порт и доступен извне.
sudo ss -lnptu | grep :53Вывод должен быть примерно следующим (только больше):
udp UNCONN 0 0 0.0.0.0:53 0.0.0.0:* users:(("named",pid,fd))
tcp LISTEN 0 10 0.0.0.0:53 0.0.0.0:* users:(("named",pid,fd))Проверим также настройки UFW (фаервол):
sudo ufw status verboseЕсли вы не видите среди них разрешения на 53 порт, то его нужно добавить:
sudo ufw allow 53/udp
sudo ufw reloadУ вас может быть другой фаервол, если это так, подбирайте настройки соответственно.
5. Делегирование зоны у регистратора
Сейчас наш домен обслуживается DNS‑серверами регистратора. После того как мы настроили свой DNS‑сервер, мы должны делегировать зону ему. Для этого мы идем туда, где регистрировали домен, находим в личном кабинете меню с управлением DNS‑серверами и прописываем вместо первого из них наш свеженастроенный dev.pupkin.space, а вместо второго ns2.pupkin.space. Для первого и второго также прописываем IP 123.123.123.123 — такая опция должна быть в интерфейсе. Если ее нет, то обратитесь в поддержку и попросите прописать glue‑record. Это специальная запись, которая нужна, потому что dev.pupkin.space — это поддомен в той же зоне pupkin.space, которую он должен обслуживать, и без явного указания IP его невозможно разрешить (возникает замкнутый круг). С ns2 ситуация аналогична.
6. Проверка делегирования и работы DNS-сервера
Теперь нужно убедиться, что делегирование прошло успешно и наш DNS-сервер обслуживает домен. Для этого можно воспользоваться онлайн-сервисами:
Второй вариант - использовать локальную утилиту dig.
Ее можно установить следующим образом:
sudo apt install dnsutilsПри помощи нее осуществляем проверки:
Проверка NS-записей:
dig pupkin.space NS +shortОжидаемый результат:
dev.pupkin.space.
ns2.pupkin.space.Здесь мы видим оба наших DNS-сервера.
Проверка MX-записей
dig pupkin.space MX +noall +answerОжидаемый результат:
pupkin.space. IN MX 5 dev.pupkin.space.Это означает, что почта для домена будет приходить на dev.pupkin.space..
Проверка SPF-записи
dig pupkin.space TXT +shortОжидаемый результат:
"v=spf1 ip4:123.123.123.123 -all"Если вы добавляли SPF-запись — она должна отобразиться здесь.
Проверка полной трассировки DNS-запроса
dig pupkin.space any +traceПоказывает полную цепочку разрешения — от корневых серверов до нашего DNS-сервера. Если трассировка не срабатывает локально, попробуйте сделать трассировку запроса через онлайн-сервисы.
Если вы по dig-командам или онлайн-сервисам получили соответствующие записи - это хорошо, значит зона отдалась :-)
7. PTR-запись
В завершение стоит настроить PTR‑запись, также называемую reverse DNS (rDNS). Эта запись не обязательна для работы DNS‑сервера, но критически важна для почтового сервера — без неё почта с вашего IP‑адреса может массово блокироваться другими серверами.
Если A‑запись сопоставляет доменное имя с IP‑адресом, то PTR‑запись наоборот сопоставляет IP‑адрес с доменом. Благодаря этому получатель письма может проверить, что IP‑адрес, с которого пришло письмо, действительно соответствует доменному имени отправителя. Если такая проверка не проходит на стороне получателя, то ваше письмо может быть помечено как спам или отклонено.
PTR‑запись нельзя создать самостоятельно — её можно добавить только через провайдера VPS. Обычно это делается через поддержку: вы пишете письмо, указываете ваш IP‑адрес и доменное имя, которое хотите назначить, и просите настроить PTR‑запись. У разных хостеров процедура может отличаться, но обычно это делается в течение нескольких дней.
Примечание: в некоторых случаях все же создание PTR‑записи есть в UI у хостера, попробуйте поискать.
После того как провайдер подтвердил добавление, можно проверить запись двумя способами:
Способ 1: с помощью команды dig
dig -x 123.123.123.123 +shortОжидаемый результат:
dev.pupkin.space.Способ 2: с помощью команды host
host 123.123.123.123Ожидаемый результат:
123.123.123.123.in-addr.arpa domain name pointer dev.pupkin.space.Если вывод показывает нужный домен — всё работает. Если ничего не возвращается или указан домен провайдера — значит PTR-запись ещё не прописана.
На этом настройка DNS-сервера завершена. Теперь наш собственный DNS-сервер отвечает за домен и указывает, где находится почтовый сервер для приёма и отправки писем. Следующим шагом мы развернём уже непосредственно сам почтовый SMTP-сервер с помощью Postfix.
Postfix (SMTP-сервер)
SMTP‑сервер — это почтовый сервер, который использует протокол SMTP (Simple Mail Transfer Protocol) для отправки и получения электронной почты между почтовыми клиентами и другими серверами. Он отвечает за корректную доставку сообщений, маршрутизацию почты и взаимодействие с другими почтовыми системами в интернете.
В нашей почтовой архитектуре SMTP‑сервер будет обслуживать только локальных пользователей операционной системы Linux, то есть принимает почту исключительно для учётных записей, созданных непосредственно на сервере. У каждого такого пользователя есть собственный почтовый ящик — это либо файл /var/mail/vasya, либо, как в нашем случае, директория ~/Maildir/, если используется формат Maildir. Мы будем использовать именно его: каждое входящее письмо будет храниться в отдельном файле, что удобнее для чтения, фильтрации и резервного копирования.
Когда SMTP‑сервер принимает почту для конкретного пользователя, он помещает сообщение во внутреннюю очередь, выполняет базовую фильтрацию и доставляет его в соответствующий почтовый ящик. Адрес пользователя строится по схеме vasya@pupkin.space, где vasya — имя локальной учётной записи, а pupkin.space — домен, которым управляет наш сервер. Таким образом, почта обслуживается только для своих локальных пользователей внутри заданного домена.
О "своих" и "чужих"
Для нашего SMTP-сервера:
"Своими" считаются локальные пользователи системы
"Чужими" — все внешние адресаты и отправители из других доменов
SMTP-сервер может доставлять письма по принципу:
"свои" → "свои"
"чужие" → "свои"
"свои" → "чужие"
но никогда!!! "чужие" → "чужие".
Разрешение пересылки "чужим от чужих" превращает сервер в открытый релей (open relay), за что он моментально попадает в черные списки, и восстановить его репутацию будет уже невозможно. Настройки, которые мы разберём ниже, надёжно защищают от этого, но настраивать Postfix следует очень внимательно.
1. Установка Postfix
Устанавливаем Postfix на VPS:
sudo apt update
sudo apt install postfixВо время установки система задаст несколько вопросов. Выберите тип конфигурации "Internet Site", а в качестве системного почтового домена укажите ваш домен pupkin.space.. Если в меню у вас не будет получаться выбрать Ok, попробуйте стрелочки влево-вправо.
2. Конфигурация Postfix
Редактируем основной конфигурационный файл:
sudo nano /etc/postfix/main.cfПример содержимого:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
выйти из просмотра
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=none
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=none
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_generic_maps = hash:/etc/postfix/generic
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
myhostname = dev.pupkin.space
mydomain = pupkin.space
myorigin = $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, $mydomain, localhost
relayhost =
relay_domains =
mynetworks = host
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = allКомментарии к важным настройкам
myhostname,mydomain,myorigin— задают имя хоста и домен, с которыми будет работать сервер.mydestination— список доменов, для которых этот сервер принимает входящую почту. Например, для пользователяvasyaбудут приниматься письма, отправленные на:vasya@pupkin.spacevasya@dev.pupkin.spacevasya@localhost
mynetworks = host— важнейшая настройка, определяющая, откуда можно отправлять письма. В данном случае разрешена отправка только с самого сервера. Это безопасно на первом этапе, когда мы будем использовать локальные утилиты вродеmuttдля отправки.smtpd_relay_restrictions— строго определяет, кто имеет право на пересылку.permit_mynetworks— разрешает отправку с локальной машиныpermit_sasl_authenticated— авторизованные пользователи (например, при работе с IMAP/SMTP-клиентами в будущем)reject_unauth_destination— всё остальное запрещается. Это основной щит от превращения сервера в open relay
Прежде чем отправлять письма, нужно также проверить работоспособность 25-го порта - это основной порт, по которому проходят SMTP-соединения.
Сначала проверим, слушает ли Postfix нужный порт:
sudo ss -tnlp | grep :25Ожидаемый вывод — строка, где видно, что процесс master (Postfix) слушает порт 0.0.0.0:25 или [::]:25. Это означает, что сервер готов принимать подключения на всех сетевых интерфейсах.
Теперь проверим доступ к порту извне (с вашей локальной машины вне VPS):
telnet dev.pupkin.space 25(из telnet выход QUIT)
или
nc -vz dev.pupkin.space 25Если соединение устанавливается — отлично, порт открыт, всё работает.
Если же команда «висит» или завершается ошибкой вроде Connection timed out или Connection refused, есть два варианта: либо мешает фаервол, либо ваш хостинг-провайдер блокирует порт.
В первом случае можно попробовать временно отключить или перенастроить UFW (или другой фаервол).
Во втором случае — придётся писать в поддержку и подавать заявку на разблокировку 25 порта.
Некоторые провайдеры не разблокируют его вовсе — поэтому при выборе VPS об этом лучше уточнять заранее (!). К счастью, большинство адекватных хостеров этот порт открывают без проблем, особенно по запросу.
Далее проверим настройки UFW (если он используется):
sudo ufw status verboseЕсли Status: active, и вы не видите разрешения на порт 25, надо добавить:
sudo ufw allow 25/tcp
sudo ufw reloadПоделюсь опытом, у меня после настройки SMTP-сервера почта не ходила именно из-за UFW. Только после добавления правилаsudo ufw allow 25/tcp я смогла отправлять и принимать почту.
3. Применение конфигурации
После внесения изменений:
sudo postfix check
sudo systemctl restart postfixПроверка статуса:
sudo systemctl status postfix(выйти из просмотра - :q)
Если все хорошо, Postfix покажет статус Active: active, иначе идем в логи:
sudo tail -n 50 /var/log/mail.logили
sudo tail -f /var/log/mail.log(выйти из просмотра - Ctrl+C)
4. Создание пользователя
Наша работа по конфигурации почтового сервера подошла к следующему этапу — созданию пользователя. Если до этого момента мы настраивали только системные конфиги от имени root (как и положено в цивилизованном мире), то теперь пора перейти к реальному взаимодействию с почтовой системой, а для этого нам нужен пользователь, например, vasya.
Создаём пользователя в Linux:
sudo adduser vasyaОсобое внимание стоит уделить паролю. Очень часто пользователи ставят что‑то вроде Vpupkin87, и кажется, что всё в порядке. Но если вы сидите на VPS с публичным статическим IP, такой пароль могут подобрать за несколько часов. Я, например, по наивности сделала слабый пароль и уже на второй день получила троян‑майнер, а вместе с ним — гневное письмо от хостера с требованием немедленно прекратить слать миллионы запросов, иначе мой сервер будет уничтожен.
Вывод: придумывайте пароль не короче 12–15 символов, состоящий из строчных и заглавных латинских букв, цифр и спецсимволов — и обязательно вперемешку!
Пример: UwFP7=5iC5TA.
Это не паранойя — это здравый смысл!
Примечание: на этом этапе вход по паролю можно пока оставить включённым. Но после того, как вы всё настроите и проверите, стоит настроить вход по SSH‑ключу — это безопаснее и удобнее. Здесь я не буду описывать эту настройку подробно, вы легко найдёте инструкцию сами. Просто помните: если отключить вход по паролю слишком рано, то некоторые утилиты, требующие ручного ввода пароля, станут недоступны.
5. Маппинг email-адресов
Если вы хотите, чтобы письма от root или vasya@localhost выглядели как vasya@pupkin.space, создайте файл /etc/postfix/generic:
root@pupkin.space vasya@pupkin.space
vasya@localhost vasya@pupkin.spaceЗатем:
sudo postmap /etc/postfix/generic
sudo postfix check
sudo systemctl restart postfix
sudo systemctl status postfix6. Переход на Maildir
По умолчанию Postfix использует формат mbox, при котором все письма одного пользователя хранятся в одном большом файле /var/mail/vasya. Это неудобно. Лучше использовать формат Maildir, где каждое письмо — отдельный файл в директории ~/Maildir.
Чтобы переключиться:
В /etc/postfix/main.cf в любое место необходимо добавить строку:
home_mailbox = Maildir/После этого перезапустите Postfix:
sudo postfix check
sudo systemctl restart postfix
sudo systemctl status postfixУстановите maildrop, чтобы создать директорию Maildir:
sudo apt install maildropСоздайте структуру Maildir для нужного пользователя (например, vasya):
sudo -u vasya bash
maildirmake ~/Maildir
maildirmake ~/Maildir/.Sent
maildirmake ~/Maildir/.Drafts
chmod -R 700 ~/Maildir
exitТеперь, когда вы отправите себе письмо, оно появится в ~/Maildir/new/.
На этом этапе базовая настройка SMTP‑сервера завершена. Остался последний штрих — подключение локального почтового клиента (mutt), чтобы можно было отправлять и читать письма прямо на сервере.
Mutt E-mail Client
Mutt — это лёгкий консольный почтовый клиент, идеально подходящий для серверов без графического интерфейса. Он не требует много ресурсов, работает в терминале и прекрасно справляется с базовыми задачами: чтение, отправка и организация почты.
Почему именно Mutt:
Подходит для системной почты и повседневной работы на сервере
Прост в установке и конфигурации
Позволяет лучше понять внутреннюю механику email
Поддерживает работу с
Maildirиmbox, внешними MTA (Postfix, Sendmail и др.)Гибко настраивается через
.muttrc
1. Установка mutt
Устанавливаем mutt под рутом:
sudo apt install mutt2. Конфигурация mutt
Создаем файл конфигурации .muttrc для пользователя vasya:
sudo nano /home/vasya/.muttrcВ файл прописываем следующие настройки:
# Disable sorting
set sort=mailbox-order
# Set the desired default "from" address for both header From and envelope-from
set from="vasya@pupkin.space"
set envelope_from=yes
set use_domain=no
# Maildir
set mbox_type=Maildir
set folder="/home/vasya/Maildir"
set spoolfile="/home/vasya/Maildir"
set record="+.Sent"
set postponed="+.Drafts"
# Recognize these as own addresses for displaying +/T/C marks on messages, as
# well as for the reverse_name setting
alternates "vasya@pupkin.space"
# When replying to or forwarding a message sent to a recognized own address
# (see above), reuse the same full name and address that the message was
# addressed to as the new "from" address
set reverse_name=yes
# Maybe use ~/tmp instead of /tmp - useful when /tmp is on tmpfs, to not lose
# edits on power failure
set tmpdir="/home/vasya/tmp"
# Decode and/or decrypt messages when searching (much slower and prompts for
# passphrase on first encrypted message encountered)
set thorough_search="yes"
# Use this when "ispell" is actually the "aspell" wrapper (press "i" to invoke)
set ispell="ispell --mode=email"
# By default, Mutt adds the original sender's address to Subject on forwards,
# which we usually don't want
set forward_format="Fwd: %s"
# Don't display these headers by default (press "h" to display full headers)
ignore Delivered-To X-Delivery-ID X-Priority X-MSMail-Priority X-MimeOLE X-Spam-Checker-Version X-Spam-Level X-Spam-Status Precedence X-No-Archive List- DomainKey-Signature In-Reply-To User-Agent DKIM-Signature X-Google-Sender-Auth
# Highlight the obfuscated e-mail addresses in our RPM %changelogs, etc.
color body brightcyan default "<[-a-z_0-9.+]+[- ]at[- ][-a-z_0-9.]+>"
# If you're using a local SpamAssassin bayes database, you might want to bind a
# key, such as Shift-S on the index, to invoke sa-learn and mark messages as
# deleted.
#macro index S "| sa-learn --spam --no-sync --single\n<delete-message>" "spam learn"
# ...append /usr/share/doc/mutt-1.4*/gpg.rc to here
#source ~/.mutt/gpg
bind pager <up> previous-line
bind pager <down> next-line
bind index F flag-message
bind pager F flag-message
bind index x sync-mailbox
После редактирования достаточно сохранить и выйти.
Не забудьте под vasya создать директорию /tmp, иначе вы не сможете в mutt открывать письма.
sudo mkdir /home/vasya/tmp
sudo chown vasya:vasya /home/vasya/tmp
sudo chmod 700 /home/vasya/tmp3. Использование mutt
После всего этого можно спокойно использовать mutt для просмотра и отправки писем. Чтобы в него войти, используйте команду:
muttНавигация и действия отображаются в верхнем меню. Почта будет храниться в ~/Maildir, а отправленные — в ~/Maildir/.Sent.
4. Тестирование
Финальным шагом будет полноценное тестирование работы вашей почты — как входящей, так и исходящей. Если у вас есть друг, готовый помочь — отлично. Если нет, используйте личные почтовые ящики, например, Gmail, Mail.ru или Yandex. Чем больше комбинаций вы проверите, тем выше вероятность, что конфигурация действительно работает корректно.
От vasya:
Заходим в
mutt.Нажимаем m (новое письмо), указываем получателя и тему.
Печатаем текст, затем
^X(если используете nano) иy, видимMail Sent.Идем в директорию
~/Maildir/.Sent/curи убеждаемся, что там появилось наше письмо.Убеждаемся, что письмо появилось у получателя на внешней почте.
Если что-то не сработало, идем в логи и ищем, по какой причине письмо не удалось доставить.
sudo tail -n 100 /var/log/mail.logДля vasya:
Заходим на какую-нибудь имеющуюся почту на
Mail.ru,GmailилиYandex.Отправляем письмо на
vasya@pupkin.space.Заходим в
muttи видим письмо, можем его прочитать.Проверяем, что это письмо появилось в
~/Maildir/new.
Если письмо не пришло -> идем в логи.
Если оба направления работают — поздравляю, у вас функционирующий SMTP‑сервер, который способен как принимать, так и отправлять почту!!! Ура‑ура!!!
Заключение
В ходе этой инструкции мы развернули DNS‑сервер, полноценный SMTP‑сервер на собственном домене, создали локального пользователя, подключили почтовый клиент и протестировали приём и отправку писем. По сути, мы получили простую, но полностью рабочую альтернативу почтовым сервисам вроде Gmail, Yandex или Mail.ru — только теперь вся система под нашим полным контролем.
Этот результат — уже само по себе достижение. Даже в минимальной конфигурации почтовый сервер:
функционирует в реальном домене
обрабатывает письма локальных пользователей
удовлетворяет базовым требованиям безопасности (в частности, не является open relay)
прост в эксплуатации и открыт к дальнейшему развитию
И самое важное — теперь у вас есть собственный почтовый сервер. Вы не ��росто скопировали мои настройки, вы поняли, как всё устроено — от маршрутизации до хранения писем в формате Maildir.
Выбранная почтовая архитектура очень хорошо подходит для личного пользования, но она отнюдь неидеальна.
Что в перспективе можно улучшить:
DKIM/DMARC. Для повышения доверия к вашей почте и защиты от подделки отправителей стоит настроить цифровую подписьDKIMи политикуDMARCчерез конфигурацию DNS‑записей.TLS. SMTP‑сервер на данном этапе не использует шифрование при передаче писем. Рекомендуется подключить поддержкуTLSчерезLet's Encryptиcertbot, чтобы обеспечить безопасность вашей почтовой переписки.IMAP-сервер. Сейчас вы читаете почту через
muttпрямо на сервере. Чтобы подключать внешние почтовые клиенты и приложения, потребуется IMAP‑сервер (например,Dovecot), обеспечивающий синхронизацию писем.Спам-фильтры. Можно настроить спам‑фильтры, которые блокируют входящий трафик, исходя из ваших предпочтений.
Можно было бы также поговорить о переносе сервера с VPS на домашнюю машину, организации резервного питания, создании зеркала конфигурации и прочих мерах устойчивости — но это уже следующий уровень. А пока — ваш собственный почтовый сервер готов!!!
Надеюсь, статья была вам полезна. Спасибо, что дочитали до конца!
Удачи вам в самостоятельной работе с почтовой инфраструктурой и дальнейшем изучении сетевых технологий!
До новых встреч!
Подготовлено в соавторстве с ByteRider
