66 подписчиков

Настройка своего почтового сервера с нуля на базе Postfix и Dovecot

879 прочитали

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.

Логотип Postfix
Логотип Postfix

В моей статье разберем настройку на базе операционной системы (далее - ОС) Ubuntu 20.04. Рассказывать как установить ОС не буду, в интернете много информации об этом имеется, да и по сути без интернета все очень просто.

Все действия можно выполнять сразу под root, либо постоянно вначале каждой команды писать sudo и вводить пароль. Так же обращаю внимание, что в тексте будут строки, для внесения изменений в конфигурационные файлы. Удалять лишнее если я об этом не пишу, не нужно. Только редактируем и добавляем то что читаете.

Предварительная подготовка

Обновление ОС:

apt update
apt upgrade

Важно переименовать сервер т.к. многие анти спам системы проверяют, обращение к серверу по имени:

hostnamectl set-hostname mail.test.ru

mail.test.ru - вместо этого указываете свою FQDN имя.

Настройка синхронизации времени:

apt install chrony
timedatectl set-timezone Europe/Moscow
systemctl enable chrony

Europe/Moscow - вместо этой временной зоны вы указываете свою, либо оставляете как есть.

Открываем порты с помощью iptables:

iptables -I INPUT 1 -p tcp --match multiport --dports 25,110,143,465,587,993,995 -j ACCEPT
iptables -I INPUT 1 -p tcp --match multiport --dports 80,443 -j ACCEPT

Значения этих портов не буду расписывать, все стандартно и есть в интернете. Вкратце для незнающих эти порты для хождения почты и работы веб интерфейсов.

Что бы сохранить правила делаем:

apt install iptables-persistent
netfilter-persistent save

Настройка веб-сервера: Apache2 + PHP + MariaDB

Устанавливаем apache2 и включаем автозапуск:

apt install apache2
systemctl enable apache2

Проверить работу сервера можно перейдя по ссылке http://<IP-адрес сервера>. Видите эту картинку? Значит все супер, движемся дальше.

Информационная страница
Информационная страница

Устанавливаем php и php-fpm и делаем автозапуск:

apt install php7.4 php7.4-fpm
systemctl enable php7.4-fpm

php7.4-fpm зависит от используемой версии php, проверить версию можно так php -v.

Ставим доп.компоненты для php:

apt install php7.4-mysql php7.4-mbstring php7.4-imap libapache2-mod-php7.4

Для применения перезапускаем:

systemctl restart php7.4-fpm

Чтобы проверить работоспособность php создаем файл:

nano /var/www/html/index.php

вписываем в файл строку

<?php phpinfo(); ?>

Проверить работу можно перейдя по ссылке http://<IP-адрес сервера>/index.php Видите эту картинку? Значит все супер, движемся дальше.

Информационная страница
Информационная страница

Устанавливаем сервер баз данных и делаем автозапуск:

apt install mariadb-server
systemctl enable mariadb

Задаем пароль для пользователя root:

mysqladmin -u root password

Установка и настройка PostfixAdmin

Скачиваем PostfixAdmin:

wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz

Создать каталог postfixadmin и распаковать в него архив:

mkdir /var/www/html/postfixadmin
tar -C /var/www/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1

Создать каталог templates_c внутри папки postfixadmin (нужен для запуска установки):

mkdir /var/www/html/postfixadmin/templates_c

Задаем права на каталог:

chown -R www-data:www-data /var/www/html/postfixadmin

php-fpm по умолчанию, запускается от пользователя www-data.

Создать базу данных postfix и учетную запись:

mysql -u root -p
> CREATE DATABASE postfixmail DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
> GRANT ALL ON postfixmail.* TO 'postfixmail'@'localhost' IDENTIFIED BY 'password123456';

postfixmail — Имя базы. Можете задать свое имя

postfixmail — Имя учетной записи Можете задать свое имя;

password123456 — Пароль. Можете задать свой;

localhost разрешает подключение только с локального сервера.

Выходим из MariaDB:

> quit;

Создаем конфигурационный файл postfixadmin:

nano /var/www/html/postfixadmin/config.local.php

И добавляем туда:

<?php

$CONF['configured'] = true;
$CONF['default_language'] = 'ru';
$CONF['database_name'] = 'postfixmail';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = '
postfixmail';
$CONF['database_password'] = '
password123456';
$CONF['emailcheck_resolve_domain']='NO';

