Свой почтовый сервер нужен для собственного адреса на домене и контроля над ящиками. Postfix отвечает за приём и отправку, Dovecot — за IMAP и аутентификацию. Настроим базовую схему для одного домена: локальные пользователи, Maildir, TLS, submission с паролем и подпись DKIM. Рассылки и массовую отправку не рассматриваем — это другая задача с отдельными требованиями.
Что нужно до установки
- VPS или сервер с постоянным IP и открытым портом 25. У домашних провайдеров исходящий 25 часто заблокирован, и почта просто не уйдёт.
- Домен, например example.com, и возможность менять DNS-записи.
- PTR-запись для IP, указывающая на mail.example.com. Без неё крупные почтовые системы будут относиться к письмам настороженно.
- Доступ sudo и настроенный файрвол.
Сразу проверьте, что имя сервера совпадает с прямым и обратным DNS. Если провайдер не даёт изменить PTR, лучше выбрать другого хостера: технически почта может ходить, но доставляемость будет нестабильной.
hostname -f
dig +short A mail.example.com
dig +short -x 203.0.113.10
dig +short MX example.com
Установка компонентов
В Debian и Ubuntu при установке postfix появится вопрос о конфигурации. Выберите «Internet Site» и укажите системное почтовое имя example.com.
sudo apt update
sudo apt install postfix mailutils dovecot-imapd opendkim opendkim-tools
sudo systemctl enable --now postfix dovecot
postconf -n
Postfix хранит настройки в /etc/postfix/main.cf, Dovecot — в /etc/dovecot/conf.d. Меняйте только понятные параметры и после каждого шага проверяйте синтаксис.
Базовая конфигурация Postfix
Минимальный набор параметров задаёт имя сервера, домен, интерфейсы и способ доставки в Maildir. Ограничения relay не дают использовать сервер как открытый релей.
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost
home_mailbox = Maildir/
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
Параметр mynetworks должен содержать только доверенные сети, а не широкие диапазоны. Если сервер стоит в облаке, не добавляйте туда подсеть провайдера: это превращает машину в релей.
sudo postconf -e 'home_mailbox = Maildir/'
sudo postfix check
sudo systemctl reload postfix
sudo journalctl -u postfix -n 30 --no-pager
TLS и submission
Для шифрования получите сертификат Let’s Encrypt на mail.example.com. Postfix должен принимать почту на 25 порту и разрешать отправку только после аутентификации на 587 порту. В master.cf включите сервис submission.
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
В main.cf добавьте пути к сертификату и параметры SASL. Аутентификацию будет проверять Dovecot через Unix-сокет, поэтому пароли не хранятся в конфигурации Postfix.
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
Сам параметр smtpd_sasl_auth_enable включайте только в блоке submission, как показано выше: порт 25 не должен предлагать аутентификацию без шифрования. В Dovecot включите Maildir, SSL и сокет аутентификации для Postfix. В 10-ssl.conf задайте ssl = yes и пути к сертификату; в Dovecot 2.4 директивы называются ssl_server_cert_file и ssl_server_key_file, в 2.3 — ssl_cert и ssl_key. Файл 10-mail.conf задаёт mail_location = maildir:~/Maildir, а в 10-master.conf добавляется сокет с владельцем postfix.
mail_location = maildir:~/Maildir
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
sudo doveconf -n
sudo systemctl restart dovecot
sudo ss -ltnp | grep -E ':(25|587|993)'
openssl s_client -connect mail.example.com:587 -starttls smtp -brief
Откройте в файрволе только нужные порты: 25 для приёма, 587 для отправки, 993 для IMAPS. Порт 143 без шифрования лучше не публиковать.
SPF, DKIM и DMARC
SPF перечисляет серверы, которым разрешено отправлять почту от вашего домена. DKIM подписывает письма криптографическим ключом, а DMARC сообщает получателю, что делать при несовпадении.
example.com. TXT "v=spf1 mx -all"
mail._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=..."
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:postmaster@example.com"
mail.example.com. A 203.0.113.10
example.com. MX 10 mail.example.com.
Ключ DKIM генерируется через opendkim-genkey. Приватный ключ остаётся на сервере, а содержимое mail.txt публикуется в TXT-записи. Сначала сгенерируйте ключ, затем добавьте запись в DNS и только после этого проверяйте её через opendkim-testkey. Начните с политики DMARC p=none, чтобы собрать отчёты, и потом переходите к quarantine.
sudo install -d -o opendkim -g opendkim /etc/dkimkeys
sudo opendkim-genkey -b 2048 -d example.com -s mail -D /etc/dkimkeys
sudo chown opendkim:opendkim /etc/dkimkeys/mail.private
sudo opendkim-testkey -d example.com -s mail -vvv
sudo cat /etc/dkimkeys/mail.txt
В /etc/opendkim.conf добавьте параметры домена и сокета:
Domain example.com
Selector mail
KeyFile /etc/dkimkeys/mail.private
Socket inet:8891@localhost
Mode sv
Затем подключите милтер к Postfix через smtpd_milters и non_smtpd_milters, перезапустите оба сервиса и проверьте журнал на ошибки подписи.
sudo systemctl restart opendkim postfix
sudo grep -i dkim /var/log/mail.log | tail -20
dig +short TXT mail._domainkey.example.com
Проверка отправки и приёма
Сначала проверьте локальную доставку, затем отправку на внешний адрес. Замените user на существующего системного пользователя. В журнале видно каждый этап: соединение, аутентификацию, очередь и ответ удалённого сервера.
echo "Test message" | mail -s "Test" user@example.com
sudo tail -f /var/log/mail.log
postqueue -p
sudo postcat -q 1A2B3C4D5E
Если письмо зависло в очереди, postqueue покажет причину, а postcat — содержимое. Не удаляйте очередь целиком: сначала разберитесь, заблокирован ли порт 25, не истёк ли сертификат и совпадает ли имя в HELO с PTR. Если письмо не ушло, смотрите ответ удалённого сервера в журнале, а не меняйте DNS наугад: текст ошибки обычно прямо указывает на причину. Для ручной проверки удобен swaks из одноимённого пакета.
swaks --to user@example.com --from postmaster@example.com --server localhost
sudo postfix flush
sudo systemctl status postfix dovecot opendkim --no-pager
Чек-лист
- PTR, A и MX указывают на один и тот же сервер.
- Порт 25 открыт наружу, но релей запрещён.
- Отправка на 587 требует TLS и пароль.
- SPF, DKIM и DMARC опубликованы и проверены.
- Очередь и журналы просматриваются регулярно.
- Массовые рассылки не ведутся с этого сервера.
Итог
Postfix остаётся предсказуемым инструментом для собственного домена: небольшая конфигурация, Dovecot для ящиков и записи SPF, DKIM и DMARC закрывают базовый сценарий. Основное время уходит не на установку, а на DNS, сертификаты и разбор журналов. Начинайте с одного домена и нескольких ящиков, проверяйте каждый этап через логи и только потом усложняйте схему.