Подробный гайд: настройка почтового сервера на CentOS 9
Важно:
Почтовый сервер критически зависит от DNS, обратного PTR-записи и корректной настройки TLS. Без этого письма будут уходить в спам или отклоняться. Рекомендую сначала отработать инструкцию на тестовой ВМ.
1. Предварительные требования
- Чистая установка CentOS Stream 9 с доступом root или sudo
- Статический публичный IP-адрес
- Доменное имя с доступом к управлению DNS-зоной
- Настроенная PTR (reverse DNS) запись у хостинг-провайдера: IP → mail.вашдомен.com
- Открытые порты: 25, 587, 993, 995, 80, 443 (80 нужен для Let's Encrypt)
2. Подготовка DNS (обязательно до настройки сервера)
В панели управления DNS добавьте записи:
| Тип | Имя | Значение |
|---|---|---|
| A | Ваш_IP | |
| MX | @ | 10 mail.вашдомен.com. |
| TXT | @ | v=spf1 mx ip4:Ваш_IP ~all |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:admin@вашдомен.com |
(DKIM будет добавлен позже, после генерации ключей)
3. Установка пакетов
sudo dnf update -y
sudo dnf install epel-release -y
sudo dnf install postfix dovecot rspamd certbot fail2ban -y
sudo systemctl enable --now postfix dovecot rspamd
4. Настройка Postfix (MTA)
Редактируем основной конфиг:
sudo nano /etc/postfix/main.cf
Добавьте/измените параметры:
# Идентификация
myhostname = mail.вашдомен.com
mydomain = вашдомен.com
myorigin = $mydomain
# Сетевые параметры
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8, [::1]/128
# Формат ящика
home_mailbox = Maildir/
# SASL через Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
# TLS
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.вашдомен.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.вашдомен.com/privkey.pem
smtp_tls_CAfile = /etc/letsencrypt/live/mail.вашдомен.com/chain.pem
tls_preempt_cipherlist = yes
# Ограничения
smtpd_helo_required = yes
disable_vrfy_command = yes
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
Проверьте конфиг и перезапустите:
sudo postfix check
sudo systemctl reload postfix
5. Настройка Dovecot (IMAP/POP3 + SASL)
5.1 Основной конфиг
sudo nano /etc/dovecot/dovecot.conf
protocols = imap lmtp
listen = *, ::
5.2 Аутентификация
sudo nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
5.3 Интеграция SASL с Postfix
sudo nano /etc/dovecot/conf.d/10-master.conf
Найдите блок service auth и замените на:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = dovecot
}
}
5.4 TLS
sudo nano /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.вашдомен.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.вашдомен.com/privkey.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
5.5 Перезапуск
sudo systemctl reload dovecot
6. Получение SSL-сертификата (Let's Encrypt)
Важно:
Порт 80 должен быть свободен. Если установлен Nginx/Apache, используйте --webroot или временно остановите веб-сервер.
sudo certbot certonly --standalone -d mail.вашдомен.com
Настройте автообновление с перезагрузкой служб:
sudo nano /etc/letsencrypt/renewal-hooks/deploy/mail-reload.sh
#!/bin/bash
systemctl reload postfix dovecot
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mail-reload.sh
sudo crontab -e
# Добавьте: 0 3 * * 1 /usr/bin/certbot renew --quiet
7. Фильтрация спама и проверка DKIM (Rspamd)
Rspamd заменяет старые связки Amavis/SpamAssassin/ClamAV, работает быстрее и проще в настройке.
7.1 Интеграция с Postfix
В /etc/postfix/main.cf добавьте:
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = inet:127.0.0.1:11332
milter_default_action = accept
milter_protocol = 6
sudo systemctl reload postfix
7.2 Генерация DKIM-ключа
sudo rspamadm dkim_keygen -d вашдомен.com -s default
Вывод будет содержать приватный ключ и DNS-запись.
- Сохраните приватный ключ:
sudo tee /var/lib/rspamd/dkim/вашдомен.com.default.key - В DNS добавьте TXT-запись:
default._domainkey.вашдомен.com→v=DKIM1; k=rsa; p=MIIBIjANBgk...
7.3 Включение подписи DKIM в Rspamd
sudo nano /etc/rspamd/local.d/dkim_signing.conf
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "default";
allow_username_mismatch = true;
sudo systemctl reload rspamd
8. Firewall и SELinux
8.1 Firewalld
sudo firewall-cmd --permanent --add-service={smtp,smtps,imap,imaps}
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=11334/tcp
sudo firewall-cmd --reload
8.2 SELinux
CentOS 9 работает с SELinux в enforcing.
Разрешаем работу почтовых сервисов:
sudo setsebool -P postfix_local_write_mail_home on
sudo setsebool -P dovecot_can_network_connect on
sudo setsebool -P httpd_can_network_connect on
Если в логах audit.log появляются AVC denied, используйте:
sudo ausearch -c 'postfix' --raw | audit2allow -M mypostfix
sudo semodule -i mypostfix.pp
9. Fail2ban (защита от перебора)
Создайте фильтр для Dovecot и Postfix:
sudo nano /etc/fail2ban/filter.d/dovecot.conf
[Definition]
failregex = ^.*%(__prefix_line)s(?:Error: )?auth: (?:plain|login).*authentication failure.*rip=<HOST>
Активируйте в /etc/fail2ban/jail.local:
[dovecot]
enabled = true
port = imap,imaps,submission,smtps
filter = dovecot
logpath = /var/log/maillog
maxretry = 5
bantime = 3600
findtime = 600
[postfix-sasl]
enabled = true
port = smtp,submission,imap,imaps
filter = postfix-sasl
logpath = /var/log/maillog
maxretry = 5
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
10. Тестирование
1. SMTP отправка (используйте swaks или онлайн-сервисы):
sudo dnf install swaks -y
swaks --to test@вашдомен.com --from test@вашдомен.com --server localhost --auth LOGIN --auth-user ваш_логин --auth-pass ваш_пароль
2. IMAP подключение:
openssl s_client -connect localhost:993
3. Проверка доставки и репутации:
- Отправьте письмо на check-auth@verifier.port25.com (ответ придёт с анализом SPF/DKIM/DMARC)
- Используйте mail-tester.com
4. Логи:
sudo journalctl -u postfix -f
sudo journalctl -u dovecot -f
sudo tail -f /var/log/maillog
11. Рекомендации для production
| Аспект | Рекомендация |
|---|---|
| Пользователи | Для >10 ящиков используйте виртуальные домены: PostfixAdmin + MariaDB + Dovecot auth-sql |
| Резервные копии | rsync или borg для /var/mail и /etc/postfix, /etc/dovecot, /etc/rspamd |
| Мониторинг | prometheus + node_exporter + dovecot_exporter, логи через vector/rsyslog |
| Обновления | dnf automatic + yum-cron, тестируйте обновления в staging |
| Репутация | Следите за чёрными списками (MXToolbox, Spamhaus), настройте bounce и postmaster@ |
| Веб-почта | Roundcube (sudo dnf install roundcube) или Snappymail, работает поверх PHP-FPM/Nginx |
Полезные команды
| Задача | Команда |
|---|---|
| Просмотр очереди писем | mailq |
| Удалить все из очереди | sudo postsuper -d ALL |
| Перечитать конфиг Postfix | sudo postfix reload |
| Управление ящиками Dovecot | doveadm user '*', doveadm mailbox list -u user |
| Проверка DKIM/SPF | dig TXT default._domainkey.вашдомен.com |
| Просмотр логов Rspamd | sudo journalctl -u rspamd -f |