?>

В браузере вводим адрес http://<IP-адрес сервера>/postfixadmin/public/setup.php

Задаем пароль установки и генерируем хэш

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-4

Всю получившуюся строку нужно скопировать

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-5

Вставить ее необходимо в файл в самый низ до закрывающей скобки:

nano /var/www/html/postfixadmin/config.local.php
Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-6

Перезагружаем страницу http://<IP-адрес сервера>/postfixadmin/public/setup.php — появится форма ввода пароля. Как вы могли понять, пароль вводите, который вводили на предыдущем шаге.

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-7

Будет выполнена установка PostfixAdmin.

По итогу не должно быть никаких ошибок, но если вдруг они будут, то на экране будет видно чего не хватает системе и нужно будет просто доустановить.

Пример ошибок
Пример ошибок

Решения ошибок со скриншота выше:

Открыть файл

nano /etc/php/7.4/apache2/php.ini

Снять комментарий со строки:

До
;extension=pdo_mysql
После
extension=pdo_mysql

После успешной установки на экране появится возможность завести суперпользователя:

Setup password — пароль с предыдущего шага;

Админ — учетная запись для входа в панель управления (например root@test.ru)

Пароль — новый пароль для создаваемой учетной записи.

Переходим в браузере на страницу http://<IP-адрес сервера>/postfixadmin/public/login.php

Вводим логин и пароль только что созданные и попадаем в панель управления.

Установка и настройка Postfix

Ставим программу и зависимости командой:

apt install postfix postfix-mysql

В процессе появится окно «Postfix Configuration» — оставляем Internet Site:

В следующем окне оставляем имя сервера и нажимаем Enter.

После установки создаем учетную запись, от которой мы будем работать с каталогом виртуальных почтовых ящиков:

groupadd -g 1024 mail
useradd -d /mail -g 1024 -u 1024 mail -m

/mail — в данной папке будет храниться почта. В вашем случае это может быть совершенно другая папка. У меня это отдельный RAID массив с примонтированной папкой /mail.

Задаем владельца

chown mail:mail /mail

Приводим строки к такому виду:

mydestination = localhost.$mydomain, localhost, localhost.localdomain
inet_protocols = ipv4
smtpd_tls_cert_file = /etc/ssl/mail/cert.pem
smtpd_tls_key_file = /etc/ssl/mail/cert.key
myhostname = mail.test.ru
  • smtpd_tls_cert_file — путь и названия сертификатов у вас могут отличаться.
  • smtpd_tls_key_file — путь и названия сертификатов у вас могут отличаться.
  • mail.test.ru - в вашем случае FQDN имя введенное в самом начале статьи.

в конфигурационном файле:

nano /etc/postfix/main.cf

В конец этого же файла допишем следующее:

virtual_mailbox_base = /mail
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1024
virtual_uid_maps = static:1024
virtual_gid_maps = static:1024
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_helo_required = yes

Создать файл с настройками обращения к базе с алиасами:

nano /etc/postfix/mysql_virtual_alias_maps.cf

user = postfixmail
password = password123456
hosts = localhost
dbname = postfixmail
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

postfixmail — Имя ранее созданной базы

postfixmail — Имя ранее созданной учетной записи

password123456 — Пароль ранее созданный

Создать файл с инструкцией получения данных по виртуальным доменам:

nano /etc/postfix/mysql_virtual_domains_maps.cf

user = postfixmail
password = password123456
hosts = localhost
dbname = postfixmail
query = SELECT domain FROM domain WHERE domain='%u'

Файл с почтовыми ящиками:

nano /etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfixmail
password = password123456
hosts = localhost
dbname = postfixmail
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

Дописать в конце в файле master.cf:

nano /etc/postfix/master.cf

submission   inet  n  -  n  -  -  smtpd
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=/var/spool/postfix/private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname

smtps   inet  n  -  n  -  -  smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

dovecot   unix  -  n  n  -  -  pipe
  flags=DRhu user=mail:mail argv=/usr/lib/dovecot/deliver -d ${recipient}

Генерируем сертификаты безопасности. Либо приобретаем готовые у своего хостинг провайдера.

Создаем папку:

mkdir -p /etc/ssl/mail

В моем случае я покупал готовый SSL сертификат у провайдера timeweb за 999 рублей. Готовые файлы поместил в папку /etc/ssl/mail

