мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
manuals:mail_server_from_scratch [2024/06/24 13:03] – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1manuals:mail_server_from_scratch [2024/06/24 13:05] (текущий) – ↷ Операцией перемещения обновлены ссылки Администратор
Строка 1: Строка 1:
 +===== Почтовый сервер с нуля =====
  
 +Разберем настройку на базе операционной системы (далее - ОС) Ubuntu 20.04. <note tip>Все действия можно выполнять сразу под root, либо постоянно вначале каждой команды писать sudo и вводить пароль.</note> <note warning>Так же обращаю внимание, что в тексте будут строки, для внесения изменений в конфигурационные файлы. Удалять лишнее если я об этом не пишу, не нужно. Только редактируем и добавляем то что читаете.</note>
 +
 +==== Предварительная подготовка ====
 +
 +=== Обновление ОС ===
 +
 +<code>apt update</code>
 +<code>apt upgrade</code>
 +
 +=== Важно переименовать сервер т.к. многие анти спам системы проверяют, обращение к серверу по имени ===
 +
 +<code>hostnamectl set-hostname mail.fellk.ru</code>
 +
 +=== Настройка синхронизации времени ===
 +
 +<code>apt install chrony</code>
 +<code>timedatectl set-timezone Europe/Moscow</code>
 +<code>systemctl enable chrony</code>
 +
 +=== Открываем порты с помощью iptables ===
 +
 +<code>iptables -I INPUT 1 -p tcp --match multiport --dports 25,110,143,465,587,993,995 -j ACCEPT</code>
 +<code>iptables -I INPUT 1 -p tcp --match multiport --dports 80,443 -j ACCEPT</code>
 +
 +=== Что бы сохранить правила делаем ===
 +
 +<code>apt install iptables-persistent</code>
 +<code>netfilter-persistent save</code>
 +
 +==== Настройка веб-сервера: Apache2 + PHP + MariaDB ====
 +
 +=== Устанавливаем apache2 и включаем автозапуск ===
 +
 +<code>apt install apache2</code>
 +<code>systemctl enable apache2</code>
 +Проверить работу сервера можно перейдя по ссылке [[http://10.0.1.18|http://10.0.1.18]]
 +
 +Видите эту картинку?
 +
 +{{:manuals:pasted:20230522-071140.png?nolink}}
 +
 +Значит все супер, движемся дальше.
 +
 +=== Устанавливаем php и php-fpm и делаем автозапуск ===
 +
 +<code>apt install php8.1 php8.1-fpm</code>
 +<code>systemctl enable php8.1-fpm</code>
 +
 +проверить версию можно так 
 +
 +<code>php -v</code>
 +
 +=== Ставим доп.компоненты для php ===
 +
 +<code>apt install php8.1-mysql php8.1-mbstring php8.1-imap libapache2-mod-php8.1</code>
 +
 +=== Для применения перезапускаем ===
 +
 +<code>systemctl restart php8.1-fpm</code>
 +
 +=== Чтобы проверить работоспособность php создаем файл ===
 +
 +<code>nano /var/www/html/index.php</code>
 +
 +вписываем в файл строку
 +
 +  <?php phpinfo(); ?>
 +
 +Проверить работу можно перейдя по ссылке [[http://10.0.1.18/index.php|http://10.0.1.18/index.php]] 
 +
 +Видите эту картинку?
 +
 +{{:manuals:pasted:20230925-072123.png?nolink?nolink}}
 +
 +Значит все супер, движемся дальше.
 +
 +=== Устанавливаем сервер баз данных и делаем автозапуск ===
 +
 +<code>apt install mariadb-server</code>
 +<code>systemctl enable mariadb</code>
 +
 +Задаем пароль для пользователя root:
 +
 +<code>mysqladmin -u root password</code>
 +
 +==== Установка и настройка PostfixAdmin ====
 +
 +=== Скачиваем PostfixAdmin ===
 +
 +<code>wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz</code>
 +
 +=== Создать каталог postfixadmin и распаковать в него архив ===
 +
 +<code>mkdir /var/www/html/postfixadmin</code>
 +<code>tar -C /var/www/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1</code>
 +
 +=== Создать каталог templates_c внутри папки postfixadmin (нужен для запуска установки) ===
 +
 +<code>mkdir /var/www/html/postfixadmin/templates_c</code>
 +
 +=== Задаем права на каталог ===
 +
 +<code>chown -R www-data:www-data /var/www/html/postfixadmin</code>
 +
 +<note tip>php-fpm по умолчанию, запускается от пользователя www-data</note>
 +
 +=== Создать базу данных postfix и учетную запись ===
 +
 +<note><code>mysql -u root -p</code>
 +
 +<code>CREATE DATABASE fellk DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;</code>
 +<code>GRANT ALL ON fellk.* TO 'fellk'@'localhost' IDENTIFIED BY 'Ваш пароль';</code>
 +<code>quit;</code>
 +<note tip>localhost разрешает подключение только с локального сервера.</note>
 +</note>
 +
 +=== Создаем конфигурационный файл postfixadmin ===
 +
 +<code>nano /var/www/html/postfixadmin/config.local.php</code>
 +
 +И добавляем туда
 +<code>
 +<?php
 +
 +$CONF['configured'] = true;
 +$CONF['default_language'] = 'ru';
 +$CONF['database_password'] = 'password123456';
 +$CONF['emailcheck_resolve_domain']='NO';
 +
 +?>
 +</code>
 +В браузере вводим адрес http://10.0.1.18/postfixadmin/public/setup.php
 +
 +=== Задаем пароль установки и генерируем хэш ===
 +
 +{{:manuals:pasted:20230522-075540.png?nolink}}
 +
 +Вставить ее необходимо в файл в самый низ до закрывающей скобки
 +
 +<code>nano /var/www/html/postfixadmin/config.local.php</code>
 +
 +{{:manuals:pasted:20230925-072659.png?nolink}}
 +
 +Перезагружаем страницу http://10.0.1.18/postfixadmin/public/setup.php — появится форма ввода пароля.
 +Как вы могли понять, пароль вводите, который вводили на предыдущем шаге.
 +
 +{{:manuals:pasted:20230522-075757.png?nolink}}
 +
 +Будет выполнена установка PostfixAdmin.
 +По итогу не должно быть никаких ошибок, но если вдруг они будут, то на экране будет видно чего не хватает системе и нужно будет просто доустановить.
 +
 +=== После успешной установки на экране появится возможность завести суперпользователя ===
 +
 +<note tip>Setup password — пароль с предыдущего шага;
 +
 +Админ — root@fellk.ru
 +
 +Пароль — новый пароль для создаваемой учетной записи
 +
 +Переходим в браузере на страницу http://10.0.1.18/postfixadmin/public/login.php
 +
 +Вводим логин и пароль только что созданные и попадаем в панель управления.</note>
 +
 +==== Установка и настройка Postfix ====
 +
 +=== Ставим программу и зависимости командой ===
 +
 +<code>apt install postfix postfix-mysql</code>
 +В процессе появится окно «Postfix Configuration» — оставляем Internet Site:
 +В следующем окне оставляем имя сервера и нажимаем Enter.
 +
 +=== После установки создаем учетную запись, от которой мы будем работать с каталогом виртуальных почтовых ящиков ===
 +
 +<code>groupadd -g 1024 mail</code>
 +<code>useradd -d /mail -g 1024 -u 1024 mail -m</code>
 +
 +=== Задаем владельца ===
 +
 +<code>chown mail:mail /mail</code>
 +
 +=== Приводим строки к такому виду ===
 +В файле
 +<code>nano /etc/postfix/main.cf</code>
 +<code>
 +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.fellk.ru
 +</code>
 +<note tip>
 +smtpd_tls_cert_file — путь и названия сертификатов у вас могут отличаться.
 +
 +smtpd_tls_key_file — путь и названия сертификатов у вас могут отличаться.
 +</note>
 +
 +=== В конец этого же файла допишем следующее ===
 +<code>
 +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
 +</code>
 +
 +=== Создать файл с настройками обращения к базе с алиасами ===
 +
 +<code>nano /etc/postfix/mysql_virtual_alias_maps.cf</code>
 +<note tip>
 +
 +user = root
 +
 +password = Ваш пароль
 +
 +hosts = localhost
 +
 +dbname = fellk
 +
 +query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
 +
 +</note>
 +
 +=== Создать файл с инструкцией получения данных по виртуальным доменам ===
 +
 +<code>nano /etc/postfix/mysql_virtual_domains_maps.cf</code>
 +
 +<note tip>
 +
 +user = root
 +
 +password = Ваш пароль
 +
 +hosts = localhost
 +
 +dbname = fellk
 +
 +query = SELECT domain FROM domain WHERE domain='%u'
 +
 +</note>
 +
 +=== Файл с почтовыми ящиками ===
 +
 +<code>nano /etc/postfix/mysql_virtual_mailbox_maps.cf</code>
 +
 +<note tip>
 +
 +user = root
 +
 +password = Ваш пароль
 +
 +hosts = localhost
 +
 +dbname = fellk
 +
 +query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
 +
 +</note>
 +
 +=== Дописать в конце в файле master.cf ===
 +
 +<code>nano /etc/postfix/master.cf</code>
 +<code>
 +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}
 +</code>
 +
 +=== Генерируем сертификаты безопасности. Либо приобретаем готовые у своего хостинг провайдера ===
 +
 +Создаем папку
 +
 +<code>mkdir -p /etc/ssl/mail</code>
 +SSL сертификат куплен у провайдера timeweb за 999 рублей. Готовые файлы поместил в папку /etc/ssl/mail
 +
 +=== Команда для генерации ===
 +
 +<code>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=mail.fellk.ru"</code>
 +
 +=== Включаем автозапуск postfix и делаем перезагрузку сервиса ===
 +
 +<code>systemctl enable postfix</code>
 +<code>systemctl restart postfix</code>
 +
 +==== Настройка Dovecot ====
 +
 +=== Устанавливаем Dovecot с зависимостями для баз данных ===
 +
 +<code>apt install dovecot-imapd dovecot-pop3d dovecot-mysql</code>
 +
 +=== Меняем способ хранения сообщений ===
 +
 +<code>nano /etc/dovecot/conf.d/10-mail.conf</code>
 +<code>mail_location = maildir:/mail/%d/%u/</code>
 +
 +=== конфигурируем слушателя для аутентификации ===
 +
 +<code>nano /etc/dovecot/conf.d/10-master.conf</code>
 +<code>
 +service auth {
 +  unix_listener /var/spool/postfix/private/auth {
 +    mode = 0666
 +    user = postfixmail
 +    group = postfixmail
 +  }
 +  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
 +    }
 +}
 +</code>
 +
 +=== Настройка аутентификации в Dovecot ===
 +
 +<code>nano /etc/dovecot/conf.d/10-auth.conf</code>
 +<code>#!include auth-system.conf.ext</code>
 +<code>!include auth-sql.conf.ext</code>
 +
 +=== Настройка шифрования ===
 +
 +<code>nano /etc/dovecot/conf.d/10-ssl.conf</code>
 +<code>ssl = required</code>
 +<code>ssl_cert = </etc/ssl/mail/cert.pem</code>
 +<code>ssl_key = </etc/ssl/mail/cert.key</code>
 +
 +=== Настройка создания каталогов подключения к почте ===
 +
 +<code>nano /etc/dovecot/conf.d/15-lda.conf</code>
 +<code>lda_mailbox_autocreate = yes</code>
 +
 +=== Подключение к базе данных ===
 +
 +<code>nano /etc/dovecot/conf.d/auth-sql.conf.ext</code>
 +<code>
 +passdb {
 +  args = /etc/dovecot/dovecot-sql.conf.ext
 +}
 +
 +userdb {
 +  args = /etc/dovecot/dovecot-sql.conf.ext
 +}
 +</code>
 +
 +=== Редактируем файл работы с базой данных ===
 +
 +<code>nano /etc/dovecot/dovecot-sql.conf.ext</code>
 +<code>
 +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'
 +</code>
 +
 +=== Настройка слушателя dovecot ===
 +
 +<code>nano /etc/dovecot/dovecot.conf</code>
 +<code>listen = *</code>
 +
 +=== Включаем автозапуск dovecot и делаем перезагрузку ===
 +
 +<code>systemctl enable dovecot</code>
 +<code>systemctl restart dovecot</code>
 +
 +==== Проверка почты ====
 +
 +В браузере заходим в админку http://10.0.1.18/postfixadmin/public/login.php
 +
 +Переходим в Список доменов и создаем новый домен.
 +
 +{{:manuals:pasted:20230925-073017.png?nolink}}
 +
 +Далее переходим в Обзор и создаем тестовый ящик.
 +
 +<note tip>Для проверки можно использовать, MS Outlook, Mozilla Thunderbird и другие подобные программы.
 +
 +Сервер: имя сервера или его IP-адрес (если указывать IP, то сертификат не будет работать).
 +
 +IMAP: 143 без шифрования или 993 с шифрованием
 +
 +POP3: 110 без шифрования или 995 с шифрованием
 +
 +SMTP: 25 без шифрования или 465 с шифрованием</note>
 +
 +==== Устанавливаем и настраиваем веб клиент Roundcube ====
 +
 +<note tip>Вы можете установить себе другой веб клиент например, rainloop, AfterLogic WebMail Lite и другие. В моем случае рассмотрим именно roundcube.
 +</note>
 +
 +=== Скачиваем программу ===
 +
 +<code>wget https://github.com/roundcube/roundcubemail/releases/download/1.6.1/roundcubemail-1.6.1-complete.tar.gz</code>
 +
 +=== Создаем папку для размещения пограммы ===
 +
 +<code>mkdir /var/www/html/webmail</code>
 +
 +=== Делаем распаковку в эту папку ===
 +
 +<code>tar -C /var/www/html/webmail -xvf roundcubemail-*.tar.gz --strip-components 1</code>
 +
 +=== Копируем шаблон конфига и редактируем его ===
 +
 +<code>cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php</code>
 +<code>nano /var/www/html/webmail/config/config.inc.php</code>
 +<code>
 +
 +$config['db_dsnw'] = 'mysql://root:Ваш пароль@localhost/roundcubemail';
 +
 +$config['enable_installer'] = true;
 +
 +$config['smtp_pass'] = '';
 +
 +</code>
 +
 +=== Прописываем папки в этом же конфиге ===
 +<code>
 +
 +$config['drafts_mbox'] = 'Drafts';
 +
 +$config['junk_mbox'] = 'Junk';
 +
 +$config['sent_mbox'] = 'Sent';
 +
 +$config['trash_mbox'] = 'Trash';
 +
 +$config['create_default_folders'] = true;
 +
 +</code>
 +
 +=== Задаем владельца apache на папку портала ===
 +
 +<code>chown -R www-data:www-data /var/www/html/webmail</code>
 +
 +=== Создаем базу roundcubemail ===
 +
 +<note><code>mysql -uroot -p</code>
 +
 +<code>CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;</code>
 +
 +<code>GRANT ALL PRIVILEGES ON roundcubemail.* TO root@localhost IDENTIFIED BY 'Ваш пароль';</code>
 +
 +<code>quit;</code>
 +</note>
 +
 +=== Прогружаем данные ===
 +
 +<code>mysql -uroot -p roundcubemail < /var/www/html/webmail/SQL/mysql.initial.sql</code>
 +
 +=== Ставим допы для Roundcube ===
 +
 +<code>apt install php-pear php-intl php-ldap php-net-smtp php-gd php-imagick php-zip php-curl</code>
 +<code>apt install php-dev libmcrypt-dev</code>
 +<code>pecl channel-update pecl.php.net</code>
 +<code>pecl install mcrypt-1.0.4</code>
 +
 +=== Создать файл настройки ===
 +
 +<code>nano /etc/php/8.1/fpm/conf.d/99-mcrypt.ini</code>
 +<code>extension=mcrypt.so</code>
 +
 +=== В конфиге php ===
 +
 +<code>nano /etc/php/8.1/fpm/php.ini</code>
 +<code>
 +
 +date.timezone = "Europe/Moscow"
 +
 +post_max_size = 70M
 +
 +upload_max_filesize = 70M
 +
 +</code>
 +
 +<note tip>В моем случае разрешение на файлы 70 мегабайт, вы можете изменить как вам нужно</note>
 +
 +=== Перезагружаем php-fpm ===
 +
 +<code>systemctl restart php8.1-fpm</code>
 +
 +=== Настроим apache2 ===
 +
 +<code>nano /etc/php/8.1/apache2/php.ini</code>
 +<code>
 +
 +upload_max_filesize = 70M
 +
 +post_max_size = 70M
 +
 +</code>
 +
 +=== Перезагружаем apache2 ===
 +
 +<code>systemctl restart apache2</code>
 +
 +<note tip>В моем случае разрешение на файлы 70 мегабайт, вы можете изменить как вам нужно</note>
 +
 +Открываем браузер и переходим по адресу http://10.0.1.18/webmail/installer/.
 +В самом низу нажимаем по кнопке Next.
 +<note tip>Если кнопка будет неактивна, проверяем, что нет ошибок (NOT OK)</note>
 +На следующей странице проверяем, что все пункты находятся в состоянии OK.
 +Установка выполнена.
 +
 +=== Редактируем конфиг roundcube ===
 +
 +<code>nano /var/www/html/webmail/config/config.inc.php</code>
 +<code>$config['enable_installer'] = false;</code>
 +
 +=== Удаляем папку с установочными скриптами ===
 +
 +<code>rm -rf /var/www/html/webmail/installer</code>
 +
 +И заходим в браузере по адресу http://10.0.1.18/webmail/.
 +
 +Вводим в качестве логина адрес почты созданного пользователя и его пароль.
 +
 +Если все прошло успешно, то вы молодец, но впереди еще работа по защите.
 +
 +
 +==== Установка и настройка Clamav + Amavisd ====
 +
 +=== Ставим все необходимое ===
 +
 +<code>apt install amavisd-new clamav clamav-daemon spamassassin</code>
 +
 +=== Добавляем пользователя clamav в группу amavis ===
 +
 +<code>usermod -a -G amavis clamav</code>
 +
 +=== Редактируем конфиг amavis ===
 +
 +<code>nano /etc/amavis/conf.d/15-content_filter_mode</code>
 +<note>
 +убираем комменты:
 +<code>
 +@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);
 +</code>
 +</note>
 +
 +=== Далее редактируем ===
 +
 +<code>nano /etc/amavis/conf.d/50-user</code>
 +<note>
 +Нужно добавить
 +
 +<code>$allowed_header_tests{'multiple'} = 0;</code>
 +<code>$allowed_header_tests{'missing'} = 0;</code>
 +</note>
 +
 +=== Включаем автозапуск и перезагружаем ===
 +
 +<code>systemctl enable clamav-daemon clamav-freshclam amavis</code>
 +<code>systemctl restart amavis clamav-daemon clamav-freshclam</code>
 +
 +=== Делаем изменения в postfix ===
 +
 +<code>nano /etc/postfix/main.cf</code>
 +<code>content_filter = scan:[127.0.0.1]:10024</code>
 +
 +Так же тут master.cf
 +
 +<code>nano /etc/postfix/master.cf</code>
 +<code>
 +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
 +</code>
 +
 +=== Перезапуск postfix ===
 +
 +<code>systemctl restart postfix</code>
 +
 +=== Включаем автообновление антиспама ===
 +
 +<code>sa-update --nogpg --verbose</code>
 +<code>crontab -e</code>
 +<code>
 +00 0 * * * /usr/bin/sa-update
 +00 0 - Время 0 часов 00 минут, вы выставляете нужное вам
 +</code>
 +
 +==== Тестируем антиспам ====
 +
 +=== Содержание в сообщении ниже ===
 +
 +<code>X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*</code>
 +
 +Нужно отправить на вашу тестовую почту
 +Лучше это делать через [[poleznosti:sending_mail_telnet|telnet]]
 +
 +Письмо не доставится, в логе (/var/log/maillog) будет нечто следующее
 +<code>
 +... 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)
 +</code>
 +
 +=== Второй тест контентный ===
 +
 +<code>XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X</code>
 +
 +В логах будет
 +<code>
 +... amavis[17689]: (17689-04) Blocked SPAM {DiscardedOutbound,Quarantined}, MYNETS LOCAL ...
 +... status=sent (250 2.7.0 Ok, discarded, id=17689-04 - spam)
 +</code>
 +
 +==== Отдельные ящики для спама и вирусов ====
 +
 +=== В конфиге ===
 +
 +<code>nano /etc/amavis/conf.d/50-user</code>
 +прописываем:
 +<code>
 +
 +$spam_quarantine_to = "spam\@fellk.ru";
 +
 +$virus_quarantine_to = "virus\@fellk.ru";
 +
 +</code>
 +
 +=== Перезапуск amavis ===
 +
 +<code>systemctl restart amavis</code>
 +
 +<note important>Пробуем еще раз тестовые отправки.
 +Но предварительно у вас должны быть созданы эти почтовые ящики.</note>
 +
 +==== Антиспам Postfix ====
 +
 +=== В конфиге main.cf ===
 +
 +<code>nano /etc/postfix/main.cf</code>
 +
 +Комментируем строку
 +
 +<code># smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination</code>
 +
 +=== Вписываем ===
 +<code>
 +
 +smtpd_client_restrictions =
 +#Разрешить доступ из доверенных сетей
 +        permit_mynetworks
 +#Разрешить доступ клиентам, прошедшим процедуру аутентификации SMTP
 +        permit_sasl_authenticated
 +#Запретить некорректное использование команд конвейерной обработки
 +        reject_unauth_pipelining
 +#Разрешить доступ
 +        permit
 +
 +smtpd_helo_restrictions =
 +#Разрешить доступ
 +        permit
 +
 +smtpd_sender_restrictions =
 +#Разрешить доступ из доверенных сетей
 +        permit_mynetworks
 +#Разрешить доступ клиентам, прошедшим процедуру аутентификации SMTP
 +        permit_sasl_authenticated
 +        reject_non_fqdn_sender
 +        reject_unknown_sender_domain
 +#Разрешить доступ
 +        permit
 +
 +smtpd_relay_restrictions =
 +#Разрешить доступ из доверенных сетей
 +        permit_mynetworks
 +#Разрешить доступ клиентам, прошедшим процедуру аутентификации SMTP
 +        permit_sasl_authenticated
 +        defer_unauth_destination
 +
 +smtpd_recipient_restrictions =
 +#Разрешить доступ из доверенных сетей
 +        permit_mynetworks
 +#Разрешить доступ клиентам, прошедшим процедуру аутентификации SMTP
 +        permit_sasl_authenticated
 +#Запретить доступ, если адрес получателя сообщения имеет некорректный формат
 +        reject_non_fqdn_recipient
 +#Запретить Postfix быть открытым релеем
 +        reject_unauth_destination
 +#Запретить доступ, если для имени домена адреса получателя не существует A или MX запись в DNS
 +        reject_unknown_recipient_domain
 +#Запретить доступ, если адрес получателя не может быть проверен
 +        reject_unverified_recipient
 +#Запретить доступ клиентам, не зарегистрированным в DNS
 +        reject_unknown_client_hostname
 +#Запретить доступ, если имя хоста, содержащееся в выданном клиентом приветствии, имеет некорректный синтаксис
 + reject_invalid_helo_hostname
 +#Запретить доступ, если имя хоста, содержащееся в выданном клиентом приветствии, не является FQDN
 +        reject_non_fqdn_helo_hostname
 +#Запретить доступ, если для имени хоста, содержащемся в выданном клиентом приветствии, не существует A или MX запись в DNS
 +        reject_unknown_helo_hostname
 +######Проверить адрес сети клиента по блэклистам######
 +        reject_rbl_client zombie.dnsbl.sorbs.net,
 +        reject_rbl_client work.rsbs.express.ru,
 +        reject_rhsbl_sender dsn.rfc-ignorant.org
 +##Вызывает проблемы с отправкой и доставкой почты##        reject_rbl_client bl.spamcop.net
 +##Вызывает проблемы с отправкой и доставкой почты##        reject_rbl_client cbl.abuseat.org
 +##Вызывает проблемы с отправкой и доставкой почты##        reject_rbl_client dul.ru
 +##Вызывает проблемы с отправкой и доставкой почты##        reject_rbl_client dnsbl.abuse.ch
 +##Вызывает проблемы с отправкой и доставкой почты##     reject_rbl_client zen.spamhaus.org,
 +##Вызывает проблемы с отправкой и доставкой почты##     reject_rbl_client multihop.dsbl.org,
 +##Вызывает проблемы с отправкой и доставкой почты##     reject_rbl_client dnsbl.sorbs.net,
 +
 +#Проверить, разрешен ли адрес отправителя сообщения в файле, являющемся параметром данного ограничения
 +        check_sender_access hash:/etc/postfix/sender_access
 +#Разрешить доступ
 +        permit
 +
 +</code>
 +
 +=== Перезагрузка Postfix ===
 +
 +<code>systemctl restart postfix</code>
 +
 +==== Обучение антиспама ====
 +
 +<code>sa-learn --spam /mail/fellk.ru/*/{.\&BCEEPwQwBDw-,.Spam,.Junk\ E-mail,.Junk}/cur</code>
 +<note tip>Данная команда ищет спам в папках у пользователей и таким образом происходит обучение.</note>
 +
 +=== Убрать некорректные срабатывания можно так ===
 +
 +<code>sa-learn --ham /mail/fellk.ru/spam\@fellk.ru/.Ham/cur</code>
 +
 +=== Статистика по обучению спама ===
 +
 +<code>sa-learn --dump magic</code>
 +
 +==== Выводим почту во внешку ====
 +
 +=== rDNS ===
 +
 +<note tip>Для создания записи пишите или звоните в поддержку вашего провайдера и просите его сделать данную запись, предоставив ему информацию из команды</note>
 +
 +<code>postconf -n myhostname</code>
 +или
 +<code>hostname</code>
 +
 +=== А-запись ===
 +
 +Настраивается на вашем хостинге. Выглядит так
 +
 +{{:manuals:pasted:20230925-075250.png?nolink}}
 +
 +=== SPF запись ===
 +
 +Настраивается на вашем хостинге. Выглядит так
 +
 +{{:manuals:pasted:20230925-075307.png?nolink}}
 +
 +=== DMARC запись ===
 +
 +Настраивается на вашем хостинге. Выглядит так
 +
 +{{:manuals:pasted:20230925-075320.png?nolink}}
 +
 +=== DKIM запись ===
 +
 +Создать папку для ключей
 +
 +<code>mkdir -p /var/lib/dkim</code>
 +
 +=== Генерируем последовательность ===
 +
 +<code>amavisd-new genrsa /var/lib/dkim/fellk.ru.pem 1024</code>
 +
 +=== Ставим нужные права ===
 +
 +<code>chown amavis:amavis /var/lib/dkim/*.pem</code>
 +<code>chmod 0400 /var/lib/dkim/*.pem</code>
 +
 +=== В конфиге amavisd редактируем ===
 +
 +<code>nano /etc/amavis/conf.d/20-debian_defaults</code>
 +<code>
 +#$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"],
 +};
 +</code>
 +
 +=== В файле 50-user добавляем ===
 +
 +<code>nano /etc/amavis/conf.d/50-user</code>
 +<code>
 +$enable_dkim_verification = 1;
 +$enable_dkim_signing = 1;
 +dkim_key('fellk.ru', "dkim", "/var/lib/dkim/fellk.ru.pem");
 +@dkim_signature_options_bysender_maps = ( {
 +   "test.ru" => { d => "fellk.ru", a => 'rsa-sha256', ttl => 10*24*3600 },
 +});
 +</code>
 +
 +=== Перезапускаем amavis ===
 +
 +<code>systemctl restart amavis</code>
 +
 +=== Проверить DKIM последовательность для домена можно так ===
 +
 +<code>amavisd-new showkeys</code>
 +
 +=== будет что-то вроде этого ===
 +<code>
 +; key#1 1024 bits, i=dkim, d=fellk.ru, /var/lib/dkim/fellk.ru.pem
 +dkim._domainkey.fellk.ru.        3600 TXT (
 +  "v=DKIM1; p="
 +  "VIDfMA0kh1jVbGBwY2Nx3IgEMgCNRDCRiQKBgQC23iOK+39mY9972KNNGKETJo8n/Heg"
 +  "x6eMYXsp1unAdo2EBJDFU35CNRDCRiQKBgQC23iOK+39mYBxsnIl1Jo8n/Heg"
 +  "x6eMA0kh1jVbGBZrREVZYTEAQUAA4CNRh1jNWGQIF38KWYTE+uPOwtAbXEeRLG/Vz5"
 +  "zyQuIRDCKSHWUGN2461SFG3iOQAB")
 +</code>
 +Теперь нужно на хостинге прописать эти данные. Выглядит так
 +
 +{{:manuals:pasted:20230925-075623.png?nolink}}
 +
 +=== Проверяем настройки DKIM ===
 +
 +<code>amavisd-new testkeys</code>
 +
 +=== Донастраиваем postfix ===
 +
 +<code>nano /etc/postfix/master.cf</code>
 +<code>
 +smtp      inet  n                               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
 +</code>
 +
 +=== Перезапускаем postfix ===
 +
 +<code>systemctl restart postfix</code>
 +
 +=== Настраиваем Roundcube ===
 +
 +<code>nano /var/www/html/webmail/config/config.inc.php</code>
 +
 +Строки
 +<code>
 +$config['smtp_server'] = '';
 +$config['smtp_port'] = 25;
 +</code>
 +
 +заменить на
 +<code>
 +$config['smtp_server'] = 'tls://localhost';
 +$config['smtp_port'] = 587;
 +</code>
 +
 +<note tip>Проверить сервер можно тут:
 +
 +https://spamtest.smtp.bz
 +</note>
 +
 +==== Настройка квот почты ====
 +
 +=== В файле10-mail.conf ===
 +
 +<code>nano /etc/dovecot/conf.d/10-mail.conf</code>
 +
 +снимаем коммент или прописываем строку
 +
 +<code>mail_plugins = $mail_plugins quota</code>
 +
 +=== В файле 20-imap.conf ===
 +
 +<code>nano /etc/dovecot/conf.d/20-imap.conf</code>
 +
 +Снимаем комментарий или прописываем строку
 +<code>
 +protocol imap {
 +  mail_plugins = $mail_plugins imap_quota
 +}
 +</code>
 +
 +=== В файле 10-master.conf ===
 +
 +<code>nano /etc/dovecot/conf.d/10-master.conf</code>
 +
 +редактируем строки как показано ниже
 +<code>
 +service dict {
 +    unix_listener dict {
 +    mode = 0660
 +    user = mail
 +    group = mail
 +  }
 +}
 +</code>
 +<note tip>user и group - это все те же что создавались ранее вами</note>
 +
 +=== В файле 90-quota.conf ===
 +
 +<code>nano /etc/dovecot/conf.d/90-quota.conf</code>
 +
 +Добавляем строки или убираем коммент с них
 +<code>
 +plugin {
 +  quota = dict:User quota::proxy::quota
 +}
 +</code>
 +
 +=== В файле dovecot.conf ===
 +
 +<code>nano /etc/dovecot/dovecot.conf</code>
 +
 +Убираем коммент или добавляем строки
 +<code>
 +dict {
 +  quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
 +}
 +</code>
 +
 +=== В файле dovecot-dict-sql.conf.ext ===
 +
 +<code>nano /etc/dovecot/dovecot-dict-sql.conf.ext</code>
 +
 +Прописываем настройки
 +
 +<code>
 +connect = host=localhost dbname=fellk user=root password=Ваш пароль
 +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
 +}
 +</code>
 +
 +=== Редактируем или дописываем в файле dovecot-sql.conf.ext ===
 +
 +<code>nano /etc/dovecot/dovecot-sql.conf.ext</code>
 +<code>
 +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'
 +</code>
 +
 +=== Проверяем конфигурационный файл dovecot ===
 +
 +<code>doveconf</code>
 +
 +=== если нет ошибок, делаем рестарт ===
 +
 +<code>systemctl restart dovecot</code>
 +
 +==== Проверка работы квот ====
 +
 +=== Для проверки используем команду ===
 +
 +<code>doveadm quota get -u test@fellk.ru</code>
 +
 +Прописывать квоты нужно в веб интерфейсе в каждый почтовый ящик
 +
 +{{:manuals:pasted:20230925-080423.png?nolink}}
 +
 +==== Информирование при превышении квот ====
 +
 +=== В файле 90-quota.conf ===
 +
 +<code>nano /etc/dovecot/conf.d/90-quota.conf</code>
 +
 +Редактируем строки
 +<code>
 +plugin {
 +  quota_warning = storage=95%% quota-warning 95 %u
 +  quota_warning2 = storage=80%% quota-warning 80 %u
 +}
 +</code>
 +
 +<note tip>Можете указать свои значения превышения</note>
 +
 +В разделе service quota-warning редактируем все как ниже
 +<code>
 +service quota-warning {
 +  executable = script /usr/local/bin/quota-warning.sh
 +  user = dovecot
 +  unix_listener quota-warning {
 +    user = mail
 +  }
 +}
 +</code>
 +
 +=== Скрипт оповещения quota-warning.sh ===
 +
 +<code>nano /usr/local/bin/quota-warning.sh</code>
 +<code>
 +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@fellk.ru>
 +Subject: Предупреждение о превышении квоты на почтовый ящик
 +X-Priority: 2
 +
 +<p>Размер Вашего почтового ящика $1% от установленного ограничения.<br>
 +Удалите большие письма с вложениями, сделайте архивацию или обратитесь за помощью в ИТ отдел.</p>
 +EOF
 +</code>
 +
 +=== Прописываем права на файл ===
 +
 +<code>chmod +x /usr/local/bin/quota-warning.sh</code>
 +
 +=== Тестируем скрипт ===
 +
 +<code>/usr/local/bin/quota-warning.sh 80 test@fellk.ru</code>
 +
 +=== Рестарт dovecot ===
 +
 +<code>systemctl restart dovecot</code>
 +
 +==== Для Outlook переводим папки на русский ====
 +
 +=== Редактируем файл 15-mailboxes.conf ===
 +
 +<code>nano /etc/dovecot/conf.d/15-mailboxes.conf</code>
 +
 +В блоке namespace inbox редактируем
 +<code>
 +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
 +  }
 +}
 +</code>
 +
 +<note tip>Имейте ввиду что если вы пользуетесь с одного почтового ящика и Outlook и web интерфейсом, то у вас будет отображаться в Outlook и русские папки и английские, в английские будут валиться письма с web интерфейса, а в русские будут из Outlook.
 +</note>
 +
 +=== Для применения настроек перезапускаем dovecot ===
 +
 +<code>systemctl restart dovecot</code>
 +
 +==== Настройка ограничения вложений ====
 +
 +=== Начнем с файла ===
 +
 +<code>nano /etc/postfix/main.cf</code>
 +
 +Размер почтового ящика
 +Для установки квоты на почтовые ящики редактируем следующее
 +<code>
 +mailbox_size_limit = 734003200
 +virtual_mailbox_limit = 734003200
 +message_size_limit = 73400320
 +</code>
 +<note tip>Я ставлю 70 МБ - в файле это выглядит все в байтах как 734003200
 +</note>
 +<note>
 +Если не нужны ограничения, ставим 0:
 +</note>
 +
 +=== После редактирования применяем изменения ===
 +
 +<code>systemctl reload postfix</code>
 +
 +Далее в файле:
 +
 +<code>nano /etc/php/7.4/apache2/php.ini</code>
 +
 +Находим и редактируем
 +<code>
 +post_max_size = 70M
 +
 +upload_max_filesize = 70M
 +</code>
 +
 +=== И не забываем о перезапуске ===
 +
 +<code>systemctl restart apache2</code>
 +
 +==== Возможные ошибки и их решения ====
 +
 +{{:manuals:pasted:20230522-110102.png?nolink}}
 +
 +решается данная проблема одной-двумя командами, в зависимости что указано в выводе ошибки
 +
 +<code>a2enmod rewrite</code>
 +<code>a2enmod ssl</code>
 +
 +=== Если не отправляются вложения из веб интерфейса Roundcube ===
 +
 +Нужно отредактировать конфиг
 +
 +<code>nano /var/www/html/webmail/config/config.inc.php</code>
 +
 +добавив в него строку
 +<code>
 +$config['temp_dir'] = '/tmp/';
 +</code>