Моя шпаргалка :)

Мануалы и настройки => Настройки *nix (почта, web, система etc) => Mail servers => Тема начата: George от Сен. 25, 2022, 01:31

Название: Полноценный почтовый сервер на Ubuntu Server
Отправлено: George от Сен. 25, 2022, 01:31
В данной инструкции выполнена настройка полноценного почтового сервера на Linux Ubuntu Server (протестирована для версий 20.04 и 22.04). Список всех особенностей и возможностей:

    Поддержка шифрования;
    Хранение почты на сервере;
    Защита от СПАМа и вирусов;
    Почтовая система на базе Postfix;
    Поддержка виртуальных доменов;
    Хранение части настроек в MariaDB;
    Доступ к почте с помощью веб-интерфейса (Roundcube);
    Подключение к почтовым ящикам по POP3 и IMAP (Dovecot);
    Возможность управления почтовыми ящиками с помощью PostfixAdmin.

Содержание

1. Преднастройка системы
2. Настройка веб-сервера: NGINX + PHP + MariaDB
3. Установка и настройка PostfixAdmin
4. Настройка Postfix
5. Настройка Dovecot
6. Проверка работы сервера
7. Настройка Roundcube Webmail
8. Защита от вирусов и СПАМа
    Clamav + Amavisd
    Настройка Postfix
    Обновление антиспама
    Проверка настройки
    Пересылка СПАМа и вирусов на другой ящик
    Антиспам средствами Postfix
    Обучение антиспама
9. Отправка почты без попадания в СПАМ
10. Настройка DKIM
11. Настройка дисковых квот
12. Автоматическая настройка почтовых клиентов
13. Отображение папок IMAP в Outlook на русском
14. Дополнительные настройки
      Настройка лимитов
      Смена email
15. Возможные проблемы
1. Подготовка системы

И так, данная инструкция написана под систему Linux Ubuntu Server. Предварительно, выполним следующие действия.
Общие настройки

Обновляем систему:

apt update && apt upgrade
Задаем правильное имя серверу — это важный шаг, так как большинство антиспам систем выполняют проверки, обращаясь к серверу по имени в ожидании ответа:

hostnamectl set-hostname relay.example.ru
* необходимо указать FQDN-имя, которое будет доступно из глобальной сети. В данном примере указано relay.dmosk.ru.

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

apt install chrony
Задаем временную зону (в данном примере московское время):

timedatectl set-timezone Europe/Moscow
* чтобы получить список всех возможных зон, вводим timedatectl list-timezones.

Разрешаем сервис для обновления времени:

systemctl enable chronyНастройка безопасности

Заранее открываем порты на брандмауэре с помощью 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
* где мы откроем следующие порты:

    25 — стандартный SMTP через STARTTLS;
    110 — стандартный POP3 через STARTTLS;
    143 — стандартный IMAP через STARTTLS;
    465 — защищенный SMTP через SSL/TLS;
    587 — защищенный SMTP через STARTTLS;
    993 — защищенный IMAP через SSL/TLS;
    995 — защищенный POP3 через SSL/TLS.
    80 — HTTP для порталов Postfixadmin и Roundcube;
    443 — защищенный HTTPS для порталов Postfixadmin и Roundcube;

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

apt install iptables-persistent
И выполняем команду:

netfilter-persistent save
Название: От: Полноценный почтовый сервер на Ubuntu Server
Отправлено: George от Сен. 25, 2022, 01:31
2. Настройка веб-сервера: NGINX + PHP + MariaDB

Система управления PostfixAdmin работает как веб-приложение, разработанное на PHP, а информацию хранит в базе данных. В нашем примере будет использоваться веб-сервер на NGINX, а база данных — MariaDB.
Установка NGINX

Устанавливаем nginx командой:

apt install nginx
Разрешаем автозапуск сервиса:

systemctl enable nginx
Проверяем работоспособность веб-сервера, обратившись к нему в браузере по адресу http://<IP-адрес сервера>. Если видим заголовок «Welcome to nginx!», NGINX настроен верно.

Приветствие NGINX — все настроено верно
PHP + PHP-FPM + NGINX

Устанавливаем php и php-fpm:

apt install php php-fpm
* в данном примере будет установлена нативная версия php, например, для Ubuntu 20.04 это php 7.4, для Ubuntu 22.04 — 8.1. Если необходимо установить конкретную версию, смотрим инструкцию Установка разных версий PHP на Linux Ubuntu.

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

vi /etc/nginx/sites-enabled/default
В разделах http - server указываем, чтобы первым индексным файлом был index.php, а также добавляем настройку для обработки запросов php (location):

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        ...

        index index.php ...
        ...

        location ~ \.php$ {
            set $root_path /var/www/html;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param DOCUMENT_ROOT $root_path;
        }
}
* где /var/www/html — каталог для размещения данных nginx по умолчанию; /run/php/php7.4-fpm.sock — путь до сокет-файла php-fpm (обратите внимание, что точное значение зависит от используемой вервии php).

Разрешаем автозапуск php-fpm:

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

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

systemctl restart nginx
Для проверки, создаем индексный файл в директории сайта со следующим содержимым:
vi /var/www/html/index.php
<?php phpinfo(); ?>
Открываем сайт в браузере по его IP-адресу. На открывшейся странице мы должны увидеть подробную информацию по php


MariaDB

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


apt install mariadb-server
Включаем автозапуск сервиса баз данных:

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