Если вы не готовы покупать, то делаем следующие шаги. Учитывайте что сгенерированные сертификаты не пройдут все проверки безопасности.

Команда для генерации:

openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mail/cert.pem -keyout /etc/ssl/mail/cert.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT/CN=test.mail.ru"

Включаем автозапуск postfix и делаем перезагрузку сервиса:

systemctl enable postfix
systemctl restart postfix

Настройка Dovecot

Устанавливаем Dovecot с зависимостями для баз данных:

apt install dovecot-imapd dovecot-pop3d dovecot-mysql

Меняем способ хранения сообщений:

nano /etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/mail/%d/%u/

конфигурируем слушателя для аутентификации:

nano /etc/dovecot/conf.d/10-master.conf

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = mail
    group = mail
  }
}

service stats {
    unix_listener stats-reader {
        user = mail
        group = mail
        mode = 0660
    }
    unix_listener stats-writer {
        user = mail
        group = mail
        mode = 0660
    }
}

Настройка аутентификации в Dovecot:

nano /etc/dovecot/conf.d/10-auth.conf

#!include auth-system.conf.ext
!include auth-sql.conf.ext

Настройка шифрования:

nano /etc/dovecot/conf.d/10-ssl.conf

ssl = required
ssl_cert = </etc/ssl/mail/cert.pem
ssl_key = </etc/ssl/mail/cert.key

Настройка создания каталогов подключения к почте:

nano /etc/dovecot/conf.d/15-lda.conf

lda_mailbox_autocreate = yes

Подключение к базе данных:

nano /etc/dovecot/conf.d/auth-sql.conf.ext

passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
}

Редактируем файл работы с базой данных:

nano /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfixmail user=postfixmail password=password123456
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'

Настройка слушателя dovecot:

nano /etc/dovecot/dovecot.conf

listen = *

Включаем автозапуск dovecot и делаем перезагрузку:

systemctl enable dovecot
systemctl restart dovecot

Обязательно делаем перезагрузку всего сервера

reboot

Проверка почты

В браузере заходим в админку postfixadmin

Переходим в Список доменов и создаем новый домен. В вашем случае будет не test.local, а ваше доменное имя.

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-9

Далее переходим в Обзор и создаем тестовый ящик.

Для проверки можно использовать, MS Outlook, Mozilla Thunderbird и другие подобные программы.

Сервер: имя сервера или его IP-адрес (если указывать IP, то сертификат не будет работать).

IMAP: 143 без шифрования или 993 с шифрованием

POP3: 110 без шифрования или 995 с шифрованием

SMTP: 25 без шифрования или 465 с шифрованием

Устанавливаем и настраиваем веб клиент Roundcube

Вы можете установить себе другой веб клиент например, rainloop, AfterLogic WebMail Lite и другие. В моем случае рассмотрим именно roundcube.

Скачиваем программу:

wget https://github.com/roundcube/roundcubemail/releases/download/1.2.11/roundcubemail-1.2.11-complete.tar.gz

Создаем папку для размещения пограммы:

mkdir /var/www/html/webmail

Делаем распаковку в эту папку:

tar -C /var/www/html/webmail -xvf roundcubemail-*.tar.gz --strip-components 1

Копируем шаблон конфига и редактируем его:

cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php
nano /var/www/html/webmail/config/config.inc.php

$config['db_dsnw'] = 'mysql://webint:password123456@localhost/roundcubemail';
$config['enable_installer'] = true;

webint:password123456 — логин и пароль для доступа к базе данных

localhost — сервер базы данных

roundcubemail — имя базы данных.


$config['smtp_pass'] = '';

Прописываем папки в этом же конфиге:

$config['drafts_mbox'] = 'Drafts';
$config['junk_mbox'] = 'Junk';
$config['sent_mbox'] = 'Sent';
$config['trash_mbox'] = 'Trash';
$config['create_default_folders'] = true;

Задаем владельца apache на папку портала:

chown -R www-data:www-data /var/www/html/webmail

Создаем базу roundcubemail:

mysql -uroot -p

Если на этапе входа под рутом схватили подобную ошибку

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-10

Для решения выполняйте следующие рекомендации:

Останавливаем сервис mysql:

systemctl stop mysql

Запускаем сервис без загрузки таблиц предоставления или включения сети:

mysqld_safe --skip-grant-tables --skip-networking &

