1666 March 4, 2024, 4:17 p.m.

[Update 4]Локальный почтовый сервис вместо зарубежных удаленных на основе Postfix&Dovecot

Задача: переехать с удаленного регистратора на свой почтовый сервис под управлением Postfix и Dovecot на операционной системе Debian 10(11)

Так как задачи отправлять письма отсутствует, а нужно лишь принимать была создана запись типа А и МХ Для работы системы потребуются установить следующие пакеты:

sudo apt install apache2 mariadb-server php-{xml,pear,imap,intl,common,json,curl,mbstring,mysql,gd,imagick,zip,opcache,sqlite3} libapache2-mod-php

Для работы почтового сервиса также подойдет и MySQL. Для входящей почты нужен отдельный пользователь и его папка:

sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtual Mail User" vmail
sudo mkdir -p /var/vmail
sudo chmod -R 770 /var/vmail
sudo chown -R vmail:mail /var/vmail

Нужно создать базу данных для Postfix – это можно реализовать либо через консоль, либо через phpmyadmin:

mysql -u root -p
MariaDB [(none)]> CREATE DATABASE postfixadmin;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY '5tr0n6p455w0rd';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> \q

После подготовительных настроек нужно установить Postfix:

sudo apt install postfix-mysql

Нужно выбрать Internet site Когда попросит ввести имя нужно вводить будущий домен, например, mail.example.com для того чтобы не было проблем с созданием сертификата. Так как пользователи будут храниться в БД нужно создать соответствующие конфиги:

sudo mkdir -p /etc/postfix/sql
sudo nano /etc/postfix/sql/mysql_virtual_alias_maps.cf
user = postfixadmin
password = 5tr0n6p455w0rd
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
sudo nano /etc/postfix/sql/mysql_virtual_domains_maps.cf
user = postfixadmin
password = 5tr0n6p455w0rd
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
sudo nano /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
user = postfixadmin
password = 5tr0n6p455w0rd
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
user = postfixadmin
password = 5tr0n6p455w0rd
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
user = postfixadmin
password = 5tr0n6p455w0rd
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
sudo nano /etc/postfix/sql/mysql_virtual_mailbox_limit_maps.cf
user = postfixadmin
password = 5tr0n6p455w0rd
hosts = localhost
dbname = postfixadmin
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
user = postfixadmin
password = 5tr0n6p455w0rd
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

Для конфигурировали postfix

ВАЖНО: в качестве сертификата нужно указыватьт полную цепочку, у Let’s encrypt это fullchain.pem. Иначе с такими сервисами как AWS SES работать почтовый сервис не будет.

sudo postconf -e "myhostname = $(hostname -f)"
UPD: нужно заменить $(hostname -f) на домен своей будущей почты, чтобы при настройке DKIM SFP и дальнейшей проверке не было проблем.
sudo postconf -e "mydestination = localhost"
sudo postconf -e "mynetworks = 127.0.0.0/8" 

ВАЖНО: вводить нужно свои подсети так как в противном случае сервер может стать ретранслятором спама, в следствии чего, домен окажется в спамбазах.

sudo postconf -e "inet_protocols = ipv4"
sudo postconf -e "inet_interfaces = all"
sudo postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/fullchain.pem" 
sudo postconf -e "smtpd_tls_key_file = /etc/ssl/private/privkey.key"
Пути выше можно заменить на пути ваших сертификатов (купленных или созданных в Let's Encrypt)
sudo postconf -e "smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key"
sudo postconf -e "smtpd_tls_auth_only = yes"
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_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination"
sudo postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
sudo postconf -e "virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf"
sudo postconf -e "virtual_alias_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf"
sudo postconf -e "virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf"

В файле нужно поменять блок конфига

sudo nano /etc/postfix/master.cf
smtp inet n - y - - smtpd
#smtp inet n - y - 1 postscreen
#smtpd pass - - y - - smtpd
#dnsblog unix - - y - 0 dnsblog
#tlsproxy unix - - y - 0 tlsproxy
submission inet n - y - - smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps inet n - y - - smtpd
  -o syslog_name=postfix/smtps
# -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

Так как сервер будет использовать только IMAP ставлю следующие пакеты

sudo apt install dovecot-mysql dovecot-imapd dovecot-lmtpd

Редактируем файл

sudo nano /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain  >  auth_mechanisms = plain login

Комментируем и снимаем комментирование

#!include auth-system.conf.ext 
!include auth-sql.conf.ext
sudo nano /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=5tr0n6p455w0rd
default_pass_scheme = MD5-CRYPT
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT '/var/vmail/%d/%u' as home, 'maildir:/var/vmail/%d/%u' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'
sudo nano /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = mail
mail_privileged_group = mail
first_valid_uid = 150
last_valid_uid = 150

Нужно заменить блоки на представленные ниже

sudo nano /etc/dovecot/conf.d/10-master.conf
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 = 0666
     user = postfix
     group = postfix
}

unix_listener auth-userdb {
     mode = 0600
     user = vmail

}
user = dovecot
}

service auth-worker {
     user = vmail
}

Установка прав на файлы

sudo chown -R vmail:dovecot /etc/dovecot
sudo chmod -R o-rwx /etc/dovecot
sudo systemctl restart postfix dovecot

Нужно установить оболочку Postfixadmin это можно сделать разными способами для примера покажу

wget -q https://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-${VERSION}/postfixadmin-${VERSION}.tar.gz
tar xzf postfixadmin-${VERSION}.tar.gz
sudo mv postfixadmin-${VERSION}/ /var/www/postfixadmin
rm -f postfixadmin-${VERSION}.tar.gz
mkdir /var/www/postfixadmin/templates_c
sudo chown -R www-data: /var/www/postfixadmin

Настройка конфига

$ sudo nano /var/www/postfixadmin/config.local.php
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = '5tr0n6p455w0rd';
$CONF['database_name'] = 'postfixadmin';
$CONF['configured'] = true;

После перехода на сайт там попросят ввести мастер-ключ после его создание будет выдана часть конфига которая вносится в файл выше после чего на этом же сайте будет возможность создать БД и администратора. На этом установка и настройка закончена, дополнительно можно поставить Web-оболочку Roundcube. UPD: Для того чтобы отправлять письма из web-оболочки нужно в config.inc.php привести последние строки к следующиему виду:

$config['plugins'] = array();
$config['smtp_server'] = 'tls://localhost';

$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';

$config['smtp_conn_options'] = [
  'ssl' => [
    'peer_name' => 'mail.example.com',
//    'cafile' => '/etc/ssl/certs/ca-certificates.crt'
  ],

В конце нужно открыть порты 25 и 143

Источники