mysqladmin -u root password
Название: От: Полноценный почтовый сервер на Ubuntu Server
Отправлено: George от Сен. 25, 2022, 01:32
3. Установка и настройка PostfixAdmin

Устанавливаем дополнительные компоненты для PHP:


apt install php-mysql php-mbstring php-imap
Для применения установленных пакетов, перезапускаем обработчик скриптов:

systemctl restart php7.4-fpm
Скачиваем PostfixAdmin:

wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz
В директории сайтов nginx создаем каталог для postfixadmin и распаковываем в него архив:

mkdir /var/www/html/postfixadmin
tar -C /var/www/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1
Создаем каталог templates_c внутри папки портала (без него не запустится установка):

mkdir /var/www/html/postfixadmin/templates_c
* в противном случае, при попытке зайти в панель управления после ее установки мы получим ошибку ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver.

Задаем права на каталог:
chown -R www-data:www-data /var/www/html/postfixadmin
* несмотря на то, что мы используем веб-сервер nginx, php-fpm по умолчанию, запускается от пользователя www-data.

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

mysql -u root -pCREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
* где postfix — имя базы.

GRANT ALL ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'postfix123';
* где postfix — имя учетной записи; postfix123 — пароль; localhost разрешает подключение только с локального сервера.


Выходим из командной оболочки MariaDB:

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

vi /var/www/html/postfixadmin/config.local.php
* в предыдущих версиях использовался файл config.inc.php. В новых версиях его не рекомендуется править, а использовать config.local.php, который переопределяет настройки.


И добавляем следующее:

<?php

$CONF
['configured'] = true;
$CONF['default_language'] = 'ru';
$CONF['database_password'] = 'postfix123';
$CONF['emailcheck_resolve_domain']='NO';

?>

* где configured говорит приложению, что администратор закончил его конфигурирование; default_language — используемый язык по умолчанию; database_password — пароль для базы данных, который мы задали на предыдущем шаге; emailcheck_resolve_domain — задает необходимость проверки домена при создании ящиков и псевдонимов.

Запускаем браузер и вводим адрес http://<IP-адрес сервера>/postfixadmin/public/setup.php — откроется страница для установки PostfixAdmin.

Задаем дважды пароль установки и генерируем хэш, кликнув по Generate setup_password hash:

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

После копируем хэш, который появится под кнопкой:



Открываем конфигурационный файл:
vi /var/www/html/postfixadmin/config.local.php
И добавляем строчку:

...
$CONF['setup_password'] = '$2y$10$D...R32';
* где '$2y$10$D...R32' — скопированный хэш.

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

Форма для входа с паролем установки

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

Если в процессе установки система выведет ошибки, необходимо самостоятельно с ними разобраться. Как правило, они могут сводиться к отсутствию необходимых пакетов, которых может не оказаться в системе по умолчанию.

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

Создаем суперпользователя PostfixAdmin

* где Setup password — пароль, который мы ввели на предыдущей странице; Админ — учетная запись для входа в панель управления PostfixAdmin; Пароль — новый пароль для создаваемой учетной записи.

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

Вводим логин и пароль для созданного пользователя. Мы должны войти в postfix.admin.

Однако, конкретно, в моем случае, пользователь не создавался при установке системы и необходимо было создать администратора вручную. Если это потребуется, в консоли сервера подключаемся к СУБД:

mysql -uroot -p
Переходим к использованию базы postfix:

use postfix
Добавляем администратора запросом:

INSERT INTO admin (`username`, `password`, `superadmin`, `active`) VALUES ('root@example.ru', '$1$1b7ff416$/KKYqdyAd3viA3.PNu5hh/', '1', '1');
Выходим из sql-оболочки:

quit
Теперь переходим на страницу http://<IP-адрес сервера>/postfixadmin/public/login.php вводим логин root@example.ru и пароль qwe12345 — мы должны оказаться в системе управления почтой. Первым делом, переходим в Список админов - Новый админ:


Создаем своего пользователя. После чего, можно удалить того, что создали через командную строку.
Название: От: Полноценный почтовый сервер на Ubuntu Server
Отправлено: George от Нояб. 12, 2022, 12:52
4. Установка и настройка Postfix

Установка Postfix в Ubuntu выполняется командой:

apt install postfix postfix-mysql
* помимо самого postfix, мы также установим postfix-mysql для возможности работы с СУБД.

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




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

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

groupadd -g 1024 vmailuseradd -d /home/mail -g 1024 -u 1024 vmail -m
* сначала мы создаем группу vmail и guid 1024, после — пользователя vmail с uid 1024 и домашней директорией /home/mail — в ней у нас будет храниться почта. Обратите внимание, что в некоторых системах идентификатор группы и пользователя 1024 может быть занят. В таком случае необходимо создать другой, а в данной инструкции ниже заменить все 1024 на альтернативный.


Если директория для почты ранее уже была создана, то необходимо задать в качестве владельца нашего созданного пользователя:

chown vmail:vmail /home/mail
Теперь открываем на редактирование конфигурационный файл почтового сервера:

vi /etc/postfix/main.cf
И редактируем следующие строки:

mydestination = localhost.$mydomain, localhost, localhost.localdomain
...
inet_protocols = ipv4
...
smtpd_tls_cert_file = /etc/ssl/mail/public.pem
smtpd_tls_key_file = /etc/ssl/mail/private.key