Теперь проваливаемся под рутом без пароля:

mysql -u root

Обновляем данные о привилегиях:

FLUSH PRIVILEGES;

Задаем новый пароль пользователю root:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password123456';
где password123456 - ваш новый пароль

Выходим:

quit;

Останавливаем запущенный сервис mysql:

kill `cat /var/run/mysqld/mysqld.pid`

Запускаем в обычном режиме mysql:

systemctl start mysql

Теперь заходим под рутом и не видим никакой ошибки:

mysql -uroot -p

> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

> GRANT ALL PRIVILEGES ON roundcubemail.* TO webint@localhost IDENTIFIED BY 'password123456';

> quit

Прогружаем данные:

mysql -uroot -p roundcubemail < /var/www/html/webmail/SQL/mysql.initial.sql

Ставим допы для Roundcube:

apt install php-pear php-intl php-ldap php-net-smtp php-gd php-imagick php-zip php-curl
apt install php-dev libmcrypt-dev
pecl channel-update pecl.php.net
pecl install mcrypt-1.0.4

Создать файл настройки:

nano /etc/php/7.4/fpm/conf.d/99-mcrypt.ini

extension=mcrypt.so

В конфиге php:

nano /etc/php/7.4/fpm/php.ini

date.timezone = "Europe/Moscow"
post_max_size = 70M
upload_max_filesize = 70M

В моем случае разрешение на файлы 70 мегабайт, вы можете изменить как вам нужно

Перезагружаем php-fpm:

systemctl restart php7.4-fpm

Настроим apache2:

nano /etc/php/7.4/apache2/php.ini

upload_max_filesize = 70M

post_max_size = 70M

Перезагружаем apache2:

systemctl restart apache2

В моем случае разрешение на файлы 70 мегабайт, вы можете изменить как вам нужно

Открываем браузер и переходим по адресу http://<IP-адрес сервера>/webmail/installer/. В самом низу нажимаем по кнопке Next. Если кнопка будет неактивна, проверяем, что нет ошибок (NOT OK).

На следующей странице проверяем, что все пункты находятся в состоянии OK. Установка выполнена.

Редактируем конфиг roundcube:

nano /var/www/html/webmail/config/config.inc.php

$config['enable_installer'] = false;

Удаляем папку с установочными скриптами:

rm -rf /var/www/html/webmail/installer

И заходим в браузере по адресу http://<IP-адрес сервера>/webmail/. Вводим в качестве логина адрес почты созданного пользователя и его пароль. Если все прошло успешно, то вы молодец, но впереди еще работа по защите.

Если к этому моменту у вас закончился чай и печеньки, можно сходить развеяться и налить себе еще чаю.

Установка и настройка Clamav + Amavisd

Ставим все необходимое:

apt install amavisd-new clamav clamav-daemon spamassassin

Добавляем пользователя clamav в группу amavis:

usermod -a -G amavis clamav

редактируем конфиг amavis:

nano /etc/amavis/conf.d/15-content_filter_mode

убираем комменты:
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Далее редактируем:

nano /etc/amavis/conf.d/50-user

Нужно добавить

$allowed_header_tests{'multiple'} = 0;
$allowed_header_tests{'missing'} = 0;

Включаем автозапуск и перезагружаем:

systemctl enable clamav-daemon clamav-freshclam amavis
systemctl restart amavis clamav-daemon clamav-freshclam

Делаем изменения в postfix:

nano /etc/postfix/main.cf

content_filter = scan:[127.0.0.1]:10024

Так же тут master.cf:

nano /etc/postfix/master.cf

scan   unix  -  -  n  -  16  smtp
  -o smtp_send_xforward_command=yes
  -o smtp_enforce_tls=no

127.0.0.1:10025   inet  n  -  n  -  16  smtpd
  -o content_filter=
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks_style=host
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Перезапуск postfix:

systemctl restart postfix

Включаем автообновление антиспама:

sa-update --nogpg --verbose
crontab -e
00 0 * * * /usr/bin/sa-update

00 0 - Время 0 часов 00 минут, вы выставляете нужное вам

Тестируем

Содержание в сообщении ниже:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Нужно отправить на вашу тестовую почту.

Лучше это делать через telnet, информацию найти можно в интернете как отправлять письма через telnet.

Письмо не доставится, в логе (/var/log/maillog) будет нечто следующее:

... amavis[17688]: (17688-04) Blocked INFECTED (Eicar-Signature) {DiscardedOutbound,Quarantined}, MYNETS LOCAL ...
... relay=127.0.0.1[127.0.0.1]:10024, delay=0.25, delays=0.19/0/0/0.06, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=17688-04 - INFECTED: Eicar-Signature)

Второй тест контентный:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

В логах будет:

... amavis[17689]: (17689-04) Blocked SPAM {DiscardedOutbound,Quarantined}, MYNETS LOCAL ...
... status=sent (250 2.7.0 Ok, discarded, id=17689-04 - spam)

Отдельные ящики для спама и вирусов

В конфиге:

nano /etc/amavis/conf.d/50-user

прописываем:

$spam_quarantine_to = "spam\@test.ru";
$virus_quarantine_to = "virus\@test.ru";

@test.ru - в вашем случае ваш домен.

перезапуск amavis:

systemctl restart amavis

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

Антиспам Postfix

В конфиге main.cf:

nano /etc/postfix/main.cf

Комментируем строку:

# smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

вписываем:

smtpd_client_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_unauth_pipelining
        permit

smtpd_helo_restrictions =
        permit

smtpd_sender_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_non_fqdn_sender
        reject_unknown_sender_domain
        permit

smtpd_relay_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        defer_unauth_destination

smtpd_recipient_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_non_fqdn_recipient
        reject_unauth_destination
        reject_unknown_recipient_domain
        reject_unverified_recipient
        permit

smtpd_data_restrictions =
        permit

smtpd_end_of_data_restrictions =
        permit

smtpd_recipient_restrictions =
        ...
        reject_unknown_client_hostname
        reject_invalid_helo_hostname
        reject_non_fqdn_helo_hostname
        reject_unknown_helo_hostname
        reject_rbl_client bl.spamcop.net
        reject_rbl_client cbl.abuseat.org
        reject_rbl_client dul.ru
        reject_rbl_client dnsbl.abuse.ch
        permit

Перезагрузка Postfix:

systemctl restart postfix

Обучение антиспама

