(полное руководство c автоматическим стартом, антиспамом, антивирусом и брандмауэром)
Сценарий: Windows 11 (хост) c IP 192.168.2.100 в локальной сети 192.168.2.0/24, роутер с «белым» статическим WAN‑IP, домены batteryservice.ru и batterywizard.ru, ~25 пользователей, ~1 GB новой почты/мес. Требования: IMAP, POP3, SMTP, webmail, TLS/Let’s Encrypt, антиспам, антивирус, Fail2ban, Firewall, доступ из Интернета, автоподъём Debian/служб после перезагрузки Windows. Рассмотрены нативная установка, установка через iRedMail и Docker‑вариант.
⬇️ Быстрые якоря
- Оглавление
- 1. Обычный пользователь
- 2. Разработчик
- 3. Администратор
- 3.3. Вариант 1: iRedMail (рекомендуется на старте)
- 3.4. Вариант 2: Ручная установка (Postfix+Dovecot+…)
- 3.5. Вариант 3: Docker (Mailcow / docker‑mailserver)
- Глоссарий
- ⬇️ Быстрые якоря
- 1. Обычный пользователь
- 2. Разработчик
- 3. Администратор
- 4. Глоссарий (термины с якорями)
1. Обычный пользователь
1.1. Обзор корпоративной почты
В компании развёрнут собственный почтовый сервер для доменов batteryservice.ru и batterywizard.ru. Доступ к почте возможен из любого места через защищённые протоколы IMAP [IMAP], POP3 [POP3], SMTP [SMTP] и через webmail [Webmail]. Все соединения защищены TLS [TLS] (сертификаты Let’s Encrypt).
Адреса сервера: mail.batteryservice.ru (рекомендуемый общесерверный хост для всех клиентов).
1.2. Способы доступа
- Почтовые клиенты (Outlook, Thunderbird, Apple Mail, iOS/Android):
Рекомендуется IMAP (синхронизация писем на сервере). POP3 — только если нужно скачивать почту на одно устройство. - Веб‑интерфейс:
Roundcube —https://mail.batteryservice.ru/mail/[Roundcube]
SOGo —https://mail.batteryservice.ru/SOGo/(почта + календарь/контакты, ActiveSync [ActiveSync])
1.3. Настройка почтового клиента
Входящая почта (IMAP/POP3):
- IMAP: порт 993 (SSL/TLS); альтернатива 143 с STARTTLS [STARTTLS]
- POP3: порт 995 (SSL/TLS); альтернатива 110 с STARTTLS
Исходящая почта (SMTP):
- SMTP Submission: порт 587 (STARTTLS, обязательно авторизация)
- Альтернатива: порт 465 (SMTPS)
Параметры входа:
— Имя пользователя: полный e‑mail (например, ivan.petrov@batteryservice.ru)
— Пароль: ваш пароль почтового ящика
Подсказки
- Если клиент ругается на сертификат — проверьте, что сервер указан mail.batteryservice.ru (должен совпадать с именем в сертификате).
- Для отправки всегда включайте «SMTP‑сервер требует аутентификацию».
1.4. Веб‑интерфейс (Roundcube / SOGo)
- Откройте
https://mail.batteryservice.ru/mail/(Roundcube) илиhttps://mail.batteryservice.ru/SOGo/(SOGo). - Введите полный e‑mail и пароль.
- В Roundcube доступны письма/папки/контакты; в SOGo — ещё календарь, адресная книга и мобильная синхронизация (Exchange/ActiveSync).
Возможности
- Смена пароля (если включено админом)
- Фильтры (автосортировка, «отпуск») через Sieve/ManageSieve
- В SOGo — календарь/контакты с синхронизацией на телефоны
1.5. Безопасность и корректная работа
- Используйте сложный пароль и не делитесь им.
- Проверяйте письма на фишинг; не открывайте неожиданные вложения.
- Антивирус на сервере проверяет вложения, но локальный антивирус тоже рекомендуем.
- При работе вне офиса — только через TLS.
- Массовые рассылки согласуйте с админом (лимиты/репутация домена).
2. Разработчик
2.1. SMTP из приложений
Используйте корпоративный SMTP как relay:
- Хост:
mail.batteryservice.ru - Порт:
587(STARTTLS) - Auth: да (выделенный ящик, например
no-reply@batteryservice.ru)
Примеры:
PHP (PHPMailer):
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'mail.batteryservice.ru';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Username = 'no-reply@batteryservice.ru';
$mail->Password = 'PASSWORD';
$mail->setFrom('no-reply@batteryservice.ru', 'No-Reply');
$mail->addAddress('user@example.com');
$mail->Subject = 'Test';
$mail->Body = 'Hello';
$mail->send();
Python (smtplib):
import smtplib, ssl
ctx = ssl.create_default_context()
with smtplib.SMTP('mail.batteryservice.ru', 587) as s:
s.starttls(context=ctx)
s.login('no-reply@batteryservice.ru', 'PASSWORD')
s.sendmail('no-reply@batteryservice.ru', ['user@example.com'], "Subject: Test\r\n\r\nHello")
Важно: храните пароли в безопасном хранилище/переменных окружения; следите за кодами ошибок SMTP (5xx — постоянные, 4xx — временные, повторите позже).
2.2. Чтение/обработка почты (IMAP/POP3)
IMAP (предпочтительно) — гибкая работа с папками/флагами:
- Хост:
mail.batteryservice.ru, порт 993 (SSL/TLS) - Используйте библиотеки: Python
imaplib/imapclient, Java Jakarta Mail, PHP IMAP, Nodeimap.
POP3 — простой заброс «всё из INBOX»:
- Хост:
mail.batteryservice.ru, порт 995 (SSL/TLS)
Практика: храните UID последних обработанных писем; запрашивайте заголовки отдельно; корректно закрывайте соединения.
2.3. Автоматизация управления
- Панель iRedAdmin (при варианте iRedMail): создание доменов/ящиков, алиасы, квоты.
- Через БД (виртуальные пользователи): SQL‑скрипты для массовых операций (создание ящиков, алиасов, квот).
- Скрипты:
postqueue/mailq(очередь),amavisd-new showkeys(DKIM),fail2ban-client(разбан/статус),pflogsumm(сводка). - ManageSieve: программная установка фильтров (автоответ/правила на сервере).
2.4. Кастомизация webmail
- Roundcube: брендирование (
product_name, логотип), плагины (пароль, фильтры, 2FA, интеграции). - SOGo: groupware, SSO/LDAP (по необходимости), ActiveSync.
- Milters/фильтры Postfix: корпоративные подписи, DLP‑проверки, Rspamd (как альтернатива SpamAssassin).
Совет: кастомизации вести как плагины/оверлеи, чтобы не мешать обновлениям.
2.5. Логи/мониторинг
- /var/log/mail.log — Postfix/Dovecot/Amavis (основной).
mailq/postqueue -p— состояние очереди.- Netdata/Zabbix/Prometheus — метрики (отправлено/принято, ошибки).
openssl s_client— проверка TLS:
openssl s_client -connect mail.batteryservice.ru:993 -servername mail.batteryservice.ru
openssl s_client -connect mail.batteryservice.ru:587 -starttls smtp -servername mail.batteryservice.ru
3. Администратор
3.1. Планирование и стек
- Нагрузка: ~25 ящиков, ~1 GB/мес — достаточно 2 CPU/4 GB RAM.
- Стек (нативно): Postfix (SMTP), Dovecot (IMAP/POP3+SASL), Roundcube/SOGo (webmail), SpamAssassin, ClamAV, Amavis, Fail2ban, Nginx, MariaDB.
- Альтернатива: iRedMail (автоматизирует всё) или Docker‑комплект (Mailcow / docker‑mailserver) с UI и Rspamd.
3.2. Подготовка окружения (Windows 11 + WSL 2)
3.2.1. Включение WSL 2 и установка Debian 12
PowerShell (админ):
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
wsl --install -d Debian
wsl --set-default-version 2
wsl --update
В Debian:
sudo apt update && sudo apt -y upgrade
sudo apt -y install nano htop mc wget ca-certificates gnupg lsb-release
3.2.2. Включение systemd в WSL
/etc/wsl.conf:
[boot]
systemd=true
Перезапустите WSL:
wsl --shutdown
И снова зайдите в Debian. Проверка:
systemctl list-units
3.2.3. Сеть: mirrored/portproxy, пробросы, роутер
A) Mirrored Networking (Windows 11 22H2+ — предпочтительно):
C:\Users\<Вы>\.wslconfig:
[wsl2]
networkingMode=mirrored
- Разрешите в Windows Firewall входящие порты TCP: 25, 80, 110, 143, 443, 465, 587, 993, 995 (см. ниже 3.3.3).
- Перезапустите WSL:
wsl --shutdown
Теперь сервисы в WSL видны в LAN (и за NAT роутера) по IP хоста 192.168.2.100.
B) Если Mirrored недоступен — порт‑прокси (netsh):
- Узнайте IP WSL:
hostname -I
- На Windows пробросите порты на этот IP:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=25 connectaddress=<WSL_IP> connectport=25
netsh interface portproxy add v4tov4 listenport=587 connectaddress=<WSL_IP> connectport=587
netsh interface portproxy add v4tov4 listenport=465 connectaddress=<WSL_IP> connectport=465
netsh interface portproxy add v4tov4 listenport=110 connectaddress=<WSL_IP> connectport=110
netsh interface portproxy add v4tov4 listenport=995 connectaddress=<WSL_IP> connectport=995
netsh interface portproxy add v4tov4 listenport=143 connectaddress=<WSL_IP> connectport=143
netsh interface portproxy add v4tov4 listenport=993 connectaddress=<WSL_IP> connectport=993
netsh interface portproxy add v4tov4 listenport=80 connectaddress=<WSL_IP> connectport=80
netsh interface portproxy add v4tov4 listenport=443 connectaddress=<WSL_IP> connectport=443
- Разрешите те же порты в Windows Firewall.
Проброс на роутере (NAT Port Forwarding):
Сделайте переадресацию WAN→LAN (TCP) на 192.168.2.100 для портов 25, 80, 443, 587, 465, 110, 995, 143, 993.
Замечание: некоторые провайдеры блокируют исходящий 25/tcp; для исходящих писем используйте порт 587 (Submission). Если блокируется исходящий 25, для доставки «сервер‑сервер» можно использовать внешний смарт‑хост (реле).
3.2.4. DNS: A/MX, SPF, DKIM, DMARC, PTR
A‑записи:mail.batteryservice.ru → <публичный IP> (и, по желанию, mail.batterywizard.ru → <тот же IP>)
MX:
batteryservice.ru MX 10 mail.batteryservice.ru.batterywizard.ru MX 10 mail.batteryservice.ru.
SPF (TXT):
batteryservice.ru. TXT "v=spf1 mx -all"
batterywizard.ru. TXT "v=spf1 mx -all"
DKIM: опубликуете после генерации ключа (см. §3.3.2).
DMARC (TXT):
_dmarc.batteryservice.ru. TXT "v=DMARC1; p=none; rua=mailto:postmaster@batteryservice.ru"
_dmarc.batterywizard.ru. TXT "v=DMARC1; p=none; rua=mailto:postmaster@batterywizard.ru"
Позже можно ужесточить p=quarantine/reject.
PTR (Reverse DNS): запросите у провайдера привязать PTR IP → mail.batteryservice.ru.
3.2.5. Ресурсы и автозапуск Debian/служб при старте Windows
- Ресурсы: ≥2 CPU, ≥4 GB RAM, диск с запасом (почта растёт: 1 GB/мес ≈ 12 GB/год).
- Автозапуск WSL Debian: Создайте задачу в Планировщике заданий Windows:
- Триггер: «При запуске»
- Действие: «Запуск программы»
- Программа:
wsl.exe - Аргументы:
-d Debian -u root -- systemd-run --unit=wsl-keepalive /usr/bin/sleep infinityЭто гарантирует, что WSL‑инстанс активен (и systemd поднимет почтовые службы).
3.3. Вариант 1: iRedMail (быстрый продакшн‑старт)
iRedMail автоматически установит и свяжет: Postfix, Dovecot, MariaDB/LDAP, Nginx, Roundcube, (опц.) SOGo, Amavis, SpamAssassin, ClamAV, iRedAdmin, Fail2ban.
3.3.1. Установка iRedMail
cd /tmp
wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.7.2.tar.gz -O iredmail.tar.gz
tar xzf iredmail.tar.gz && cd iRedMail-1.7.2/
sudo bash iRedMail.sh
В мастере установки:
- Mail storage:
/var/vmail - Web server: Nginx
- Accounts backend: MariaDB
- Первичный домен:
batteryservice.ru - Админ‑ящик:
postmaster@batteryservice.ru(задать пароль) - Компоненты: Roundcube, (опц.) SOGo, iRedAdmin, Amavis/SpamAssassin/ClamAV, Fail2ban
После завершения изучите файл с подсказками (iRedMail.tips), перезапустите службы:
sudo systemctl restart postfix dovecot amavis nginx clamav-daemon fail2ban mariadb
3.3.2. Пост‑настройка: домены, Let’s Encrypt, DKIM/DMARC, проверка
Добавьте второй домен в панели iRedAdmin → Add Domain: batterywizard.ru. Создайте пользователей/алиасы.
Let’s Encrypt (сертификат TLS):
sudo apt -y install certbot
sudo systemctl stop nginx
sudo certbot certonly --standalone -d mail.batteryservice.ru
sudo systemctl start nginx
Пропишите пути сертификата в Nginx, Postfix, Dovecot:
- Nginx (пример, замените на свои файлы в
ssl_certificate/ssl_certificate_key):
sudo ln -sf /etc/letsencrypt/live/mail.batteryservice.ru/fullchain.pem /etc/ssl/certs/iRedMail.crt
sudo ln -sf /etc/letsencrypt/live/mail.batteryservice.ru/privkey.pem /etc/ssl/private/iRedMail.key
sudo nginx -t && sudo systemctl reload nginx
- Postfix (
/etc/postfix/main.cf):
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.batteryservice.ru/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.batteryservice.ru/privkey.pem
sudo systemctl reload postfix
- Dovecot (
/etc/dovecot/conf.d/10-ssl.conf):
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.batteryservice.ru/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.batteryservice.ru/privkey.pem
sudo systemctl reload dovecot
Auto‑renew hook (обновление + reload):
В файле /etc/letsencrypt/renewal/mail.batteryservice.ru.conf добавьте:
deploy_hook = systemctl reload nginx postfix dovecot
DKIM:
Получите ключ и опубликуйте TXT:
sudo amavisd-new showkeys
Создайте запись mail._domainkey.batteryservice.ru → (публичный ключ).
Проверьте:
sudo amavisd-new testkeys
DMARC: (если не сделали ранее, см. §3.2.4).
Проверка доставки:
- Исходящая: отправьте письмо на внешний ящик (например, Gmail). Проверьте заголовки: DKIM/SPF/DMARC = pass.
- Входящая: с внешнего домена на свой ящик. Следите
tail -f /var/log/mail.log.
3.3.3. Антиспам/Антивирус, Fail2ban, RBL, Firewall, UFW
- SpamAssassin/ClamAV/Amavis уже включены. Порог спама (пример):
/etc/amavis/conf.d/50-user:
$sa_tag2_level_deflt = 5.0; # выше - помечать как SPAM
$sa_kill_level_deflt = 15.0; # выше - отклонять
$sa_spam_subject_tag = '***SPAM*** ';
- Greylisting (iRedAPD) — задерживает первые письма новых отправителей → меньше спама.
- RBL/DNSBL (добавьте в Postfix):
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
permit
Примечание: соблюдайте условия использования RBL (Spamhаus).
- Fail2ban: проверьте jail для
postfix-sasl,dovecot,sshd:
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status dovecot
Настройте bantime/findtime/maxretry в /etc/fail2ban/jail.local (например, 1 ч / 10 мин / 5 попыток).
- UFW (Linux‑фаервол в Debian):
sudo apt -y install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 25/tcp comment 'SMTP'
sudo ufw allow 587/tcp comment 'Submission'
sudo ufw allow 465/tcp comment 'SMTPS'
sudo ufw allow 110/tcp comment 'POP3'
sudo ufw allow 995/tcp comment 'POP3S'
sudo ufw allow 143/tcp comment 'IMAP'
sudo ufw allow 993/tcp comment 'IMAPS'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable
- Windows Firewall:
Откройте входящие TCP на хосте 192.168.2.100 для портов: 25, 80, 110, 143, 443, 465, 587, 993, 995 (через wf.msc или PowerShellNew-NetFirewallRule).
3.3.4. Бэкапы, мониторинг, обслуживание
Бэкапы:
- Maildir:
/var/vmail/…(почта пользователей) - БД:
vmail,iredadmin(mysqldump) - Конфиги:
/etc/postfix,/etc/dovecot,/etc/nginx,/etc/fail2ban,/etc/amavis,/etc/spamassassin
Пример скрипта:
#!/bin/bash
set -e
D="/mnt/backup/mail/$(date +%F)"
mkdir -p "$D"
mysqldump -u root -p vmail > "$D/vmail.sql"
mysqldump -u root -p iredadmin > "$D/iredadmin.sql"
tar czf "$D/etc.tar.gz" /etc/postfix /etc/dovecot /etc/nginx /etc/fail2ban /etc/amavis /etc/spamassassin
tar czf "$D/vmail.tar.gz" /var/vmail
Мониторинг:
- Netdata (часто ставится iRedMail),
pflogsumm,logwatch,fail2ban-client. - Регулярные обновления ОС/правил SA/ClamAV.
- Периодическая проверка IP на RBL (например, mxtoolbox).
3.4. Вариант 2: Ручная установка (Postfix + Dovecot + Roundcube + …)
3.4.1. Пакеты
sudo apt update
sudo apt -y install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-mysql \
mariadb-server nginx-full php-fpm php-mysql php-intl php-curl php-gd php-xml \
roundcube-core roundcube-mysql roundcube-plugins \
spamassassin spamc clamav clamav-daemon amavisd-new \
fail2ban certbot
Postfix: «Internet Site», System mail name = mail.batteryservice.ru.
3.4.2. MariaDB: домены/пользователи (виртуальные)
Создайте БД/пользователя:
CREATE DATABASE mailserver;
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'StrongPassword';
GRANT ALL PRIVILEGES ON mailserver.* TO 'mailuser'@'localhost';
FLUSH PRIVILEGES;
Схема (упрощённо):
USE mailserver;
CREATE TABLE domains (domain VARCHAR(255) PRIMARY KEY, transport VARCHAR(255) DEFAULT 'dovecot');
CREATE TABLE users (email VARCHAR(255) PRIMARY KEY, domain VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL, mailbox VARCHAR(255) NOT NULL,
active TINYINT(1) DEFAULT 1,
FOREIGN KEY (domain) REFERENCES domains(domain) ON DELETE CASCADE);
CREATE TABLE aliases (alias VARCHAR(255) NOT NULL, domain VARCHAR(255) NOT NULL,
destination VARCHAR(255) NOT NULL,
PRIMARY KEY (alias, destination),
FOREIGN KEY (domain) REFERENCES domains(domain) ON DELETE CASCADE);
INSERT INTO domains (domain) VALUES ('batteryservice.ru'), ('batterywizard.ru');
Хэш пароля (пример, Dovecot SHA512‑CRYPT):
doveadm pw -s SHA512-CRYPT
# Введите пароль -> получите {SHA512-CRYPT}$6$...
Добавьте пользователя:
INSERT INTO users (email,domain,password,mailbox)
VALUES ('[email protected]','batteryservice.ru','{SHA512-CRYPT}$6$...','batteryservice.ru/ivan.petrov/');
Системный владелец почты:
sudo adduser --system --no-create-home --uid 2000 --gid 2000 --disabled-login vmail
sudo mkdir -p /var/mail/vmail && sudo chown vmail:vmail /var/mail/vmail
3.4.3. Postfix (SMTP, Submission, Amavis)
/etc/postfix/main.cf (фрагменты):
myhostname = mail.batteryservice.ru
inet_interfaces = all
inet_protocols = ipv4
# Виртуальные домены/ящики:
virtual_mailbox_domains = mysql:/etc/postfix/sql/virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/virtual_mailbox_maps.cf
virtual_alias_maps = mysql:/etc/postfix/sql/virtual_alias_maps.cf
virtual_mailbox_base = /var/mail/vmail
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
# SASL через Dovecot:
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
# Submission:
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# TLS:
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.batteryservice.ru/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.batteryservice.ru/privkey.pem
# Anti‑relay/spam:
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
permit
# Контент‑фильтр на Amavis:
content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
/etc/postfix/master.cf (Amavis):
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o local_header_rewrite_clients=
SQL‑маппинги (/etc/postfix/sql/…):
virtual_mailbox_domains.cf
user = mailuser
password = StrongPassword
hosts = 127.0.0.1
dbname = mailserver
query = SELECT domain FROM domains WHERE domain='%s'
virtual_mailbox_maps.cf
user = mailuser
password = StrongPassword
hosts = 127.0.0.1
dbname = mailserver
query = SELECT mailbox FROM users WHERE email='%s' AND active=1
virtual_alias_maps.cf
user = mailuser
password = StrongPassword
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM aliases WHERE alias='%s'
Права:
sudo chown root:postfix /etc/postfix/sql/*.cf
sudo chmod 640 /etc/postfix/sql/*.cf
3.4.4. Dovecot (IMAP/POP3, SASL)
/etc/dovecot/dovecot.conf:
listen = *
protocols = imap pop3 lmtp
/etc/dovecot/conf.d/10-auth.conf:
disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ext
/etc/dovecot/conf.d/auth-sql.conf.ext:
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=2000 gid=2000 home=/var/mail/vmail/%d/%n
}
/etc/dovecot/dovecot-sql.conf.ext:
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=StrongPassword
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u' AND active=1
/etc/dovecot/conf.d/10-mail.conf:
mail_home = /var/mail/vmail/%d/%n
mail_location = maildir:~/
/etc/dovecot/conf.d/10-master.conf (SASL сокет для Postfix):
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
/etc/dovecot/conf.d/10-ssl.conf:
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.batteryservice.ru/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.batteryservice.ru/privkey.pem
3.4.5. Roundcube (webmail), PHP‑FPM, Nginx
Roundcube (/etc/roundcube/config.inc.php — фрагменты):
$config['default_host'] = 'ssl://localhost';
$config['default_port'] = 993;
$config['smtp_server'] = 'tls://localhost';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
Nginx — виртуальный хост для Roundcube (пример /etc/nginx/sites-available/roundcube.conf):
server {
listen 80;
server_name mail.batteryservice.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name mail.batteryservice.ru;
ssl_certificate /etc/letsencrypt/live/mail.batteryservice.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mail.batteryservice.ru/privkey.pem;
root /var/lib/roundcube;
index index.php;
location /mail/ {
alias /var/lib/roundcube/;
index index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
}
}
Активируйте сайт, проверьте конфиг и перезапустите Nginx:
sudo ln -s /etc/nginx/sites-available/roundcube.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
3.4.6. SpamAssassin/ClamAV/Amavis, Let’s Encrypt, Fail2ban
SpamAssassin:
sudo sed -i 's/ENABLED=0/ENABLED=1/' /etc/default/spamassassin
sudo systemctl enable --now spamassassin
Amavis/ClamAV: убедитесь, что amavis и clamav-daemon активны:
sudo systemctl enable --now amavis clamav-daemon
Let’s Encrypt:
sudo systemctl stop nginx
sudo certbot certonly --standalone -d mail.batteryservice.ru
sudo systemctl start nginx
Пропишите пути в Postfix/Dovecot (см. выше), добавьте hook на renew.
Fail2ban: включите jail для postfix-sasl, dovecot и sshd в /etc/fail2ban/jail.local, запустите:
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
Тесты:
telnet localhost 25
openssl s_client -connect mail.batteryservice.ru:587 -starttls smtp -servername mail.batteryservice.ru
openssl s_client -connect mail.batteryservice.ru:993 -servername mail.batteryservice.ru
mailq
tail -f /var/log/mail.log
3.5. Вариант 3: Docker (Mailcow / docker‑mailserver)
3.5.1. Когда выбирать Docker
Плюсы: цельный стек «под ключ» (Mailcow: Postfix, Dovecot, Rspamd, ClamAV, SOGo, ACME, UI), быстрая эксплуатация, удобное обновление и бэкап.
Минусы: дополнительный слой (Docker Desktop + WSL), больше потребление RAM, важно корректно настроить порты/Firewall/автостарт.
Для малого офиса Mailcow — оптимален в Docker: в комплекте Rspamd (эффективный антиспам), SOGo и удобная админ‑панель.
3.5.2. Предпосылки: Docker Desktop + WSL
- Установите Docker Desktop (включите WSL 2 backend и автозапуск при входе в Windows).
- Включите file sharing для диска, где будут тома Mailcow.
- Убедитесь: Windows Firewall и роутер пробрасывают TCP 25, 80, 443, 587, 465, 110, 995, 143, 993 на хост 192.168.2.100.
- DNS — как в §3.2.4 (A/MX, SPF; PTR у провайдера).
3.5.3. Развёртывание Mailcow
cd /opt
sudo apt -y install git
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
sudo ./generate_config.sh
Вопросы генератора:
- Hostname:
mail.batteryservice.ru - Timezone: Europe/Moscow (или ваш)
- HTTP/HTTPS порты: по умолчанию 80/443
- ACME (Let’s Encrypt):
y(укажите контактный email)
Переменные для SAN/доп. доменов (в .env, опционально):
ADDITIONAL_SAN=mail.batterywizard.ru
SKIP_LETS_ENCRYPT=n
SKIP_SOGO=n
Старт:
sudo docker compose pull
sudo docker compose up -d
Откройте https://mail.batteryservice.ru → Mailcow UI:
- Добавьте домены batteryservice.ru, batterywizard.ru (если не подтянулись).
- Создайте пользователей/алиасы/квоты.
- Включите/сгенерируйте DKIM для доменов (Mailcow покажет TXT для DNS).
- Webmail: SOGo уже доступен, антиспам — Rspamd (с веб‑панелью).
Автостарт: Docker Desktop запускается при входе; контейнеры с
restart: alwaysстартуют автоматически. Убедитесь, что Docker Desktop = Start with Windows, а в Mailcow — все сервисыrestart: always(стандарт).
3.5.4. Бэкапы, автостарт, Firewall/роутер
- Бэкап Mailcow:
./helper-scripts/backup_and_restore.sh(встроенный скрипт бэкапа томов и MySQL). Настройте cron на хосте/WSL. - Firewall + роутер: как в §3.3.3 и §3.2.3 (в т. ч. Windows Firewall).
- Мониторинг: встроенные панели Mailcow (Rspamd, Queue, Health), дополните внешним мониторингом.
3.6. Чек‑листы
Тест‑план запуска:
- DNS: A/MX/SPF опубликованы, PTR настроен.
- TLS:
openssl s_clientна 993/587 видит валидный LE‑сертификат. - SMTP Submission (587): авторизация ок, отправка на внешние домены работает.
- Входящие (25): письмо приходит извне, спам/вирусы фильтруются.
- Webmail: Roundcube/SOGo доступны по HTTPS.
- Антиспам: spam‑score присваивается, серые списки в работе, RBL активен.
- Fail2ban: при многократном неверном пароле IP банится.
- Бэкапы: создаются и тестово восстановимы.
- Автозапуск: после перезагрузки Windows службы активны (WSL жив, Docker запущен — если Docker‑вариант).
Чек‑лист безопасности:
- Обновления ОС/пакетов регулярны.
- Пароли сложные, смена по политике.
- Отключено всё лишнее (ненужные порты/службы).
- RBL/greylisting включены, лимиты на исходящую отправку настроены.
- Доступ к админ‑панелям ограничен (IP‑фильтры, базовая защита).
- Бэкапы offsite, проверка восстановления по расписанию.
- DMARC отчёты анализируются; при стабильности — усилить
p=quarantine/reject.
4. Глоссарий (термины с якорями)
- WSL — Windows Subsystem for Linux: подсистема, позволяющая запускать Linux (WSL 2 — с лёгкой VM на Hyper‑V).
- IMAP — протокол доступа к почте с хранением на сервере и синхронизацией (143/STARTTLS, 993/TLS).
- POP3 — протокол получения почты с загрузкой на устройство (110/STARTTLS, 995/TLS).
- SMTP — протокол отправки почты; клиентский Submission — порт 587 (STARTTLS), сервер‑сервер — 25.
- Webmail — доступ к почте через браузер (Roundcube, SOGo).
- TLS — шифрование транспортного уровня, обеспечивает защищённые IMAPS/POP3S/SMTPS.
- STARTTLS — команда перехода на TLS внутри обычного соединения (SMTP 587, IMAP 143, POP3 110).
- Roundcube — лёгкий веб‑клиент (только почта).
- SOGo — groupware веб‑клиент (почта+календарь+контакты+задачи).
- ActiveSync — протокол синхронизации (почта/календарь/контакты) с «push»-доставкой.
- Firewall — брандмауэр (Windows Firewall, UFW/iptables в Debian).
- Fail2ban — защита от перебора паролей: анализ логов → временный бан IP.
- Антиспам — комплекс средств: SpamAssassin/Rspamd, RBL/DNSBL, greylisting, SPF/DKIM/DMARC.
- Антивирус — ClamAV: сканирование вложений, карантин/отклонение заражённых писем.
- SPF — DNS‑запись, разрешающая доверенные отправители домена (предотвращает спуфинг).
- DKIM — криптоподпись исходящих писем ключом домена, проверяется по DNS‑ключу.
- DMARC — политика на базе SPF/DKIM + отчётность (p=none/quarantine/reject).
- PTR — обратная DNS‑запись (IP→имя), важна для репутации исходящей почты.
- RBL/DNSBL — списки IP‑источников спама (Spamhaus, Spamcop и др.).
- MTA — Mail Transfer Agent (Postfix, Exim): принимает/пересылает письма по SMTP.
- MDA — Mail Delivery Agent (Dovecot LDA/LMTP): финальная доставка в ящик.
- MUA — почтовый клиент пользователя (Outlook, Thunderbird, Roundcube).
- Maildir — формат хранения: каждое письмо — отдельный файл (cur/new/tmp).
- MariaDB — СУБД (форк MySQL), хранение виртуальных доменов/пользователей/алиасов.
- LDAP — каталожная служба (опция для крупных сред; альтернатива MariaDB).
- Amavis — промежуточный фильтр (интеграция SpamAssassin/ClamAV, DKIM‑подпись).
- Rspamd — современный высокопроизводительный антиспам (часто в Docker‑комплектах).
- UFW — упрощённая оболочка для iptables в Debian/Ubuntu (настройка правил входящих/исходящих).
Завершение
Вы получили полную, производственную схему развёртывания корпоративной почты на WSL Debian 12 с учётом безопасности, доступности из Интернета, автозапуска после перезагрузки Windows и с поддержкой двух доменов. Для быстрого старта recommend iRedMail (§3.3) или Mailcow (Docker) (§3.5). Для тонкого контроля — ручная установка (§3.4).
Перекрёстные ссылки: при настройке сертификатов и доверия — см. §3.3.2; защита (Fail2ban/RBL/UFW/Firewall) — см. §3.3.3; DNS‑аутентификация (SPF/DKIM/DMARC) — см. §3.2.4 и §3.3.2; автозапуск WSL/служб — см. §3.2.5.