* где:

    mydestination — указываем, для каких доменов принимаем входящую почту.
    inet_protocols — данный параметр задаст протокол для работы postfix. В данном примере на ipv4 — если в нашей системе не используется IPv6, могут возникнуть проблемы при маршрутизации почты. Также можно задать значения all или ipv6.
    smtpd_tls_cert_file — полный путь до публичного сертификата.
    smtpd_tls_key_file — полный путь до приватного сертификата.

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

myhostname = mx01.example.ru
Теперь в конец конфигурационного файла допишем следующее:

virtual_mailbox_base = /home/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

* где:

    virtual_mailbox_base — базовый путь хранения почтовых ящиков в системе UNIX.
    virtual_alias_maps — формат и путь хранения алиасов для виртуальных пользователей.
    virtual_mailbox_domains — формат и путь хранения доменов виртуальных пользователей.
    virtual_mailbox_maps — формат и путь хранения почтовых ящиков для виртуальных пользователей.
    virtual_minimum_uid — с какого номера присваивать идентификаторы пользователям.
    virtual_uid_maps — идентификатор пользователя, от которого записываются сообщения.
    virtual_gid_maps — идентификатор группы, от которой записываются сообщения.
    virtual_transport — задает доставщика сообщений.
    dovecot_destination_recipient_limit — передача сообщений от Postfix в Dovecot выполняется по заданному количеству (в нашем примере, по 1 шт.).
    smtpd_sasl_auth_enable — разрешает sasl аутентификацию.
    smtpd_sasl_exceptions_networks — исключение сетей от использования шифрования.
    smtpd_sasl_security_options — дополнительные опции настройки sasl.
    broken_sasl_auth_clients — эту опцию прописываем для клиентов MS Outlook.
    smtpd_sasl_type — указывает тип аутентификации.
    smtpd_sasl_path — путь до временных файлов обмена информацией с Dovecot. Указывается либо абсолютный путь, либо относительный queue_directory (по умолчанию /var/spool/postfix). Итого, полный путь — /var/spool/postfix/private/auth.
    smtp_use_tls — по возможности, использовать шифрованное соединение для подключение к другому серверу SMTP при отправке письма.
    smtpd_use_tls — указывает клиентам на наличие поддержки TLS.
    smtpd_tls_auth_only — использовать только TLS.
    smtpd_helo_required — требовать начинать сессию с приветствия.

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

vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

* где user и password — логин и пароль для подключения к MySQL; hosts — имя сервера баз данных (в нашем случае, локальный сервер); dbname — имя базы данных; query — шаблон запроса к данным.


Создаем файл с инструкцией получения данных по виртуальным доменам:
vi /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%u'

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

vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

Открываем файл master.cf и дописываем в самый конец:
vi /etc/postfix/master.cfsubmission   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=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

 * необходимо убедиться, что в содержимом файла нет других раскомментированных опций для submission, smtps и dovecot (по умолчанию, их нет). В данном случае, мы настроили работу postfix на портах 25, 465 и 587. В файле master.cf мы настраиваем работу вспомогательных сервисов для Postfix. Описание каждого сервиса начинается с новой строки без отступа. Затем идут настройки для сервиса и параметры запуска. Для примера, рассмотрим первую добавленную строку — 
submission   inet  n  -  n  -  -  smtpd:


    submission — имя сервиса. Возможно использование заранее определенных в postfix служб или создание своих. В данном примере submission для подключения MUA по порту 587 при отправке почты.
    inet — тип обслуживания. Возможны варианты inet (сокет TCP/IP), unix (потоковый сокет), unix-dgram (сокет дейтаграммы), fifo (именованный канал очереди), pass (потоковый сокет UNIX-домена).
    первый "n" — является ли сервис частным и должен быть ограниченным. Возможны варианты y или n. Для типа обслуживания inet может быть только n.
    первый "-" — работает ли служба с правами root. Возможны варианты y, n и -. Прочерк означает неприменимость данного параметра к конкретному сервису.
    второй "n" — должна ли служба работать в окружении chroot. Возможны варианты y или n.
    второй "-" — через какое время в секундах пробудить службу, если она неактивна.
    третий "-" — максимальное количество одновременно выполняемых процессов, которые может запустить данный сервис.
    smtpd — выполняемая команда.

* после команды идут аргументы ее запуска. Они могут переопределять параметры, заданные в main.cf. Каждый аргумент записывается с новой строки и начинается с двух пробелов. В данном примере мы используем следующие аргументы:

    smtpd_tls_security_level — задает уровень безопасности с применением TLS. В данном примере may говорит о возможности его использования.
    smtpd_sasl_auth_enable — разрешает sasl аутентификацию.
    smtpd_sasl_type — указывает тип аутентификации.
    smtpd_sasl_path — путь до временных файлов обмена информацией с сервером хранения почты (в нашем случае Dovecot). Указывается либо абсолютный путь, либо относительный queue_directory.
    smtpd_sasl_security_options — дополнительные опции настройки sasl.
    smtpd_sasl_local_domain — добавить домен для пользователей, которые проходят smtp-аутентификацию.
    syslog_name — префикс названия службы при занесении ее в системный журнал.
    smtpd_tls_wrappermode — запускать ли службу в нестандартном режиме (для поддержки TLS).
    smtpd_client_restrictions — настройки ограничения клиентских соединений. В данном примере разрешить только авторизованных.

Генерируем сертификаты безопасности. Для этого создаем каталог, в котором их разместим:

mkdir -p /etc/ssl/mail
И сгенерируем их следующей командой:

openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=relay.example.ru"
* сертификат сгенерирован на 1461 день, ключи subj могут быть произвольными, CN необходимо указать в соответствии с именем сервера, по которому мы будем подключаться к почте.
* если мы хотим использовать сертификат, который будет проходить все проверки безопасности, его нужно купить или запросить у Let's Encrypt.


Разрешаем запуск postfix:

systemctl enable postfix
Перезапускаем его:

systemctl restart postfix
Название: От: Полноценный почтовый сервер на Ubuntu Server
Отправлено: George от Нояб. 12, 2022, 12:59
5. Настройка Dovecot

Устанавливаем Dovecot с компонентом для работы с СУБД:

apt install dovecot-imapd dovecot-pop3d dovecot-mysql
Настраиваем способ хранения сообщений:

vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/mail/%d/%u/
* в данном примере сообщения будут храниться в продвинутом формате maildir в каталоге /home/mail/<почтовый домен>/<логин пользователя>.

Настраиваем слушателя для аутентификации:
vi /etc/dovecot/conf.d/10-master.confservice auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
}
* в данном примере мы настраиваем сервис для аутентификации и создаем два прослушивателя: /var/spool/postfix/private/auth — для возможности постфиксом использовать авторизацию через Dovecot (обращаем внимание, что /var/spool/postfix/private/auth — это тот же private/auth, который был прописан нами в postfix); auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.

А также в этом файле добавим строки:

service stats {
    unix_listener stats-reader {
        user = vmail
        group = vmail
        mode = 0660
    }
    unix_listener stats-writer {
        user = vmail
        group = vmail
        mode = 0660
    }
[i]}

* в противном случае, мы увидим в логе ошибку error net_connect_unix(/var/run/dovecot/stats-writer) failed permission denied, так как у пользователя vmail не будет прав.[/i]

Настраиваем аутентификацию в Dovecot:

vi /etc/dovecot/conf.d/10-auth.conf
#!include auth-system.conf.ext
!include auth-sql.conf.ext
* в данном случае мы просто комментируем обычную аутентификацию и снимаем комментарий для использования sql-аутентификации.

Настраиваем использование шифрования:

vi /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/ssl/mail/public.pem
ssl_key = </etc/ssl/mail/private.key
* ssl = required укажет dovecot требовать от клиентов использования шифрования; ssl_cert — путь до открытого сертификата (также нами указывался в postfix); ssl_key — путь к закрытому ключу.

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

vi /etc/dovecot/conf.d/15-lda.conf
lda_mailbox_autocreate = yes
Настраиваем подключение к нашей базе данных:

vi /etc/dovecot/conf.d/auth-sql.conf.extpassdb {
  ...
  args = /etc/dovecot/dovecot-sql.conf.ext
}

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

* в данном примере мы указали на файл, в котором будут находиться настройки для получения пользователей и паролей из базы данных. Данная настройка является настройкой по умолчанию и, в большинстве случаев, ее не нужно менять без необходимости указать свой путь.

Откроем на редактирование файл с настройками работы с mysql:

