sudo apt update
sudo apt upgrade -y
sudo apt install -y nginx dnsutils mariadb-server mariadb-client
замени vedrator.ru на свой домен
-
Найди строку с 127.0.1.1. Если её нет — добавь:sudo hostnamectl set-hostname mail.vedrator.ru sudo nano /etc/hosts
Проверь:127.0.1.1 mail.vedrator.ru mail
Должно вывести:hostname hostname -fmail.vedrator.ru mail.vedrator.ru -
получаем IPv4 сервера
В панели DNS добавь:curl -4 ifconfig.me
Если панель просит TTL — ставь стандартный, например:A mail IP_ТВОЕГО_СЕРВЕРА MX @ mail.vedrator.ru
проверим3600
должно вернуть IP сервераdig +short A mail.vedrator.ru
Должно быть примерно: 10 mail.vedrator.ru.dig +short MX vedrator.ru
Должно быть: mail.vedrator.ru.dig +short -x IP_ТВОЕГО_СЕРВЕРА
если нет, то это меняется уже не в DNS (НЕ НУЖНО ДОБАВЛЯТЬ ЗАПИСЬ!), а в панели самого VPS сервера
ищи что то вроде "PTR" или "Обратная PTR запись для IP адреса" -
MariaDB
Первичная защита MariaDBsudo mariadb-secure-installation
Создаем базу для почтыEnter current password for root: просто Enter Switch to unix_socket authentication: Y Change the root password: N Remove anonymous users: Y Disallow root login remotely: Y Remove test database and access to it: Y Reload privilege tables now: Y
Пока добавим домен vedrator.ru:sudo mariadb CREATE DATABASE mailserver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'СЛОЖНЫЙ_ПАРОЛЬ_ТУТ'; GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost'; FLUSH PRIVILEGES; USE mailserver; CREATE TABLE virtual_domains ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, active TINYINT(1) NOT NULL DEFAULT 1 ); CREATE TABLE virtual_users ( id INT AUTO_INCREMENT PRIMARY KEY, domain_id INT NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, active TINYINT(1) NOT NULL DEFAULT 1, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ); CREATE TABLE virtual_aliases ( id INT AUTO_INCREMENT PRIMARY KEY, domain_id INT NOT NULL, source VARCHAR(255) NOT NULL, destination VARCHAR(255) NOT NULL, active TINYINT(1) NOT NULL DEFAULT 1, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE );
ПроверкаINSERT INTO virtual_domains (name) VALUES ('vedrator.ru'); EXIT;
Вернетsudo mariadb mailserver -e "SELECT * FROM virtual_domains;"+----+-------------+--------+ | id | name | active | +----+-------------+--------+ | 1 | vedrator.ru | 1 | +----+-------------+--------+ -
ставим Postfix + Dovecot и настраиваем Dovecot для виртуальных ящиков через MariaDB
Пока цель этого шага: чтобы Dovecot умел авторизовать ящик из базы.
Во время установки Postfix выбери (может не появиться, не страшно):sudo apt install -y postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved ssl-certGeneral type of mail configuration: Internet Site System mail name: mail.vedrator.ru - пользователь для хранения почты
Проверь:sudo groupadd -g 5000 vmail sudo useradd -g vmail -u 5000 vmail -d /var/vmail -m sudo chown -R vmail:vmail /var/vmail sudo chmod -R 770 /var/vmail
Должно быть примерно:id vmail ls -ld /var/vmailuid=5000(vmail) gid=5000(vmail) groups=5000(vmail) drwxrwx--- ... vmail vmail /var/vmail -
Настрой Dovecot
Полностью замени содержимое на:sudo nano /etc/dovecot/conf.d/10-mail.conf
Открой:mail_location = maildir:/var/vmail/%d/%n namespace inbox { inbox = yes } mail_privileged_group = mail first_valid_uid = 5000 last_valid_uid = 5000
Полностью замени содержимое на:sudo nano /etc/dovecot/conf.d/10-auth.conf
Открой:disable_plaintext_auth = yes auth_mechanisms = plain login !include auth-sql.conf.ext
Полностью замени содержимое на:sudo nano /etc/dovecot/conf.d/auth-sql.conf.ext
Открой:passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/var/vmail/%d/%n }
Полностью замени содержимое на:sudo nano /etc/dovecot/dovecot-sql.conf.ext
Права на файл:driver = mysql connect = host=localhost dbname=mailserver user=mailuser password=ПАРОЛЬ_MAILUSER default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u' AND active=1;sudo chown root:dovecot /etc/dovecot/dovecot-sql.conf.ext sudo chmod 640 /etc/dovecot/dovecot-sql.conf.ext -
Настрой master-сокеты Dovecot
Полностью замени содержимое на:sudo nano /etc/dovecot/conf.d/10-master.confservice imap-login { inet_listener imap { port = 143 } inet_listener imaps { port = 993 ssl = yes } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail group = vmail } user = dovecot } service auth-worker { user = vmail } -
Временно включи SSL на стандартном snakeoil-сертификате
Позже заменим на нормальный сертификат для mail.vedrator.ru.
Полностью замени содержимое на:sudo nano /etc/dovecot/conf.d/10-ssl.confssl = required ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key -
Проверка Dovecot-конфига
Если ошибок нет, перезапусти:sudo dovecot -n
Должно быть: active (running)sudo systemctl restart dovecot sudo systemctl status dovecot -
Создай первый почтовый ящик в базе
Сгенерируй хеш пароля:
Введи пароль для ящика, например для:doveadm pw -s SHA512-CRYPT
Команда выдаст строку вида:postmaster@vedrator.ru
Скопируй её полностью.{SHA512-CRYPT}$6$....
Зайди в MariaDB:
Вставь ящик. Вместо ХЕШ_ПАРОЛЯ_ОТ_DOVEADM вставь полученный хеш:sudo mariadb use mailserver;
Проверь:INSERT INTO virtual_users (domain_id, email, password) SELECT id, 'postmaster@vedrator.ru', 'ХЕШ_ПАРОЛЯ_ОТ_DOVEADM' FROM virtual_domains WHERE name = 'vedrator.ru';
Проверка авторизацииSELECT id, email, active FROM virtual_users; exit;
Если всё хорошо, должно быть примерно:sudo doveadm auth test postmaster@vedrator.ru 'ПАРОЛЬ_ОТ_ЯЩИКА'
На этом шаге нам важно получить успешный результат, если его нет, то перазгрузи и проверь снова:passdb: postmaster@vedrator.ru auth succeeded extra fields: user=postmaster@vedrator.rusudo reboot -
Создаем MySQL-карты для Postfix
следующий шаг — настроить Postfix, чтобы он принимал письма для vedrator.ru и передавал их в Dovecot
Вставь:sudo nano /etc/postfix/mysql-virtual-mailbox-domains.cf
Создай файл ящиков:user = mailuser password = ПАРОЛЬ_MAILUSER hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s' AND active=1
Вставь:sudo nano /etc/postfix/mysql-virtual-mailbox-maps.cf
Создай файл алиасов:user = mailuser password = ПАРОЛЬ_MAILUSER hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s' AND active=1sudo nano /etc/postfix/mysql-virtual-alias-maps.cf
Права на файлыuser = mailuser password = ПАРОЛЬ_MAILUSER hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s' AND active=1
Проверь:sudo chown root:postfix /etc/postfix/mysql-virtual-*.cf sudo chmod 640 /etc/postfix/mysql-virtual-*.cf
Должно быть примерно:ls -l /etc/postfix/mysql-virtual-*.cf
Проверяем, что Postfix видит данные в MariaDB-rw-r----- 1 root postfix ...
Должно вернуть:sudo postmap -q vedrator.ru mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Проверка ящика:1
Должно вернуть:sudo postmap -q postmaster@vedrator.ru mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf1 -
Настраиваем основной конфиг Postfix
Теперь виртуальные домены и ящики:sudo postconf -e "myhostname = mail.vedrator.ru" sudo postconf -e "myorigin = /etc/mailname" sudo postconf -e "mydestination = localhost" sudo postconf -e "relay_domains =" sudo postconf -e "inet_interfaces = all" sudo postconf -e "inet_protocols = ipv4"
Настройка авторизации через Dovecot:sudo postconf -e "virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf" sudo postconf -e "virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf" sudo postconf -e "virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf" sudo postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
Базовые ограничения, чтобы сервер не стал открытым relay:sudo postconf -e "smtpd_sasl_type = dovecot" sudo postconf -e "smtpd_sasl_path = private/auth" sudo postconf -e "smtpd_sasl_auth_enable = yes" sudo postconf -e "smtpd_sasl_security_options = noanonymous" sudo postconf -e "smtpd_sasl_tls_security_options = noanonymous"
Временно SSL на стандартном сертификате:sudo postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination" sudo postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
Запиши имя сервера в /etc/mailname:sudo postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem" sudo postconf -e "smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key" sudo postconf -e "smtpd_tls_security_level = may" sudo postconf -e "smtp_tls_security_level = may"
Включаем SMTP-порт 587 для WordPress и почтовых клиентовecho "mail.vedrator.ru" | sudo tee /etc/mailname
Также включим 465:sudo postconf -M submission/inet="submission inet n - y - - smtpd" sudo postconf -P submission/inet/syslog_name=postfix/submission sudo postconf -P submission/inet/smtpd_tls_security_level=encrypt sudo postconf -P submission/inet/smtpd_sasl_auth_enable=yes sudo postconf -P submission/inet/smtpd_recipient_restrictions=permit_sasl_authenticated,reject
Перезапускаем Postfixsudo postconf -M smtps/inet="smtps inet n - y - - smtpd" sudo postconf -P smtps/inet/syslog_name=postfix/smtps sudo postconf -P smtps/inet/smtpd_tls_wrappermode=yes sudo postconf -P smtps/inet/smtpd_sasl_auth_enable=yes sudo postconf -P smtps/inet/smtpd_recipient_restrictions=permit_sasl_authenticated,reject
Проверяем, что порты слушаютсяsudo postfix check sudo systemctl restart postfix sudo systemctl status postfix
Должны быть видны порты:sudo ss -tulpn | grep -E ':25|:465|:587|:993'25 465 587 993 -
Тестовая доставка письма в локальный ящик
Установи тестовый инструмент:
Отправь тестовое письмо локально на созданный ящик:sudo apt install -y swaks
Если все хорошо, в конце будет что-то вроде:swaks --to postmaster@vedrator.ru --from test@example.local --server 127.0.0.1
Потом проверь, появилось ли письмо в ящике:250 2.0.0 Ok: queued as ...
Должен появиться файл письма внутри:sudo find /var/vmail/vedrator.ru/postmaster/new -type f
Если тест не пройдет, сразу смотри лог:/var/vmail/vedrator.ru/postmaster/new/...sudo tail -100 /var/log/mail.log -
проверить SMTP-авторизацию на 587 порту
Если всё хорошо, в конце будет:swaks \ --server 127.0.0.1 \ --port 587 \ --tls \ --auth LOGIN \ --auth-user postmaster@vedrator.ru \ --auth-password 'ПАРОЛЬ_ОТ_ЯЩИКА' \ --from postmaster@vedrator.ru \ --to postmaster@vedrator.ru250 2.0.0 Ok: queued as ... -
Создай папку под webmail
Создай тестовую страницу:sudo mkdir -p /var/www/mail.vedrator.ru/public
Права:echo "mail.vedrator.ru works" | sudo tee /var/www/mail.vedrator.ru/public/index.html
Создай Nginx-конфиг для mail.vedrator.rusudo chown -R www-data:www-data /var/www/mail.vedrator.rusudo nano /etc/nginx/sites-available/mail.vedrator.ruserver { listen 80; listen [::]:80; server_name mail.vedrator.ru; root /var/www/mail.vedrator.ru/public; index index.html; location / { try_files $uri $uri/ =404; } }
Проверь:sudo ln -s /etc/nginx/sites-available/mail.vedrator.ru /etc/nginx/sites-enabled/ sudo systemctl reload nginxcurl http://mail.vedrator.ru -
SSL
Certbot
В процессе:sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d mail.vedrator.ru
Подключи сертификат к Dovecotemail — можешь указать свой terms — agree redirect HTTP to HTTPS — выбирай redirectsudo nano /etc/dovecot/conf.d/10-ssl.conf
Проверь и перезапусти:ssl = required ssl_cert = </etc/letsencrypt/live/mail.vedrator.ru/fullchain.pem ssl_key = </etc/letsencrypt/live/mail.vedrator.ru/privkey.pem
Подключи сертификат к Postfixsudo dovecot -n sudo systemctl restart dovecot
Перезапусти Postfix:sudo postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.vedrator.ru/fullchain.pem" sudo postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.vedrator.ru/privkey.pem" sudo postconf -e "smtpd_tls_security_level = may" sudo postconf -e "smtp_tls_security_level = may"
Проверка IMAPS:sudo postfix check sudo systemctl restart postfix
В выводе должно быть что-то вроде:openssl s_client -connect mail.vedrator.ru:993 -servername mail.vedrator.ru
Выйти можно так:Verify return code: 0 (ok)
Проверка SMTP 587:Ctrl + C
Если всё хорошо, в конце будет:swaks \ --server mail.vedrator.ru \ --port 587 \ --tls \ --auth LOGIN \ --auth-user postmaster@vedrator.ru \ --auth-password 'ПАРОЛЬ_ОТ_ЯЩИКА' \ --from postmaster@vedrator.ru \ --to postmaster@vedrator.ru250 2.0.0 Ok: queued as ...