sa-learn --spam /mail/test.local/*/{.\&BCEEPwQwBDw-,.Spam,.Junk\ E-mail,.Junk}/cur

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

Убрать некорректные срабатывания можно так.

sa-learn --ham /mail/test.local/spam\@test.local/.Ham/cur

Статистика по обучению спама:

sa-learn --dump magic

Выводим почту во внешку

1. rDNS

Для создания записи пишите или звоните в поддержку вашего провайдера и просите его сделать данную запись, предоставив ему информацию из команды

postconf -n myhostname

или

hostname

2. А-запись

Настраивается на вашем хостинге. Выглядит примерно так

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-11

3. SPF запись

Настраивается на вашем хостинге. Выглядит примерно так

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-12

4. DMARC запись

Настраивается на вашем хостинге. Выглядит примерно так

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-13

5. DKIM запись

Создать папку для ключей:

mkdir -p /var/lib/dkim

Генерируем последовательность:

amavisd-new genrsa /var/lib/dkim/test.ru.pem 1024

test.ru — указать ваш домен

Ставим нужные права:

chown amavis:amavis /var/lib/dkim/*.pem
chmod 0400 /var/lib/dkim/*.pem

в конфиге amavisd редактируем:

nano /etc/amavis/conf.d/20-debian_defaults

#$inet_socket_port = 10024;
$inet_socket_port = [10024,10026];

$forward_method = 'smtp:[127.0.0.1]:10025';
$notify_method = $forward_method;
$interface_policy{'10026'} = 'ORIGINATING';
$policy_bank{'ORIGINATING'} = {
    originating => 1,
    smtpd_discard_ehlo_keywords => ['8BITMIME'],
    os_fingerprint_method => undef,
    bypass_banned_checks_maps => [1],
    bypass_header_checks_maps => [1],
    bypass_banned_checks_maps => [1],
    virus_admin_maps => ["virusalert\@$mydomain"],
};

В файле 50-user добавляем:

nano /etc/amavis/conf.d/50-user

$enable_dkim_verification = 1;
$enable_dkim_signing = 1;

dkim_key('test.ru', "dkim", "/var/lib/dkim/test.ru.pem");
@dkim_signature_options_bysender_maps = ( {
   "test.ru" => { d => "test.ru", a => 'rsa-sha256', ttl => 10*24*3600 },
});

test.ru — указать ваш домен

Перезапускаем amavis:

systemctl restart amavis

Если перезапуск выдает ошибку подобного содержания

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-14

То заходим в

nano /etc/amavis/conf.d/05-node_id

И снимаем коммент со строки:

#$myhostname = "mail.test.ru";
$myhostname = "mail.test.ru";
где mail.test.ru - ваш домен

После этого снова выполняем команду

systemctl restart amavis

и получаем такой результат

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-15

Проверить DKIM последовательность для домена можно так:

amavisd-new showkeys

будет что-то вроде этого:

; key#1 1024 bits, i=dkim, d=test.ru, /var/lib/dkim/test.ru.pem
dkim._domainkey.test.ru.        3600 TXT (
  "v=DKIM1; p="
  "VIDfMA0kh1jVbGBwY2Nx3IgEMgCNRDCRiQKBgQC23iOK+39mYBxsnIl1Jo8n/Heg"
  "x6eMYXsp1unAdo2EBAQUAA4CNRDCRiQKBgQC23iOK+39mYBxsnIl1Jo8n/Heg"
  "x6eMA0kh1jVbGBZrREVZYTEAQUAA4CNRh1jVbGBZrREVZYTE+uPOwtAbXEeRLG/Vz5"
  "zyQuIRDCRiQKBgQC23iOQAB")

Теперь нужно на хостинге прописать эти данные. Выглядит примерно так

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-16

Проверяем настройки DKIM

amavisd-new testkeys

Донастраиваем postfix:

nano /etc/postfix/master.cf

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=scan:[127.0.0.1]:10026

submission   inet  n  -  n  -  -  smtpd
  -o content_filter=scan:[127.0.0.1]:10026

smtps   inet  n  -  n  -  -  smtpd
  -o content_filter=scan:[127.0.0.1]:10026

127.0.0.1:10027   inet  n  -  n  -  16  smtpd
  -o content_filter=
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks_style=host
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Перезапускаем postfix:

systemctl restart postfix

Настраиваем Roundcube:

nano /var/www/html/webmail/config/config.inc.php

Строки

$config['smtp_server'] = '';
$config['smtp_port'] = 25;

заменить на

$config['smtps_server'] = 'ssl://localhost';
$config['smtps_port'] = 465;

Проверить сервер можно тут:

Настройка квот почты

В файле10-mail.conf:

nano /etc/dovecot/conf.d/10-mail.conf

снимаем коммент или прописываем строку
mail_plugins = $mail_plugins quota

В файле 20-imap.conf:

nano /etc/dovecot/conf.d/20-imap.conf

Снимаем комментарий или прописываем строку

protocol imap {
  mail_plugins = $mail_plugins imap_quota
}

В файле 10-master.conf:

nano /etc/dovecot/conf.d/10-master.conf

редактируем строки как показано ниже:

service dict {
    unix_listener dict {
    mode = 0660
    user = mail
    group = mail
  }
}

user и group - это все те же что создавались ранее вами.

В файле 90-quota.conf:

nano /etc/dovecot/conf.d/90-quota.conf

Добавляем строки или убираем коммент с них:

plugin {
  quota = dict:User quota::proxy::quota
}

В файле dovecot.conf:

nano /etc/dovecot/dovecot.conf

Убираем коммент или добавляем строки:

dict {
  quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}

В файле dovecot-dict-sql.conf.ext:

nano /etc/dovecot/dovecot-dict-sql.conf.ext

Прописываем настройки:

connect = host=localhost dbname=postfixmail user=postfixmail password=password123456
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}

Редактируем или дописываем в файле dovecot-sql.conf.ext:

nano /etc/dovecot/dovecot-sql.conf.ext

user_query = SELECT CONCAT('/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u'

Проверяем конфигурационный файл dovecot:

doveconf

если нет ошибок, делаем рестарт:

systemctl restart dovecot

Проверка работы квот

Для проверки используем команду:

doveadm quota get -u test@test.ru

test@test.ru - Эти данные меняйте на ваш нужный почтовый ящик

Прописывать квоты нужно в веб интерфейсе в каждый почтовый ящик

Прежде чем начнем основной разбор процесса установки и настройки, запаситесь чаем и печеньками, ведь статья будет длинной и интересной.-17

Информирование при превышении квот

В файле 90-quota.conf:

nano /etc/dovecot/conf.d/90-quota.conf

Редактируем строки:

plugin {
  quota_warning = storage=95%% quota-warning 95 %u
  quota_warning2 = storage=80%% quota-warning 80 %u
}

Можете указать свои значения превышения

В разделе service quota-warning редактируем все как ниже:

service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  user = dovecot
  unix_listener quota-warning {
    user = mail
  }
}

Скрипт оповещения quota-warning.sh:

nano /usr/local/bin/quota-warning.sh

cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $2 -o "plugin/quota=maildir:User quota:noenforcing"
Content-Type: text/html; charset=utf-8
From: Администратор почты <admin@test.ru>
Subject: Предупреждение о превышении квоты на почтовый ящик
X-Priority: 2

<p>Размер Вашего почтового ящика $1% от установленного ограничения.<br>
Удалите большие письма с вложениями, сделайте архивацию или обратитесь за помощью в ИТ отдел.</p>
EOF

admin@test.ru - Указывайте свою админскую почту.

Прописываем права на файл:

chmod +x /usr/local/bin/quota-warning.sh

Тестируем скрипт:

/usr/local/bin/quota-warning.sh 80 test@test.ru

Вместо test@test.ru - пишите свой ящик

Рестарт dovecot:

systemctl restart dovecot

Для любителей Outlook переводим папки на русский

Редактируем файл 15-mailboxes.conf:

nano /etc/dovecot/conf.d/15-mailboxes.conf

В блоке namespace inbox редактируем:

namespace inbox {
  mailbox Черновики {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Drafts {
    auto = no
    special_use = \Drafts
  }
  mailbox Спам {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Junk {
    auto = no
    special_use = \Junk
  }
  mailbox Spam {
    auto = no
    special_use = \Junk
  }
  mailbox "Junk E-mail" {
    auto = no
    special_use = \Junk
  }
  mailbox Удаленные {
    auto = subscribe
    special_use = \Trash
  }
  mailbox Trash {
    auto = no
    special_use = \Trash
  }
  mailbox "Deleted Messages" {
    auto = no
    special_use = \Trash
  }
  mailbox Отправленные {
    auto = subscribe
    special_use = \Sent
  }
  mailbox Sent {
    auto = no
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    auto = no
    special_use = \Sent
  }
  mailbox "Sent Items" {
    auto = no
    special_use = \Sent
  }
}

Имейте ввиду что если вы пользуетесь с одного почтового ящика и Outlook и web интерфейсом, то у вас будет отображаться в Outlook и русские папки и английские, в английские будут валиться письма с web интерфейса, а в русские будут из Outlook.

Для применения настроек перезапускаем dovecot:

systemctl restart dovecot

Настройка ограничения вложений

Начнем с:

nano /etc/postfix/main.cf

* для FreeBSD путь будет /usr/local/etc/postfix/main.cf.

Размер почтового ящика

Для установки квоты на почтовые ящики редактируем следующее:

mailbox_size_limit = 734003200
virtual_mailbox_limit = 734003200
message_size_limit = 73400320

Я ставлю 70 МБ - в файле это выглядит все в байтах как 734003200

Если не нужны ограничения, ставим 0:

После редактирования применяем изменения:

systemctl reload postfix

Далее в файле:

nano /etc/php/7.4/apache2/php.ini

Находим и редактируем

post_max_size = 70M

upload_max_filesize = 70M

И не забываем о перезапуске

systemctl restart apache2

Возможные ошибки и их решения

ошибка запуска apache2
ошибка запуска apache2

решается данная проблема одной-двумя командами, в зависимости что указано в выводе ошибки

a2enmod rewrite
a2enmod ssl

Если не отправляются вложения из веб интерфейса Roundcube:

Нужно отредактировать конфиг

nano /var/www/html/webmail/config/config.inc.php

добавив в него строку

$config['temp_dir'] = '/tmp/';

Если вы дочитали до конца, я вас искренне поздравляю, у вас получился отличный работоспособный почтовый сервис. Теперь остается только обслуживать его и доделывать что-то если обнаружили нехватку например автоматической настройки почты через autodiscover и другие возможности. Так же не забывайте что нужно сделать резервный сервер на случай проблем с основным. Об этих настройках я расскажу в следующих своих статьях.

Всем удачи и огромное спасибо за прочтение.