vi /etc/dovecot/dovecot-sql.conf.ext
В самый низ добавим:

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix123
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('/home/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'

* в данном примере мы настроили запрос на получение данных из базы mysql (mariadb). password_query — запрос на получение пароля из таблицы mailbox; user_query — запрос на получение данных пользователя (домашняя почтовая директория, идентификатор 1024 (идентификатор созданного нами ранее пользователя vmail).

И, напоследок, настраиваем интерфейс, на котором будет слушать dovecot:

vi /etc/dovecot/dovecot.conf
listen = *
* по умолчанию, dovecot слушает также на ipv6 (listen = *, ::). Если на сервере не используется 6-я версия протокола TCP/IP, в логах dovecot появятся ошибки:
master: Error: service(imap-login): listen(::, 143) failed: Address family not supported by protocol
master: Error: service(imap-login): listen(::, 993) failed: Address family not supported by protocol


Разрешаем запуск dovecot:

systemctl enable dovecot
Перезапускаем dovecot:

systemctl restart dovecot
Название: 6. Создаем первый почтовый ящик и проверяем работу сервера
Отправлено: George от Нояб. 13, 2023, 02:31
6. Создаем первый почтовый ящик и проверяем работу сервера
В браузере вводим в адресной строке путь до Postfixadmin — http://<IP-адрес сервера>/postfixadmin/public/.

Вводим логин и пароль от административной учетной записи, которую мы создали на шаге 3. Перед нами появится страница управления учетными записями.

Переходим в Список доменов - Новый домен:

Переходим к созданию нового домена

Заполняем формы и нажимаем по Добавить домен:

Заполняем форму для создания домена в PostfixAdmin

Теперь переходим в Обзор - Создать ящик:

Создаем новый почтовый ящик через Postfixadmin

Вводим данные нового пользователя и нажимаем по Создать ящик:

Заполняем данные для создания нового ящика

Теперь можно подключиться к серверу с помощью любой почтовой программы, например, Mozilla Thunderbird.

Параметры для подключения:

    Сервер: имя сервера или его IP-адрес (не желательно, так как сертификат выдается по доменному имени).
    IMAP: 143 STARTTLS или 993 SSL/TLS
    POP3: 110 STARTTLS или 995 SSL/TLS
    SMTP: 25 STARTTLS или 465 SSL/TLS или 587 STARTTLS

* для корректной работы сервера на портах 993, 995, 465 (SSL/TLS) необходим правильный сертификат (для нашего домена и выпущенный доверенным центром сертификации).
Название: 7. Устанавливаем и настраиваем Roundcube Webmail
Отправлено: George от Нояб. 13, 2023, 02:40
В данной инструкции мы разберем использование веб-клиента Roundcube.

На официальном сайте заходим на страницу загрузки Roundcube. Смотрим ссылку на версию продукта с длительной поддержкой (LTS):

Скачиваем LTS версию Roundcube

* мы можем скачать и стабильную версию программы, но для продуктивной среды лучше выбирать то, что будет долго поддерживаться со стороны разработчика.

Используем ссылку, чтобы загрузить архив программы:

wget https://github.com/roundcube/roundcubemail/releases/download/1.5.3/roundcubemail-1.5.3-complete.tar.gz
Создаем каталог, где будут размещаться файлы портала:

mkdir /var/www/html/webmail
И распаковываем скачанный архив:

tar -C /var/www/html/webmail -xf roundcubemail-*.tar.gz --strip-components 1
Копируем шаблон конфига:

cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php
И открываем его на редактирование:

vi /var/www/html/webmail/config/config.inc.php
$config['db_dsnw'] = 'mysql://roundcube:roundcube123@localhost/roundcubemail';
$config['enable_installer'] = true;

* первую строку мы редактируем, а вторую добавляем. В первой строке roundcube:roundcube123 — логин и пароль для доступа к базе данных; localhost — сервер базы данных; roundcubemail — имя базы данных. Вторая строка разрешает установку портала.

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

...
$config['smtp_pass'] = '';
* в данном случае мы просто оставляем значение для переменной $config['smtp_pass'] пустым. В противном случае, веб-интерфейс будет выдавать ошибку авторизации при отправке сообщения.

Также дописываем в конфигурационный файл следующее:

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

* настройка $config['create_default_folders'] = true создает папки по умолчанию, если их нет:

    Drafts — Черновики.
    Junk — СПАМ.
    Sent — Отправленные.
    Trash — Корзина.

* Без данной настройки, если не создавались папки другим клиентом, веб-клиент будет выдавать ошибки при перемещении писем, например, при их удалении.

Задаем владельца apache на папку портала:
chown -R www-data:www-data /var/www/html/webmail
Создаем в MariaDB базу для roundcubemail:

mysql -uroot -p
> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> CREATE USER 'roundcube'@'localhost' IDENTIFIED BY 'roundcube123';
> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost;
> 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 php-dom php-xml php-mcrypt
    Если система выдаст ошибку при установке компонента mcrypt, его нет в репозитории — поставим его вручную. Для этого установим пакеты, необходимые для сборки его из исходников:

    apt install make php-dev libmcrypt-dev
    Выполняем команды:

   pecl channel-update pecl.php.net
  pecl install mcrypt
    Создадим файл с настройкой нового модуля:

    vi /etc/php/${PHP_VER}/fpm/conf.d/99-mcrypt.ini
    extension=mcrypt.so
Компоненты установлены. Настроим php:
vi /etc/php/${PHP_VER}/fpm/php.inidate.timezone = "Europe/Moscow"...
post_max_size = 50M...
upload_max_filesize = 50M
* в данном примере мы задаем московское время и возможность загружать файл размером в 50 Мб (это будет максимальным объемом вложений, которые можно отправлять через веб-интерфейс).

Перезагружаем php-fpm:
systemctl restart php${PHP_VER}-fpm
Настроим nginx:

vi /etc/nginx/nginx.conf
Добавим строку в раздел http:

Цитироватьhttp {
    ...
    client_max_body_size 50M;
    ...

* данной настройкой мы также разрешим загрузку файлов размером 50 Мб.

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

systemctl restart nginx
Теперь открываем браузер и переходим по адресу http://<IP-адрес сервера>/webmail/installer/. На первой странице будет проведена диагностика системы на наличие необходимых компонентов и настроек:

Roundcube при установке проверяет наличие необходимых компонентов

В самом низу нажимаем по кнопке Next. Если кнопка будет неактивна, проверяем, что нет ошибок (NOT OK).

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

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

vi /var/www/html/webmail/config/config.inc.php
Запрещаем установку портала:
$config['enable_installer'] = false;
После удаляем папку с установочными скриптами:

rm -rf /var/www/html/webmail/installer
И заходим в браузере по адресу http://<IP-адрес сервера>/webmail/. Вводим в качестве логина адрес почты созданного пользователя и его пароль.
Название: От: Полноценный почтовый сервер на Ubuntu Server
Отправлено: George от Нояб. 13, 2023, 02:58
Антивирус требует много ресурсов. Будьте готовы, что после его
запуска сервер начнет работать медленнее и понадобится добавить ресурсы.


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

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


apt install amavisd-new clamav clamav-daemon spamassassin

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


usermod -a -G amavis clamav

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


vi /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);
...


* по умолчанию amavis не выполняем никаких проверок — для включения сканирования на вирусы снимаем комментарий с bypass_virus_checks_maps, а для сканирования на СПАМ — bypass_spam_checks_maps.

Затем открываем на редактирование:


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

Добавим строки:

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


* данные опции позволят программе Outlook без ошибок отправлять тестовое сообщение.
** мы должны добавить их выше строки 1;  # ensure a defined return.

Разрешаем запуск антивируса и amavis:


systemctl enable clamav-daemon clamav-freshclam amavis

Перезапускаем сервисы:


systemctl restart amavis clamav-daemon clamav-freshclam

Настройка Postfix

Добавляем в postfix:


vi /etc/postfix/main.cf


content_filter = scan:[127.0.0.1]:10024

* где content_filter указывает на приложение, которое будет сканировать сообщения;

Теперь редактируем master.cf:


vi /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



* итак, данной настройкой мы создадим два вспомогательных сервиса scan и 127.0.0.1:10025 (сервис без имени, он просто будет слушать на порту 10025
 — это порт по умолчанию, на который отправляет сообщение amavis после
выполнения проверки). Также, мы используем следующие опции:


   smtp_send_xforward_command — передавать ли в сканирование сообщение с исходными именем клиента и IP-адресом. В данном примере, да.
   smtp_enforce_tls — требовать ли TLS.
   content_filter — приложение для сканирования. В данном примере сканирование отключено.
   receive_override_options переопределяет опции в main.cf. В нашем случае, no_unknown_recipient_checks отключает попытки выяснить, является ли получатель неизвестным; no_header_body_checks отключает проверки заголовков и тала писем.
   пустые значения для smtpd_helo_restrictions, smtpd_client_restrictions, smtpd_sender_restrictions отключают ограничения для данных опций.
   smtpd_recipient_restrictions — контролирует
ответ Postfix на SMTP-команду RCPT TO. Здесь мы разрешаем только
соединения от узлов, перечисленных в mynetworks.
   mynetworks_style=host указывает postfix, что он должен пересылать почту только с локального компьютера.
   smtpd_authorized_xforward_hosts укажет, какие удаленные клиенты могут использовать XFORWARD. В данном случае локальный компьютер.



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


systemctl restart postfix

Настройка обновлений антиспама

Для обновления базы антиспама выполняем команду:


sa-update --nogpg --verbose

Для настройки автоматического обновления, используем cron. Установим его:


apt install cron

Открываем редактирование планировщика:


crontab -e

30 3 * * * /usr/bin/sa-update

* в данном примере, каждый день в 03:30 будет запускаться процесс обновления антиспама.

Проверка

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


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


Большинство почтовых систем экранинуют вирусную последовательность и
письмо нормально пройдет мимо нашего антивируса. Чтобы сделать
корректный тест, необходимо отправить письмо SMTP-командами.


Письмо не должно дойти, а в логе (/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)



Пересылка СПАМа и вирусов на другой ящик

Все письма со спамом и вирусами будут перемещаться в карантин. Если
мы хотим перенаправлять все подобные сообщения на специальный ящик, то
необходимо настроить amavis.

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


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

Добавляем такие опции:


$spam_quarantine_to = "spam\@im-cloud.site";
$virus_quarantine_to = "virus\@im-cloud.site";


* где $spam_quarantine_to указываем на адрес для перенаправления СПАМ-писем; $virus_quarantine_to — почта для писем с обнаруженными вирусами.

После перезагрузим amavis:


systemctl restart amavis

Пробуем отправить сообщения с тестовыми сигнатурами на СПАМ и вирус — письма должны быть перенаправлены на указанные адреса.

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

Мы установили amavis, который проверяет почту на СПАМ средствами
spamassassin. Последний без обучения, практически, бесполезен. Синтаксис
 команды для обучения следующий:


sa-learn --spam <папка с нежелательными письмами>



sa-learn --ham <папка письмами, которые ошибочно определены как СПАМ>


Таким образом, первая команда укажет spamassassin какие письма
являются нежелательными, а вторая — не несущими рекламный характер.

Хорошей практикой будет договориться с пользователями о ручном
помещении нежелательной почты из входящих в папку СПАМ. Тогда мы сможем
пройтись скриптом по всем ящикам на сервере и обучать антиспам.
Например, такой командой:


sa-learn --spam /home/mail/im-cloud.site/*/{.\&BCEEPwQwBDw-,.Spam,.Junk\ E-mail,.Junk}/cur

* в данном примере мы сказали spamassassin найти в каталогах
пользователей папки Спам, Spam, Junk, Junk E-mail (данные каталоги
являются типичными для помещения СПАМа) и провести обучение.

Чтобы минимизировать количество ложных срабатываний, необходимо
проводить обучение с ключом --ham. В нашем примере мы отправляем все
нежелательные письма на ящик spam. В таком случае, необходимо вручную
находить ложные срабатывания и переносить их в специальную папку,
например Ham. Тогда команда для обучения будет такой:


sa-learn --ham /home/mail/im-cloud.site/spam\@im-cloud.site/.Ham/cur

Статистику обучения можно посмотреть командой:

sa-learn --dump magic
Название: 9. Антиспам средствами Postfix
Отправлено: George от Нояб. 13, 2023, 03:25
9. Антиспам средствами Postfix

Рассмотрим в отдельном разделе защиту от СПАМа средствами самого MTA Postfix.
1. Заголовки

В MTA Postfix встроен свой механизм проверки заголовков входящих сообщений. Правила размещаются в 7 секций, обработка которых выполняется в следующем порядке:

client -> helo -> sender -> relay -> recipient -> data -> end_of_data

Чтобы лучше понять принцип, мы должны знать SMTP-команды при выполнении отправки почты. И так, порядок, следующий:

    Соединение с сервером.
    Команда HELO. Приветствие, в котором отправитель называет свое имя, по которому можно проверить, соответствует ли оно правилам именования и своему IP-адресу.
    MAIL FROM — указывает адрес отправителя. Выполняется для sender и relay.
    RCPT TO — кому отправляем письмо.
    DATA — команда сообщает о готовности отправить письмо с заголовками и текстом.
    END-OF-DATA — отправка письма.

И так, для настройки антиспама открываем конфигурационный файл main.cf:
vi /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_client_restrictions — настройки ограничений при осуществлении клиентских соединений с почтовым сервером.
    smtpd_helo_restrictions — ограничения в контексте клиентской команды HELO.
    smtpd_sender_restrictions — ограничения будут применяться во время выполнения клиентской команды MAIL FROM.
    smtpd_relay_restrictions — ограничения пересылки почты в контексте клиентской команды RCPT TO.
    smtpd_recipient_restrictions — ограничения в контексте клиентской команды RCPT TO после пересылки (smtpd_relay_restrictions).
    smtpd_data_restrictions — ограничения будут применяться во время выполнения команды DATA.
    smtpd_end_of_data_restrictions — ограничения во вреся выполнения команды END-OF-DATA.

... и значения для них:

    permit_mynetworks — разрешает все адреса, перечисленные в настройке mynetworks.
    permit_sasl_authenticated — разрешает запросы всех успешно авторизованных клиентов.
    reject_unauth_pipelining — запрещает отправку писем, которые отправляются заранее (пропуская правильную цепочку сессии SMTP).
    reject_non_fqdn_sender — отклонить соединение, если адрес отправителя указан неправильно (согласно RFC).
    reject_unknown_sender_domain — запрещает запрос, если Postfix не является конечным пунктом назначения для адреса отправителя, а домен MAIL FROM не имеет 1) DNS-записи MX и DNS-записи A или 2) искаженной MX-записи, такой как запись с MX-именем хоста нулевой длины.
    reject_non_fqdn_recipient — запретить соединение, если адрес получателя указан неправильно (согласно RFC).
    reject_unauth_destination — отклонить соединение, если письмо не пересылается согласно правилу relay_domains или сервер не является адресом назначения. Другими словами, запрещает использование нашего сервера в качестве open relay.
    reject_unknown_recipient_domain — отклонить запрос, если Postfix не является конечным пунктом назначения для домена получателя, а домен RCPT TO не имеет 1) DNS-записи MX и DNS-записи A или 2) неверно сформированной MX-записи, такой как запись с именем хоста MX нулевой длины.
    reject_unverified_recipient — отклонить запрос, если известно, что почта на адрес RCPT TO отклоняется или когда адрес получателя не доступен.
    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

* где:

    reject_unknown_client_hostname — проверяет наличие PRT-записи отправителя и наличие рабочей А-записи в соответствие PTR.
    reject_invalid_helo_hostname — проверяет синтаксис HELO-приветствия.
    reject_non_fqdn_helo_hostname — требует правильного FQDN-имени во время HELO-приветствия.
    reject_unknown_helo_hostname — запрещает представляться именами, для которых нет А-записи или MX.
    reject_rbl_client — проверяет наличие отправителя в черных списках.

* более подробное описание опций для защиты можно найти на странице postfix.org/postconf.5.html.

После внесения всех правок, необходима перезагрузка Postfix:

systemctl restart postfix
Название: 2. Проверка SPF
Отправлено: George от Нояб. 14, 2023, 01:15
2. Проверка SPF

Проверка SPF позволит отбрасывать все попытки отправить сообщения от доменов, которые не прошли валидацию по SPF.

Устанавилваем пакет:

apt install postfix-policyd-spf-python
Открываем конфигурационный файл postfix:

vi /etc/postfix/main.cf
 Добавляем опции:

policy-spf_time_limit = 3600s...
smtpd_recipient_restrictions =
        ...
        check_policy_service unix:private/policy-spf
        permit

* где:

    policy-spf_time_limit — устанавливает максимальное количество времени, которое почтовый сервер будет затрачивать на проверку SPF-записи.
    check_policy_service — выполнение дополнительной проверки при приеме почты. В данном примере, политика проверки выполняется в файле private/policy-spf.

Открываем файл:

vi /etc/postfix/master.cf
Добавим строки:
policy-spf   unix    -    n    n    -    -    spawn
  user=nobody argv=/usr/bin/policyd-spf

Перезапускаем постфикс:

systemctl restart postfix
По умолчанию, политика блокирует письма, только если владелец домена указал жесткую блокировку (использовал -all, вместо ~all). Если мы хотим указать более жесткую политику, открываем файл:

vi /etc/postfix-policyd-spf-python/policyd-spf.conf
Задаем значения для опций HELO_reject и Mail_From_reject:

...
HELO_reject = Fail
Mail_From_reject = Softfail

* в данном примере мы будем блокировать письма:

    HELO_reject — для приветствий, если администратор домена указал -all.
    Mail_From_reject — для поля From, если администратор домена указал ~all или -all. Это более жесткая политика.

Подробнее информацию об опциях конфигурационного файла policyd-spf.conf можно узнать командой:

man policyd-spf.conf
Название: 3. Защита от СПАМа «от себя к себе»
Отправлено: George от Нояб. 14, 2023, 02:18
Часто можно наблюдать ситуацию, когда приходит спам от своих же ящиков (или ящиков своего домена, хотя таких почтовых адресов у нас не существует).

Это происходит из-за возможности в поле FROM подставить любой адрес. А адрес от своей организации может внушить доверие, что побудит пользователя откликнуться на нежелательное сообщение.

Для решения проблемы в Postfix нужно добавить простое правило:
vi /etc/postfix/main.cf
smtpd_sender_restrictions =
        ...
        check_sender_access hash:/etc/postfix/sender_access        permit

Создадим сам файл:

vi /etc/postfix/sender_access
im-cloud.site REJECT Relay from im-cloud.site are denied
* в данном примере мы будет отклонять все попытки отправить почту с чужих серверов от нашего домена im-cloud.site.

Создаем карту:

postmap /etc/postfix/sender_access
Перезапускаем постфикс:

systemctl restart postfix
Название: 10. Отправка почты наружу
Отправлено: George от Нояб. 14, 2023, 02:29
10. Отправка почты наружу

Для отправки почты на другие почтовые серверы необходимо правильно сконфигурировать сервер, чтобы письма не попадали в СПАМ. Чтобы это сделать, выполняем инструкции ниже.
Настройки DNS для сервера

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

1. rDNS. Обратная зона используется для проверки соответствия имени сервера в приветствии с именем, которое возвращает NS сервер при запросе по PTR-записи.

И так, для создания записи в обратной зоне, необходимо написать письмо Интернет провайдеру, к сети которого подключен сервер или хостеру, если почтовый сервер настроен на VPS. IP-адрес нашего сервера должен вести на имя, которым приветствуется наш postfix — можно посмотреть командой:

postconf -n smtpd_banner
Если мы получим пустой ответ, то вводим:

postconf -n myhostname
Если и в этот вариант не вернет ответ, вводим:

Цитироватьhostname

2. А-запись. Также необходимо, чтобы имя сервера, которым представляется почтовый сервер разрешалось в IP-адрес.

Для этого заходим в консоль управления зоной нашего домена и создаем запись типа А для сопоставления имени сервера с IP-адресом, на котором слушает запросы данный сервер.
Настройки DNS для домена

Для каждого домена, для которого будем отправлять почту создаем записи:

    SPF.
    DMARC.
    DKIM


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

    https://www.mail-tester.com
    https://spamtest.smtp.bz

11. Настройка DKIM

Подпись писем не является обязательной, но помогает не попадать в СПАМ. DKIM настраивается для каждого домена, а также должна создаваться специальная запись в DNS. Рассмотрим создание и настройку DKIM в amavisd.

Создаем каталог для хранения ключей:

mkdir -p /var/lib/dkim
Для нашего удобства создаем переменную с доменом, для которого будем создавать DKIM:

DOMAIN=$(hostname -d)
* где hostname -d — команда, которая вернет нам домен из имени нашего сервера. При необходимости создать dkim для другого домена, пропишем его вручную, а не с использованием команды.

Посмотреть значение полученной переменной можно командой:

echo $DOMAIN

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

amavisd-new genrsa /var/lib/dkim/${DOMAIN}.pem 1024

Задаем права на созданный файл:

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


chmod 0400 /var/lib/dkim/*.pem

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

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

Редактируем запись:

#$inet_socket_port = 10024;

$inet_socket_port = [10024,10026];
* в данном примере мы закомментировали первую строку и раскомментировали вторую. Это укажет amavis, что он должен запускаться и работать на двух портах.

А также добавим:

$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"],
};
Открываем файл:

vi /etc/amavis/conf.d/50-user
Добавляем записи:
$enable_dkim_verification = 1;
$enable_dkim_signing = 1;

dkim_key('im-cloud.site', "dkim", "/var/lib/dkim/im-cloud.site.pem");

@dkim_signature_options_bysender_maps = ( {
   "im-cloud.site" => { d => "im-cloud.site", a => 'rsa-sha256', ttl => 10*24*3600 },
});

* где im-cloud.site — домен, для которого мы настраиваем dkim; /var/lib/dkim/im-cloud.site.pem — путь до сгенерированного файла с последовательностью.

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

systemctl restart amavis
Посмотреть DKIM последовательность для нового домена можно командой:

amavisd-new showkeys
Мы должны увидеть что-то на подобие:

; key#1 1024 bits, i=dkim, d=im-cloud.site, /var/lib/dkim/im-cloud.site.pem
dkim._domainkey.im-cloud.site.        3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0SDFqGSIb3DQEBAQUAA4GNADCBiQKBgQC44iOK+99mYBxsnIl1Co8n/Oeg"
  "4+x90sxqWzoGW42d/GCP4wiYqVqncc37a2S5Berv0OdoCGcmkDkKWh4CHhFD4blk"
  "x6eMYXsp1unAdo2mk/OVK7M2ApraIkh1jVbGBZRgNJERdF+uPOwtAbXEeRLG/Vz5"
  "zyQuIpwY2Nx3IgEMgwIDAQAB")

Теперь нам нужно на основе данного вывода создать в DNS запись TXT. В данном примере, нужно создать запись c именем dkim._domainkey в зоне im-cloud.site и значением "v=DKIM1; p=MIGfMA0SD...wIDAQAB".

Проверить корректность настройки DKIM можно командой:
amavisd-new testkeys
Переходим к настройке Postfix. Мы должны добавить отправку всех исходящих писем на проверку в amavis на порт 10026 и принимать обратно письма на порт 10027.

Открываем файл:

vi /etc/postfix/master.cf
Отредактируем submission и smtps, добавив content_filter:

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:
vi /var/www/html/webmail/config/config.inc.php
Находим строки:

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


... и меняем ее на:

$config['smtp_server'] = 'tls://localhost';
...
$config['smtp_port'] = 587;

* в данном примере мы указали, что соединение для отправки почты должно быть защищенным. Это важно для нашей настройки DKIM.

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

dkim=pass header.d=im-cloud.site