Свой почтовый сервер — это не просто «хочу отправлять письма с домена». Это полноценная инфраструктура, которая требует понимания протоколов, внимания к деталям и постоянного контроля репутации. В этой статье мы построим работающий почтовый сервер с нуля: от установки Postfix и Dovecot до настройки защитных записей, которые гарантируют, что ваши письма будут доходить до адресатов, а не в спам.
Мы разберём:
- Как работает электронная почта: SMTP, IMAP, POP3, MX-записи.
- Установку и настройку Postfix как MTA.
- Установку и настройку Dovecot для хранения и доступа к почте.
- Настройку DNS-записей: MX, SPF, DKIM, DMARC, PTR.
- Защиту от спама и вирусов.
- Тестирование и отладку.
- Частые ошибки и способы их решения.
1. Как работает электронная почта
Прежде чем что-то настраивать, важно понять, как устроена доставка писем. Это поможет избежать ошибок и понять, почему что-то не работает.
1.1 Основные протоколы
- SMTP (Simple Mail Transfer Protocol) — протокол для отправки почты. Используется как для отправки писем от клиента на сервер, так и для передачи между серверами.
- IMAP (Internet Message Access Protocol) — протокол для доступа к почтовым ящикам. Позволяет читать почту с нескольких устройств, синхронизируя папки.
- POP3 (Post Office Protocol 3) — устаревший протокол для скачивания почты. Обычно скачивает письма и удаляет их с сервера (хотя можно настроить хранение).
| Порт | Назначение |
|---|---|
| 25 | Передача между серверами (MTA → MTA), часто заблокирован у провайдеров |
| 587 | Отправка почты клиентами (submission), TLS |
| 465 | Отправка почты клиентами, неявный TLS (smtps) |
| 143 / 993 | IMAP / IMAPS |
| 110 / 995 | POP3 / POP3S |
1.2 Ключевые DNS-записи
- MX-запись — указывает, какой сервер принимает почту для домена. Например:
example.com MX 10 mail.example.com. - A-запись — IP-адрес почтового сервера.
- PTR-запись (обратная зона) — сопоставляет IP-адрес с доменным именем. Многие почтовые серверы отклоняют письма, если PTR не совпадает с A-записью.
- SPF (Sender Policy Framework) — список серверов, которым разрешено отправлять почту от имени домена.
- DKIM (DomainKeys Identified Mail) — цифровая подпись писем, подтверждающая, что письмо отправлено с вашего домена и не изменено.
- DMARC (Domain-based Message Authentication, Reporting and Conformance) — политика, которая указывает, что делать с письмами, не прошедшими SPF/DKIM, и куда отправлять отчёты.
1.3 Схема доставки
- Отправитель (клиент) подключается к своему SMTP-серверу и отправляет письмо.
- SMTP-сервер отправителя ищет MX-запись домена получателя.
- Сервер отправителя подключается к MX-серверу получателя и передаёт письмо.
- Сервер получателя проверяет SPF, DKIM, DMARC, репутацию IP и принимает решение: принять, отклонить или пометить как спам.
- Если письмо принято, оно попадает в почтовый ящик, доступ к которому осуществляется по IMAP/POP3.
2. Установка и настройка Postfix
Postfix — это MTA (Mail Transfer Agent), который отвечает за отправку и приём почты.
2.1 Установка Postfix
Ubuntu/Debian:
sudo apt update
sudo apt install postfix mailutilsВ процессе установки выберите Internet Site и укажите ваш домен (например, example.com).
CentOS/RHEL/Rocky Linux:
sudo dnf install postfix
sudo systemctl enable postfix
sudo systemctl start postfix2.2 Базовая настройка Postfix
Основной конфигурационный файл: /etc/postfix/main.cf.
Минимальные настройки:
ini
# Имя почтового сервера
myhostname = mail.example.com
# Домен, для которого обслуживается почта
mydomain = example.com
# Домен, от которого отправляются письма
myorigin = $mydomain
# Интерфейсы, на которых слушает Postfix
inet_interfaces = all
# Протоколы (IPv4 и IPv6)
inet_protocols = ipv4
# Домены, для которых принимается почта
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# Сети, которым разрешено отправлять почту через этот сервер (релей)
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# Размер почтового ящика (для локальной доставки)
mailbox_size_limit = 0
# Максимальный размер письма
message_size_limit = 10240000
# Домашняя директория для почты
home_mailbox = Maildir/
Настройка /etc/postfix/master.cf:
ini
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
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
ВАЖНО! Без этого раздел про SASL-аутентификацию (4.4) не будет работать на практике.
2.3 Настройка TLS
Для шифрования соединений используйте сертификаты Let’s Encrypt.
ini
# Включение TLS
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_use_tls = yes
smtpd_tls_auth_only = yes
# Настройки шифров
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = high
# Параметры для SMTP-клиента (когда мы отправляем)
smtp_tls_security_level = may
smtp_tls_loglevel = 1
Если уже есть сертификат для домена, можно использовать его или выпустить дополнительный. Получение сертификата:
sudo certbot certonly --standalone -d mail.example.com2.4 Настройка SASL-аутентификации
Чтобы пользователи могли отправлять почту через ваш сервер, нужна аутентификация. Используем Dovecot как SASL-провайдер.
ini
# Включение SASL
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
# Запрет отправки без аутентификации
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
# Параметры безопасности
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
2.5 Ограничения и защита
ini
# Защита от спама (базовая)
smtpd_helo_required = yes
disable_vrfy_command = yes
# Ограничение количества писем
smtpd_client_connection_count_limit = 10
smtpd_client_connection_rate_limit = 30
# Проверка HELO
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname
# Проверка отправителя
smtpd_sender_restrictions = permit_mynetworks, reject_non_fqdn_sender, reject_unknown_sender_domain
2.6 Перезапуск Postfix
sudo systemctl restart postfix
sudo systemctl status postfix3. Установка и настройка Dovecot
Dovecot отвечает за хранение почты и доступ к ней по IMAP/POP3, а также предоставляет SASL для Postfix.
3.1 Установка Dovecot
Ubuntu/Debian:
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpdCentOS/RHEL:
sudo dnf install dovecot3.2 Основные настройки Dovecot
Конфигурационные файлы находятся в /etc/dovecot/.
/etc/dovecot/dovecot.conf:
ini
protocols = imap pop3 lmtp
listen = *, ::
/etc/dovecot/conf.d/10-mail.conf:
ini
mail_location = maildir:~/Maildir
mail_privileged_group = mail
/etc/dovecot/conf.d/10-auth.conf:
ini
disable_plaintext_auth = yes
auth_mechanisms = plain login
/etc/dovecot/conf.d/10-ssl.conf:
ini
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_protocols = !SSLv3 !TLSv1 !TLSv1.1
/etc/dovecot/conf.d/10-master.conf:
Настройка сокета для Postfix SASL:
ini
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
3.3 Создание пользователей и почтовых ящиков
Пользователи могут быть системными (Linux) или виртуальными (хранятся в БД). Для простоты используем системных пользователей.
# Создание пользователя
sudo useradd -m -s /bin/bash user1
sudo passwd user1
# Создание Maildir
sudo -u user1 maildirmake ~user1/MaildirВАЖНО! Команда maildirmake доступна только если установлен dovecot-imapd с утилитами. На некоторых системах её нет. Альтернатива:
sudo -u user1 mkdir -p ~user1/Maildir/{cur,new,tmp}Это всегда работает и делает то же самое — создаёт структуру Maildir.
3.4 Перезапуск Dovecot
sudo systemctl restart dovecot
sudo systemctl status dovecot4. Настройка DNS-записей
Это критически важный этап. Без правильных DNS-записей ваши письма будут попадать в спам или отклоняться.
4.1 MX-запись
Укажите домен, который будет принимать почту:
example.com. MX 10 mail.example.com.
Если у вас несколько серверов, можно указать приоритеты:
example.com. MX 10 mail1.example.com.
example.com. MX 20 mail2.example.com.
4.2 A-запись для почтового сервера
mail.example.com. A 192.0.2.1
4.3 PTR-запись (обратная зона)
PTR-запись обычно настраивается у хостинг-провайдера или в панели управления IP-адресом. Она должна указывать на mail.example.com. Многие почтовые серверы проверяют соответствие PTR и A-записи.
4.4 SPF-запись
SPF-запись создаётся как TXT-запись для домена:
example.com. TXT "v=spf1 mx a:mail.example.com ip4:192.0.2.1 -all"
v=spf1— версия SPF.mx— разрешить серверы из MX-записей.a:mail.example.com— разрешить IP из A-записи.ip4:192.0.2.1— разрешить конкретный IP.-all— запретить все остальные (жёсткая политика). Можно~all(мягкая).
4.5 DKIM
DKIM требует генерации ключей и добавления публичного ключа в DNS.
Генерация ключей:
sudo mkdir /etc/opendkim/keys/example.com
cd /etc/opendkim/keys/example.com
sudo opendkim-genkey -s mail -d example.com
sudo chown opendkim:opendkim mail.privateПубличный ключ будет в файле mail.txt. Добавьте его как TXT-запись:
mail._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."
Настройка OpenDKIM:
Установите opendkim и opendkim-tools. В /etc/opendkim.conf:
ini
Domain example.com
KeyFile /etc/opendkim/keys/example.com/mail.private
Selector mail
Socket inet:12301@localhost
Mode sv
Canonicalization relaxed/relaxed
Mode sv — означает signing + verifying (подписывать исходящие, проверять входящие). Без Mode по умолчанию может работать только проверка. Canonicalization relaxed/relaxed — стандарт для большинства почтовых систем, снижает риск ложных сбоев подписи при минимальных изменениях письма.
Подключите OpenDKIM к Postfix в /etc/postfix/main.cf:
ini
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301
Перезапустите сервисы:
sudo systemctl restart opendkim postfix4.6 DMARC
DMARC-запись указывает, что делать с письмами, не прошедшими проверку SPF/DKIM, и куда отправлять отчёты.
_dmarc.example.com. TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com; fo=1"
p=quarantine— помещать в спам (можноnoneдля мониторинга илиrejectдля отклонения).rua— адрес для агрегированных отчётов.ruf— адрес для отчётов о сбоях.fo=1— отправлять отчёт при любой ошибке.
5. Защита от спама и вирусов
5.1 RBL (Real-time Blackhole Lists)
Postfix может проверять IP-адреса отправителей по чёрным спискам.
ini
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net
5.2 Greylisting
Greylisting временно отклоняет письма с новых IP-адресов, заставляя отправителя повторить попытку через некоторое время. Спамеры обычно не повторяют.
Установите postgrey:
sudo apt install postgreyВ Postfix:
ini
smtpd_recipient_restrictions =
...
check_policy_service inet:127.0.0.1:10023
5.3 Антивирус (ClamAV)
Установите ClamAV и интегрируйте с Postfix через clamav-milter.
sudo apt install clamav clamav-daemon clamav-milterВ Postfix:
ini
smtpd_milters = inet:localhost:12301, unix:/clamav/clamav-milter.socket
5.4 SpamAssassin
SpamAssassin анализирует содержимое письма и ставит оценку спама.
sudo apt install spamassassinНастройте его как milter или через spamc.
В Postfix:
ini
smtpd_milters = inet:localhost:12301, unix:/spamassassin/spamd.sock
Или через content_filter:
ini
content_filter = spamassassin
ВАЖНО! SpamAssassin устарел.
SpamAssassin последний крупный релиз был в 2018 году, проект фактически заброшен. Современная замена — rspamd, который активно развивается, работает быстрее и лучше интегрируется с Postfix через milter.
6. Тестирование и отладка
6.1 Проверка портов
Убедитесь, что порты 25, 465, 587, 143, 993, 110, 995 открыты.
sudo ss -tulpn | grep -E ':(25|465|587|143|993|110|995)'6.2 Отправка тестового письма
echo "Test email body" | mail -s "Test Subject" user@example.com6.3 Проверка логов
- Postfix:
/var/log/mail.logили/var/log/maillog - Dovecot:
/var/log/dovecot.log - OpenDKIM:
/var/log/mail.log(или отдельный)
tail -f /var/log/mail.log6.4 Проверка SPF, DKIM, DMARC
Отправьте письмо на сервис проверки (например, check-auth@verifier.port25.com) и получите отчёт.
Или используйте утилиты:
dig TXT example.com
dig TXT mail._domainkey.example.com
dig TXT _dmarc.example.com6.5 Проверка PTR
dig -x 192.0.2.17. Частые ошибки и как их избежать
| Ошибка | Проявление | Решение |
|---|---|---|
| Отсутствует PTR-запись | Письма отклоняются или попадают в спам | Настройте PTR у провайдера, чтобы он указывал на mail.example.com. |
| Неправильная SPF-запись | Письма не проходят SPF | Проверьте синтаксис, убедитесь, что все отправляющие IP включены. |
| DKIM не работает | Подпись не проходит проверку | Проверьте, что OpenDKIM запущен, ключи на месте, селектор совпадает. |
| DMARC слишком строгий | Письма отклоняются | Начните с p=none, мониторьте отчёты, затем ужесточайте. |
| Postfix не принимает почту | Ошибка в логах | Проверьте mydestination, mynetworks, ограничения. |
| Dovecot не подключается | IMAP не работает | Проверьте SSL-сертификаты, права на Maildir, сокет для SASL. |
| Письма попадают в спам | Низкая репутация IP | Проверьте IP в чёрных списках, настройте SPF/DKIM/DMARC, прогрейте IP. |
| Открытый релей | Ваш сервер рассылает спам | Убедитесь, что mynetworks ограничен, и аутентификация обязательна. |
ВАЖНО! Новый почтовый IP нужно «прогревать»: первые 1–2 недели отправляйте небольшими объёмами (десятки писем в день), постепенно увеличивая. Пишите только реальным получателям, которые ждут ваших писем. Проверьте IP через или перед стартом.
Свой почтовый сервер — это контроль и независимость. Но это и ответственность. Если всё сделать правильно, ваши письма будут доходить до адресатов, а репутация домена — только расти.
