Настройка postfix + dovecot + mysql база + postfixadmin + roundcube + dkim на CentOS 8

Я решил актуализировать старую и очень популярную статью про настройку своего почтового сервера. Статья будет про установку postfix, dovecot, mysql базы, postfixadmin, roundcube, dkim на базе CentOS 8. Последнее время инфраструктура информационных систем стремительно изменяется, но классические почтовые сервера по прежнему актуальны и востребованы.

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Цели статьи

  1. Рассказать о настройке DNS для почтового сервера.
  2. Установить и настроить базовый функционал почтового сервера на базе Centos 8 с помощью Postfix и Dovecot.
  3. Настроить панель управления почтовым сервером Postfixadmin.
  4. Настроить Web интерфейс Roundcube, а так же его плагины acl, managesieve.
  5. Рассказать о способах борьбы со спамом средствами postfix.

Данная статья является частью единого цикла статьей про сервер Centos.

Введение

У меня есть аналогичная статья про настройку postfix на centos 7. Она в целом не утратила актуальность, кроме ссылок на старые версии софта. С тех пор ничего принципиально не изменилось. Если вы не хотите использовать Centos 8, то смело используйте ту статью. У 7-й версии centos еще очень долго будет поддержка, так что вам скорее всего хватит этого времени.

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

Как я уже сказал, настраивать почтовый сервер буду на ОС linux, а точнее на CentOS 8. За основу будет взят postfix, который присутствует в этой системе из коробки. Инструкция получится универсальной, можно использовать и для других дистрибутивов. Все основные конфиги легко переносятся на разные системы, требуя минимальной правки, в основном путей. Я без проблем по своим статьям для centos настраивал почтовый сервер на ubuntu.

Я напишу статью на самом что ни на есть реальном примере, без какой-либо правки доменов, ip и прочего, чтобы не ошибиться и показать максимально возможный реальный пример. У меня есть домен kirushin-vladimir.ru. Я буду использовать его в своей работе. Почтовый сервер будет иметь имя mail.kirushin-vladimir.ru. Всю теорию по подготовке dns к установке и настройке почтового сервера я рассказывал в предыдущей статье о почтовом сервере. Не хочу здесь повторяться. Уточню только список действий, которые вам нужно проделать c ДНС:

  1. Создаем A запись в DNS — mail.kirushin-vladimir.ru.
  2. Добавляем или редактируем MX запись, указывая в качестве почтового сервера mail.kirushin-vladimir.ru.
  3. Просим провайдера прописать PTR для внешнего ip адреса, который будет использовать почтовый сервер. В качестве ptr записи просим установить имя нашего сервера — mail.kirushin-vladimir.ru.
DNS записи для почтового сервера

Я использую бесплатный dns хостинг от Selectel. Раньше использовал сервера Яндекса, но из-за того, что они заблокированы на Украине, это создает неудобства. На картинке показан минимально необходимый набор записей, кроме PTR. Этими записями управляете не вы, а провайдер, который вам выдает ip адрес. Пока с днс все. Позже мы вернемся к этому вопросу, когда будем добавлять dkim и spf записи. Но обо всем по порядку.

Подготовим систему centos 8 к установке и настройке почтового сервера postfix. Если у вас еще нет готовой системы, то рекомендую воспользоваться моими статьями по установке и настройке centos. Отдельно потратьте время на настройку iptables. Я не буду касаться этого вопроса в данной статье, чтобы не раздувать ее второстепенными вещами. Удобнее, когда все по отдельности рассказано и описано с должной глубиной. Сваливать все в одну кучу не хочется.

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

Проверка DNS записей

Проверим наши настройки dns. Для этого зайдем на любой сервер по ssh, где установлен пакет bind-utils. Если у вас его нет, то ставьте командой ниже.

# dnf install bind-utils

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

# dig kirushin-vladimir.ru mx | grep IN
# dig mail.kirushin-vladimir.ru | grep IN
# host 5.180.137.106
Проверка DNS записей

Сначала проверили MX запись. Посмотрели, на какую А запись она ссылается. Потом проверили эту А запись. В завершении убедились, что ip адрес этой А записи имеет PTR запись с таким же именем домена.

Это идеальный вариант настроек, к которому нужно стремиться. В спецификации протокола smtp нет таких требований, но по факту, чтобы снизить риск попадания в спам, нужно настраивать все именно так. Если у вас нет возможности изменить PTR запись IP адреса, это не сильно страшно. Почта работать будет и без нее. Это проверено на практике. Но если есть возможность все настроить правильно, сделайте это.

С проверками закончили. Плавно переходим к настройке почтового сервера.

Установка postfixadmin

Начнем с установки и настройки панели управления почтовым сервером postfix — postfixadmin. Без него начинать что-то делать неудобно, так как управлять пользователями, ящиками, алиасами будет нечем. По своей сути postfixadmin — набор php скриптов для управления записями в mysql базе данных, которую использует сервер postfix во время своей работы. Соответственно, для работы postfixadmin нам нужен web сервер. Подробно о настройке web сервера на centos 8 читайте отдельно. Сейчас же мы быстро установим все необходимое. Привожу только команды, без комментариев. Все подробности по приведенной выше ссылке.

Подключаем репозиторий remi с дополнительными пакетами для php (нужен для php-imap), обновляем кэш.

# dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm
# dnf makecache
# dnf module enable php:remi-7.2

Устанавливаем необходимые пакеты.

# dnf install httpd php mariadb mariadb-server php-imap php-mysqlnd php-mbstring

Этих пакетов со всеми зависимостями будет достаточно для установки всех необходимых компонентов веб сервера. Запускаем и добавляем в автозагрузку httpd.

# systemctl enable --now httpd

Теперь можно зайти по ip адресу через браузер. Вы должны увидеть дефолтную страницу Apache.

Проверка web сервера

Если страница не открывается, то скорее всего у вас не настроен firewalld. Займитесь его настройкой, ссылку я давал в начале. Если он вам не нужен, то удалите его.

# dnf remove firewalld

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

# cd ~
# wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz

Распаковываем и перемещаем в директорию web сервера.

# tar xzvf phpMyAdmin-5.0.4-all-languages.tar.gz
# mkdir /var/www/html/basa
# cp -R /root/phpMyAdmin-5.0.4-all-languages/* /var/www/html/basa/
# chown -R apache. /var/www/html/basa/

Идем по ссылке http://5.180.137.106/basa/ и проверяем, что интерфейс phpmyadmin нормально загружается.

Установка phpmyadmin

Запускаем базу данных mariadb, добавляем в автозагрузку, устанавливаем пароль root.

# systemctl enable --now mariadb
# /usr/bin/mysql_secure_installation

Теперь можно через phpmyadmin подключиться к mysql серверу с помощью учетной записи root.

Создание базы данных для postfixadmin

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

Сразу создадим тут пользователя postfix и одноименную базу данных. Запомните учетные данные, они нам далее понадобятся. Установите кодировку базы utf8_general_ci, чтобы потом не возиться с этим.

Веб сервер готов, продолжаем настройку почтового сервера. Скачиваем последнюю версию postfixadmin.

# cd ~
# wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.4.tar.gz

Распаковываем и копируем в директорию web сервера.

# tar xzvf postfixadmin-3.2.4.tar.gz
# mkdir /var/www/html/padmin
# cp -R /root/postfixadmin-3.2.4/* /var/www/html/padmin
# chown -R apache. /var/www/html/padmin

Копируем дефолтный конфиг postfixadmin для того, чтобы вносить туда свои изменения.

# cp /var/www/html/padmin/config.inc.php /var/www/html/padmin/config.local.php

Убедитесь, что файл config.local.php содержит следующие исправленные параметры.

$CONF['configured'] = true;
$CONF['setup_password'] = 'bff0983368335032599fddsfhgjtretuiu8776yhj657de020a90ba837';
$CONF['default_language'] = 'ru';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = '123';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'root@kirushin-vladimir.ru';
$CONF['encrypt'] = 'md5crypt';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'YES';
$CONF['transport_default'] = 'virtual';
$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Return to http://5.180.137.106/padmin/public/';
$CONF['footer_link'] = 'http://5.180.137.106/padmin/public/';
$CONF['default_aliases'] = array (
 'abuse' => 'root',
 'hostmaster' => 'root',
 'postmaster' => 'root',
 'webmaster' => 'root'
);

Обращаю внимание на выделенный параметр. Он указывает на то, в каком виде хранить пароли пользователей в базе данных. Конечно, хранить обычным текстом без шифрования это дурной тон и может быть опасно. Я указал хранение в шифрованном виде. Но если мы говорим о небольшой компании без публичного доступа к серверу, можно использовать нешифрованные пароли. Для этого указываем значение параметра cleartext. Я сам так часто делаю просто из соображений удобства. Объясню, в чем удобство.

К примеру, у пользователя несколько устройств подключены к почте и он забыл свой пароль. Админ при создании почему-то тоже его никуда не записал, или забыл, или потерял. Вам придется сбросить пароль и перенастроить все устройства. Если же у вас пароль хранится в открытом виде, вы просто смотрите в базу и говорите пользователю пароль. Пароли в открытом виде удобно просто выгрузить дампом из базы, если понадобится кому-то все учетки передать. Но тут как посмотреть :) С одной стороны плюс, с другой минус — кто-то очень просто может спереть все ваши пароли. В общем, тут от ситуации зависит, решайте сами, как вам удобнее хранить пароли.

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

Если вы сами работаете с сервером и все аккуратно ведете, записываете, например, в keepass все пароли от почтовых ящиков, то смело шифруйте все пароли, так будет спокойнее.

Последние 2 параметра domain_path и domain_in_mailbox указывайте по своему усмотрению. В файле конфигурации в комментариях расписано, за что они отвечают и в чем отличие. Мне кажется, удобно хранить директории именно в таком виде, как я указал. Получится следующий путь до ящика, если у вас архив почты будет жить, к примеру, в директории /mnt/mail — /mnt/mail/kirushin-vladimir.ru/root@kirushin-vladimir.ru. Если доменов будет несколько, в такой иерархии удобно работать.

С параметрами разобрались. Сохраняем конфиг. Еще один маленький нюанс. Для работы панели управления нужна директория templates_c с правами на запись для web сервера. Сделаем ее и дадим права.

# mkdir /var/www/html/padmin/templates_c
# chown -R apache. /var/www/html/padmin/templates_c

Идем по адресу http://5.180.137.106/padmin/public/setup.php и начинаем установку postfixadmin. Первым делом идет проверка всех необходимых для установки и работы компонентов. Для продолжения установки у вас должна быть такая картинка.

Установка Postfixadmin

Если все в порядке с настройками, сразу же начнется создание структуры базы данных. Из-за этого первая загрузка страницы будет длиться долго. Это нормально. В самом низу страницы будет интерфейс добавления администратора панели управления. Создайте его.

Создание учетной записи для администратора

При первом добавлении учетной записи вы введете пароль для поля Setup password. После этого получите ошибку, так как хэш этого пароля не совпадает с тем, что вы ставили в конфиге postfixadmin ранее. Вам будет выведен правильный хэш. Добавьте его в конфиг config.local.php.

$CONF['setup_password'] = '555e082774c7b3584af0a09e45657532:43ce9c34ca00f681a002c2ea40354d7f1d68768a';

После этого добавляйте учетную запись администратора панели еще раз, используя тот же самый пароль установки, хэш от которого вы добавили. Попробуйте залогиниться под этой учетной записью по адресу http://5.180.137.106/padmin/public/.

Интерфейс postfixadmin

Теперь нам нужно добавить домен в панель управления. Идем в раздел Список доменов -> Новый домен и добавляем свой домен.

Добавление домена

При создании домена были добавлены стандартные алиасы, получателя для которых мы указали еще в конфиге — ящик root@kirushin-vladimir.ru. Создание таких алиасов требование стандартов, но по факту, кроме спама, вы скорее всего ничего не будете получать по этим адресам. Так что их создание оставляйте на свое усмотрения. Я обычно их не делаю, так как ящик для этих алиасов все равно не читаю.

Далее создадим почтовый ящик администратора — root@kirushin-vladimir.ru. Для этого идем в раздел Обзор -> Создать ящик и заполняем поля.

Создание почтового ящика через postfixadmin

Вы получите ошибку, что невозможно отправить сообщение. Это нормально, так как непосредственно почтового сервера у нас еще нет, только панель управления для него. Сам ящик на диске создан тоже не будет, но запись в базе данных появится. Это можно проверить через phpmyadmin.

Проверка ящика в mysql базе

Как вы видите, пароль зашифрован. На этом установку и настройку postfixadmin завершаем. Интерфейс для управления почтовым сервером мы подготовили. Теперь можно заняться непосредственно настройкой postfix.

Настройка postfix

Сердце нашего почтового сервера на linux — postfix. В дистрибутиве centos 8 минимальной установки он по-умолчанию отсутствует. Так что сначала устанавливаем postfix.

# dnf install postfix postfix-mysql

Приводим конфиг postfix /etc/postfix/main.cf к следующему виду.

soft_bounce = no
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix

myhostname = mail.kirushin-vladimir.ru
mydomain = kirushin-vladimir.ru
myorigin = $myhostname

inet_interfaces = all
inet_protocols = ipv4

mydestination = localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8, 10.1.4.22/32

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

smtpd_banner = $myhostname ESMTP $mail_name

debug_peer_level = 2
# Строки с PATH и ddd должны быть с отступом в виде табуляции от начала строки
debugger_command =
    PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
    ddd $daemon_directory/$process_name $process_id & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf,
 mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf

smtpd_discard_ehlo_keywords = etrn, silent-discard
smtpd_forbidden_commands = CONNECT GET POST
broken_sasl_auth_clients = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
disable_vrfy_command = yes

smtpd_helo_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_helo_hostname,
 reject_invalid_helo_hostname

smtpd_data_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_unauth_pipelining,
 reject_multi_recipient_bounce,

smtpd_sender_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_sender,
 reject_unknown_sender_domain

smtpd_recipient_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_recipient,
 reject_unknown_recipient_domain,
 reject_multi_recipient_bounce,
 reject_unauth_destination,

smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache
smtpd_tls_key_file = /etc/postfix/certs/key.pem
smtpd_tls_cert_file = /etc/postfix/certs/cert.pem
tls_random_source = dev:/dev/urandom
smtpd_tls_mandatory_ciphers = low
smtpd_tls_ciphers = low
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtp_tls_mandatory_protocols  = !SSLv2,!SSLv3
smtp_tls_ciphers = low
smtp_tls_mandatory_ciphers = low
smtp_tls_protocols = !SSLv2,!SSLv3
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy_maps
# фиксировать в логе имена серверов, выдающих сообщение STARTTLS, поддержка TLS для которых не включена
smtp_tls_note_starttls_offer = yes

# Ограничение максимального размера письма в байтах
message_size_limit = 20000000
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 15
smtpd_error_sleep_time = 20
anvil_rate_time_unit = 60s
smtpd_client_connection_count_limit = 20
smtpd_client_connection_rate_limit = 30
smtpd_client_message_rate_limit = 30
smtpd_client_event_limit_exceptions = 127.0.0.0/8
smtpd_client_connection_limit_exceptions = 127.0.0.0/8

maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth

# Директория для хранения почты
virtual_mailbox_base = /mnt/mail
virtual_minimum_uid = 1000
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps

compatibility_level=2

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

# mkdir /etc/postfix/mysql && cd /etc/postfix/mysql
# mcedit relay_domains.cf

hosts = localhost
user = postfix
password = 123
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
# mcedit  virtual_alias_domain_maps.cf

hosts = localhost
user = postfix
password = 123
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1
# mcedit virtual_alias_maps.cf

hosts = localhost
user = postfix
password = 123
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
# mcedit virtual_mailbox_domains.cf

hosts = localhost
user = postfix
password = 123
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
# mcedit virtual_mailbox_maps.cf

hosts = localhost
user = postfix
password = 123
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

Создадим файл tls_policy_maps, с помощью которого можно вручную задавать версию tls протокола для общения серверов, либо полностью отключать его. Это иногда бывает нужно, если подключаешься к очень старому серверу, который не поддерживает современные протоколы. Приходится использовать нешифрованное подключения.

# mcedit /etc/postfix/tls_policy_maps
93.175.56.122		none
77.221.87.91		encrypt protocols=TLSv1
# postmap /etc/postfix/tls_policy_maps

Так же не стоит забывать, что в современных ОС зачастую на уровне всей системы запрещено использование старых протоколов шифрования, таких как tls 1.0 или ssl3. Чтобы разрешить их, недостаточно настроек почтового сервера. Надо менять системные настройки. Как это сделать я рассказываю в отдельной статье - Centos 8 и TLS 1.0 и 1.1.

Продолжаем настройку почтового сервера postfix. Редактируем файл /etc/postfix/master.cf. Нам надо добавить строки, касающиеся настройки Submission для того, чтобы почтовый сервер работал на 587 порту. Смартфоны очень часто при настройке используют этот порт по-умолчанию, где-то даже без возможности изменить эту настройку. Приводим секцию, отвечающую за эту работу к следующему виду.

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Обращаю внимание на пробел в начале строки, начиная со второй. Его надо обязательно оставить. Добавляем еще настройки для того, чтобы наш сервер поддерживал протокол SSL/TLS и слушал порт 465

smtps inet n - n - - smtpd
 -o syslog_name=postfix/smtps
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
 -o milter_macro_daemon_name=ORIGINATING

В этот же файл добавляем еще одну настройку, которая будет указывать postfix, что доставкой почты у нас будет заниматься dovecot, который мы настроим следом. Добавляем в master.cf в самый конец.

dovecot unix - n n - - pipe
 flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

Сгенерируем самоподписанные ssl сертификаты для нашего почтового сервера. Позже отдельным пунктом я расскажу как использовать полноценные сертификаты. Они не всем нужны, поэтому показываю быструю настройку postfix на использование своих сертификатов, которые уже указаны в конфиге postfix.

Создаем директорию и сами сертификаты:

# mkdir /etc/postfix/certs
# openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/certs/cert.pem -keyout /etc/postfix/certs/key.pem

Для генерации вам зададут несколько вопросов по поводу данных о сертификате. В принципе, можете там писать все, что угодно. Вот мои данные.

Генерация tls сертификата для почтового сервера

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

# mcedit /etc/postfix/recipient_bcc_maps
@kirushin-vladimir.ru all_in@kirushin-vladimir.ru
# mcedit /etc/postfix/sender_bcc_maps
@kirushin-vladimir.ru all_out@kirushin-vladimir.ru

Создаем индексированные базы данных из этих файлов. Это нужно делать каждый раз, после изменения.

# postmap /etc/postfix/recipient_bcc_maps /etc/postfix/sender_bcc_maps

Теперь создайте два почтовых ящика all_in@kirushin-vladimir.ru и all_out@kirushin-vladimir.ru через postfixadmin.

Немного поясню по этим ящикам — для чего они нужны. Изначально я их делал, когда пользователи использовали протокол pop3 без сохранения писем на сервере. Это позволяло организовать бэкап всей переписки. Эти ящики очень быстро заполняются и занимают огромный объем, поэтому их обязательно надо чистить. Я просто скриптами регулярно собирал всю почту в архивы с именами в виде дат. Если нужно было какое-то письмо найти, то просто распаковывал нужный архив. Пример прямого поиска писем по дате я показывал в статье про обслуживание почтовой базы.

В случае с imap роль бэкапа отпадает, так как вся почта хранится на сервере. Но эти ящики все равно бывают полезны, когда пользователь, к примеру, удалил какое-то важное письмо и потом делает вид, что его и не было. Если это письмо пришло только сегодня и еще не успело улететь в бэкап, то кроме записи в логах об этом письме, вы не увидите само содержимое. А с такими ящиками все сразу будет понятно, и вопросы отпадут. Последнее применение — служба безопасности. Если у вас есть кто-то, кому положено читать всю переписку, то реализовать этот функционал можно таким простым способом.

Все основные настройки для postfix мы сделали. Некоторые из них завязаны на работу с dovecot, который мы еще не настроили. Поэтому больше postfix не трогаем, не перезапускаем. Идем настраивать dovecot — imap сервер нашей почтовой системы.

Настройка dovecot

Займемся настройкой dovecot — сервер доставки почты пользователю по протоколам pop3 и imap. Я не вижу причин использовать pop3. Он неудобен по сравнению с imap. Чаще всего pop3 отключаю вовсе. Но это уже на ваше усмотрение. Приведу пример с настройкой обоих протоколов. Помимо основного функционала по доставке почты, я настрою несколько полезных плагинов. Расскажу о них поподробнее:

  • Sieve — выполняет фильтрацию почты по заданным правилам в момент локальной доставки на почтовом сервере. Удобство такого подхода в том, что вы один раз можете настроить правило сортировки, и оно будет работать во всех клиентах, которыми вы будете получать почту по imap. Правила создаются, хранятся и исполняются на самом сервере.
  • Acl — позволяет пользователям расшаривать папки в своем почтовом ящике и предоставлять доступ к этим папкам другим пользователям. Не часто видел, чтобы этот функционал настраивали и использовали. Думаю, просто по незнанию. По мне так очень удобный и полезный функционал.

Часто вижу, что люди настраивают плагин quota, который позволяет ограничивать максимальный размер почтового ящика. Я лично в своей работе его не использую. Возможно, когда у тебя клиентов сотни и тысячи это имеет значение и надо обязательно настроить ограничение. Когда же ящиков меньше, нет смысла напрягать людей постоянной чисткой. Сейчас диски стоят не так дорого. Мне кажется, проще и дешевле увеличить место на сервере, нежели постоянно беспокоить пользователей необходимостью чистки ящика. Лучше ограничить максимальный размер письма, скажем 20-ю мегабайтами. Тогда сильно забить ящик даже при большом желании быстро не получится. А почта все-таки важный инструмент в работе. Мне кажется, ее лучше хранить как можно дольше.

Есть еще один полезный плагин expire, который позволяет удалять устаревшие письма в определенных папках. Например, удалять все письма старше 30-ти дней в корзине и папке со спамом. Но реально пользоваться им не получается по простой причине. Разные почтовые клиенты создают различные папки для корзины и спама. Thunderbird создает папки с латинскими именами trash и spam, outlook с русскими, которые на почтовом сервере преобразуются в кодировку UTF7, мобильные клиенты тоже используют разные имена папок. В итоге нет единообразия, плагин полноценно не работает.

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

Небольшую теорию я дал, теперь переходим к практике. Устанавливаем необходимые для dovecot пакеты.

# dnf install dovecot dovecot-mysql dovecot-pigeonhole

Изначально конфиг dovecot разбит на отдельные сегменты и лежат они в директории /etc/dovecot/conf.d. Каждый файл — отдельный функционал. Мне не нравится прыгать по файлам, поэтому я храню все в едином общем файле конфигурации /etc/dovecot/dovecot.conf. С ним мы и будем работать. Обращаю внимание, что это только вопрос удобства. Можете оставить все файлы отдельности, если вам так привычнее. Приводим конфиг к следующему виду.

listen = *

mail_plugins = mailbox_alias acl
protocols = imap pop3 sieve lmtp

mail_uid = 1000
mail_gid = 1000

first_valid_uid = 1000
last_valid_uid = 1000

auth_verbose = yes
log_path = /var/log/dovecot/main.log
info_log_path = /var/log/dovecot/info.log
debug_log_path = /var/log/dovecot/debug.log

#ssl_protocols = !SSLv3
#ssl = required
ssl_min_protocol = SSLv3 verbose_ssl = yes ssl_cert = </etc/postfix/certs/cert.pem ssl_key = </etc/postfix/certs/key.pem ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA ssl_prefer_server_ciphers = yes disable_plaintext_auth = no mail_location = maildir:/mnt/mail/%d/%u/ auth_default_realm = kirushin-vladimir.ru auth_mechanisms = PLAIN LOGIN service auth { unix_listener /var/spool/postfix/private/dovecot-auth { user = postfix group = postfix mode = 0666 } unix_listener auth-master { user = vmail group = vmail mode = 0666 } unix_listener auth-userdb { user = vmail group = vmail mode = 0660 } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { user = postfix group = postfix mode = 0600 } inet_listener lmtp { address = 127.0.0.1 port = 24 } } userdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } passdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } auth_master_user_separator = * plugin { auth_socket_path = /var/run/dovecot/auth-master acl = vfile acl_shared_dict = file:/mnt/mail/shared-folders/shared-mailboxes.db sieve_dir = ~/.sieve/ mailbox_alias_old = Sent mailbox_alias_new = Sent Messages mailbox_alias_old2 = Sent mailbox_alias_new2 = Sent Items } protocol lda { mail_plugins = $mail_plugins sieve auth_socket_path = /var/run/dovecot/auth-master deliver_log_format = mail from %f: msgid=%m %$ log_path = /var/log/dovecot/lda-errors.log info_log_path = /var/log/dovecot/lda-deliver.log lda_mailbox_autocreate = yes lda_mailbox_autosubscribe = yes # postmaster_address = root } protocol lmtp { info_log_path = /var/log/dovecot/lmtp.log mail_plugins = quota sieve postmaster_address = postmaster lmtp_save_to_detail_mailbox = yes recipient_delimiter = + } protocol imap { mail_plugins = $mail_plugins imap_acl imap_client_workarounds = tb-extra-mailbox-sep mail_max_userip_connections = 30 } protocol pop3 { mail_plugins = $mail_plugins pop3_client_workarounds = outlook-no-nuls oe-ns-eoh pop3_uidl_format = %08Xu%08Xv mail_max_userip_connections = 30 } service imap-login { service_count = 1 process_limit = 500 } service pop3-login { service_count = 1 } service managesieve-login { inet_listener sieve { port = 4190 } } service stats { unix_listener stats-reader { user = vmail group = vmail mode = 0660 } unix_listener stats-writer { user = vmail group = vmail mode = 0660 } } namespace { type = private separator = / prefix = inbox = yes mailbox Sent { auto = subscribe special_use = \Sent } mailbox "Sent Messages" { auto = no special_use = \Sent } mailbox "Sent Items" { auto = no special_use = \Sent } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Trash { auto = subscribe special_use = \Trash } mailbox "Deleted Messages" { auto = no special_use = \Trash } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Spam { auto = no special_use = \Junk } mailbox "Junk E-mail" { auto = no special_use = \Junk } mailbox Archive { auto = no special_use = \Archive } mailbox Archives { auto = no special_use = \Archive } } namespace { type = shared separator = / prefix = Shared/%%u/ location = maildir:%%h:INDEX=%h/shared/%%u subscriptions = yes list = children }

Обращаю внимание на параметры ssl_protocols = !SSLv2 !SSLv3 и ssl = required. Они актуальны до версии Dovecot v2.2. В версии 2.3 и выше будет ошибка на этот параметр. Его надо будет заменить на ssl_min_protocol. В официальных репах centos как обычно старый софт, но возможно через некоторое время появится новая версия и конфиг надо будет поправить. Подробнее в документации dovecot.

ssl_min_protocol = SSLv3

Создаем группу и пользователя с указанными в конфиге uid 1000. Если у вас уже занят этот uid, то везде замените его на другой или удалите пользователя с uid 1000, если он вам не нужен.

# groupadd  -g 1000 vmail
# useradd -d /mnt/mail/ -g 1000 -u 1000 vmail
# chown vmail. /mnt/mail

Создаем конфигурационные файлы для доступа к mysql базе.

# mcedit /etc/dovecot/dovecot-mysql.conf
driver = mysql
default_pass_scheme = CRYPT
connect = host=127.0.0.1 dbname=postfix user=postfix password=123
user_query = SELECT '/mnt/mail/%d/%u' as home, 'maildir:/mnt/mail/%d/%u' as mail, 1000 AS uid, 1000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password, '/mnt/mail/%d/%u' as userdb_home, 'maildir:/mnt/mail/%d/%u' as userdb_mail, 1000 as userdb_uid, 1000 as userdb_gid, concat('*:bytes=', quota) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1'

Обращаю внимание на параметр шифрования паролей. Если пароли не зашифрованы, то параметр будет PLAIN.

Создадим директорию и файлы для логов.

# mkdir /var/log/dovecot
# cd /var/log/dovecot && touch main.log info.log debug.log lda-errors.log lda-deliver.log lmtp.log
# chown -R vmail:dovecot /var/log/dovecot

Создаем служебную папку для плагина acl.

# mkdir /mnt/mail/shared-folders
# chown -R vmail. /mnt/mail

На этом основная настройка почтового сервера на базе postfix и dovecot завершена. Можно запускать службы и проверять работу системы.

# systemctl restart postfix
# systemctl start dovecot
# systemctl enable postfix
# systemctl enable dovecot

Обе службы должны запуститься без ошибок. Если это не так, то разбирайтесь в чем проблема. Скорее всего где-то ошиблись в конфигах.

Проверка работы почтового сервера

Самый простой и быстрый способ проверить работу почтового сервера — отправить на него письмо. Я буду отправлять со своего почтового адреса zeroxzed@gmail.com на адрес root@kirushin-vladimir.ru. Вот что должно быть в логе, если у вас все правильно настроено и почтовый сервер нормально работает.

# cat /var/log/maillog
Feb 10 16:07:21 mail postfix/smtpd[12646]: connect from mail-ua1-f44.google.com[209.85.222.44]
Feb 10 16:07:22 mail postfix/smtpd[12646]: Anonymous TLS connection established from mail-ua1-f44.google.com[209.85.222.44]: TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
Feb 10 16:07:22 mail postfix/smtpd[12646]: 7CB35120E58: client=mail-ua1-f44.google.com[209.85.222.44]
Feb 10 16:07:22 mail postfix/cleanup[12651]: 7CB35120E58: message-id=<CAHWPLcMu2=VCy_ZmNJH4QG1NeR=EoxcFaxjaCvFXcX+-3Ko-fw@mail.gmail.com>
Feb 10 16:07:22 mail postfix/qmgr[12645]: 7CB35120E58: from=<zeroxzed@gmail.com>, size=4233, nrcpt=2 (queue active)
Feb 10 16:07:22 mail postfix/smtpd[12646]: disconnect from mail-ua1-f44.google.com[209.85.222.44] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Feb 10 16:07:22 mail postfix/pipe[12652]: 7CB35120E58: to=<all_in@kirushin-vladimir.ru>, relay=dovecot, delay=0.45, delays=0.29/0.02/0/0.14, dsn=2.0.0, status=sent (delivered via dovecot service)
Feb 10 16:07:22 mail postfix/pipe[12653]: 7CB35120E58: to=<root@kirushin-vladimir.ru>, relay=dovecot, delay=0.47, delays=0.29/0.03/0/0.14, dsn=2.0.0, status=sent (delivered via dovecot service)
Feb 10 16:07:22 mail postfix/qmgr[12645]: 7CB35120E58: removed

Пояснять тут нечего, по логу все понятно. Было подключение от сервера mail-ua1-f44.google.com[209.85.222.44] с использованием протокола шифрования и шифров TLSv1.3 with cipher TLS_AES_128_GCM_SHA256.

Письмо было доставлено в указанный ящик и в общий ящик для сбора всей входящей почты. В директории /mnt/mail была создана директория с именем домена kirushin-vladimir.ru, а в ней созданы 2 папки с именами ящиков:

  • all_in@kirushin-vladimir.ru
  • root@kirushin-vladimir.ru

Директории с почтовыми ящиками создаются в момент получения первого письма в ящик. Непрочитанное письмо помещается в директорию /new в почтовом ящике. После прочтения переносится в /cur.

Попробуем теперь подключиться к почтовому ящику по imap, прочитать письмо и отправить ответ. Настроим любой почтовый клиент для проверки работы настроенного почтового сервера. Я для этих целей буду использовать Thunderbird. Из всех почтовых клиентов мне он нравится больше всего. В основном из-за его портированной версии. Указываем следующие настройки.

Настройка Thunderbird

Так как мы используем самоподписанный сертификат ssl, почтовый клиент предупредит нас о том, что серверу нельзя доверять.

Проверка сертификата

Нас это не пугает, добавляем сертификат в список доверенных и продолжаем работать. Позже получим и настроим нормальный сертификат. На этом этапе чаще всего возникают проблемы. Если не получается подключиться к ящику, смотрите логи postfix и dovecot. Можете показать ошибки в комментариях, я подскажу, в какую сторону смотреть.

Я подключился к почтовому ящику и увидел тестовые письма. Отвечу на одно из них и посмотрю в логе, как прошла отправка. У меня еще раз выскочило окно с предупреждением о небезопасном сертификате. Еще раз добавляю его в исключения. Это нормально, сертификат проверяется во время получения почты в dovecot, а во время отправки в postfix. Так что нужны 2 подтверждения. Отправляю письмо еще раз и смотрю лог.

# cat /var/log/maillog
Feb 10 17:26:05 mail postfix/submission/smtpd[13896]: connect from unknown[176.118.159.81]
Feb 10 17:26:05 mail postfix/submission/smtpd[13896]: Anonymous TLS connection established from unknown[176.119.158.81]: TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
Feb 10 17:26:06 mail postfix/submission/smtpd[13896]: 06F62120E56: client=unknown[176.118.159.81], sasl_method=PLAIN, sasl_username=root@kirushin-vladimir.ru
Feb 10 17:26:06 mail postfix/cleanup[13901]: 06F62120E56: message-id=<a8d829a4-8e24-347b-0181-fe534ac9039f@kirushin-vladimir.ru>
Feb 10 17:26:06 mail postfix/qmgr[13803]: 06F62120E56: from=<root@kirushin-vladimir.ru>, size=3333, nrcpt=2 (queue active)
Feb 10 17:26:06 mail postfix/submission/smtpd[13896]: disconnect from unknown[176.118.159.81] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8
Feb 10 17:26:06 mail postfix/pipe[13904]: 06F62120E56: to=<all_out@kirushin-vladimir.ru>, relay=dovecot, delay=0.22, delays=0.07/0.02/0/0.13, dsn=2.0.0, status=sent (delivered via dovecot service)
Feb 10 17:26:06 mail postfix/smtp[13905]: Untrusted TLS connection established to gmail-smtp-in.l.google.com[64.233.162.26]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
Feb 10 17:26:06 mail postfix/smtp[13905]: 06F62120E56: to=<zeroxzed@gmail.com>, relay=gmail-smtp-in.l.google.com[64.233.162.26]:25, delay=0.87, delays=0.07/0.03/0.42/0.35, dsn=2.0.0, status=sent (250 2.0.0 OK  1581344766 w2si182048lfl.121 - gsmtp)
Feb 10 17:26:06 mail postfix/qmgr[13803]: 06F62120E56: removed

Все в порядке. Видно подключение с моего ip, успешную sasl авторизацию, формирование письма на сервере, присваивание ему message-id, отправка копии письма в ящик для сбора исходящей почты и отправка оригинала в ящик получателя. Все этапы прошли без ошибок.

Расскажу, куда еще надо смотреть для отладки почтовой системы. Да и не только отладки, во время работы периодически придется разбираться, куда ушло то или иное письмо, кто и когда подключался к ящику. Разные ситуации бывают. В файле /var/log/dovecot/lda-deliver.log содержится информация обо всех пришедших письмах — когда, от кого и в какой ящик было положено.

Feb 10 16:13:30 lda(root@kirushin-vladimir.ru): Info: mail from zeroxzed@gmail.com: msgid=<CAHWPLcNe-a7J3EqDOHJv0iD73NBRfUHNbTwPuZ3RChH=giHtHA@mail.gmail.com> saved mail to INBOX
Feb 10 17:26:06 lda(all_out@kirushin-vladimir.ru): Info: mail from root@kirushin-vladimir.ru: msgid=<a8d829a4-8e24-347b-0181-fe534ac9039f@kirushin-vladimir.ru> saved mail to INBOX

В /var/log/dovecot/info.log информация о подключениях к почтовым ящикам — кто, когда, откуда и каким способом авторизовывался на сервере.

Feb 10 17:26:06 imap-login: Info: Login: user=<root@kirushin-vladimir.ru>, method=PLAIN, rip=176.118.159.81, lip=5.180.137.106, mpid=13908, TLS, session=<l20RhTmeXAawd55R>
Feb 10 17:26:06 imap(root@kirushin-vladimir.ru): Info: Logged out in=3131 out=590
Feb 10 17:26:13 imap-login: Info: Login: user=<root@kirushin-vladimir.ru>, method=PLAIN, rip=176.118.159.81, lip=5.180.137.106, mpid=13910, TLS, session=<ExF+hTmeXwawd55R>

Остальное уже не так полезно. Сами посмотрите, что собирается в остальных лог файлах.

На текущий момент почтовый сервер на базе postfix работоспособен. В таком виде им без проблем можно пользоваться. Но функционал полностью не раскрыт. Использовать плагины sieve и acl через удаленные почтовые клиенты неудобно. Проще всего их настроить через web почту roundcube. Установим эту web панель на наш почтовый сервер.

Установка web интерфейса roundcube

Установим и настроим самый популярный web интерфейс для postfix — roundcube. Вообще говоря, его не обязательно ставить на почтовый сервер. Более того, я бы рекомендовал его ставить в другое место. Если в инфраструктуре имеется отдельный веб сервер, лучше поставить roundcube туда. Но в рамках этой статьи, я все буду ставить на один сервер для простоты и наглядности. Если у вас все получится на одном сервере, потом сможете не спеша все разнести по разным/

Скачиваем исходники последней lts версии roundcube. Я обычно использую именно lts версию, хотя она достаточно старая. Но моя практика показывает, что именно в ней все работает стабильно и сразу, без лишней возни. К примеру, когда я готовил эту статью, у меня не получилось настроить работу автоответчика, о котором я расскажу отдельно ниже. Я его включал, а он просто не работает. За разумный срок (1 час) я не смог выяснить причину этого и опять откатился на lts версию, где все заработало сразу.

Если есть желание, можете попробовать последнюю версию. Может все, что вам надо, заработает. Но в целом, там во всех версиях все примерно одинаковое. В новых версиях есть адаптивный скин, но лично мне он все равно не понравился, я использую стандартный larry.

# cd ~
# wget https://github.com/roundcube/roundcubemail/releases/download/1.4.9/roundcubemail-1.4.9-complete.tar.gz

Распаковываем и перемещаем на веб-сервер.

# tar xzvf roundcubemail-1.4.9-complete.tar.gz
# mkdir /var/www/html/webmail
# cp -R /root/roundcubemail-1.4.9/* /var/www/html/webmail
# chown -R apache. /var/www/html/webmail
Не забудьте проверить в момент установки номер актуальной версии roundcube и заменить его в приведенных выше командах.

Устанавливаем дополнительные модули php.

# dnf --enablerepo=remi install php-pear php-mcrypt php-intl php-ldap php-pear-Net-SMTP php-pear-Net-Sieve php-pear-Mail-Mime php-pear-Net-IDNA2

Последние три у меня почему-то не установились сразу из репозитория Remi, хотя они там есть, пока я не добавил явно ключ enablerepo=remi. Какой-то нюанс с работой новых репозиториев в Centos 8, с которым я еще не разобрался. Если вдруг они у вас не ставятся, можете напрямую поставить по ссылкам. Если кто-то понимает, почему они не ставятся обычным образом, прошу подсказать. Я не стал разбираться, чтобы не затягивать публикацию статьи.

# dnf install http://rpms.remirepo.net/enterprise/8/remi/x86_64/php-pear-Net-Sieve-1.4.4-1.el8.remi.noarch.rpm
# dnf install http://rpms.remirepo.net/enterprise/8/remi/x86_64/php-pear-Mail-Mime-1.10.8-1.el8.remi.noarch.rpm
# dnf install http://rpms.remirepo.net/enterprise/8/remi/x86_64/php-pear-Net-IDNA2-0.2.0-1.el8.remi.noarch.rpm

Указываем часовой пояс в php. Добавляем в /etc/php.ini:

date.timezone = Europe/Moscow

Перезапускаем apache и php-fpm.

# systemctl restart httpd php-fpm

Идем по адресу http://5.180.137.106/webmail/installer/ и проверяем окружение. Вы увидите несколько незначительных замечаний. На них можно не обращать внимание, если установщик позволяет нажать кнопку NEXT.

На следующем этапе нам надо указать настройки подключения к mysql базе. Предварительно ее следует создать через phpmyadmin. Я создал пользователя roundcube и такую же базу с полными правами пользователя на нее. Эти параметры указал в настройках.

Установка roundcube

Так же на этой странице нужно будет указать несколько параметров:

  • smtp_server - localhost
  • smtp_port — 25
  • Use the current IMAP username and password for SMTP authentication - галочка должна стоять
  • language — ru_RU
  • skin - larry (мне он просто больше нравится, потом можно поменять)
  • Выбираем плагины — acl, managesieve, userinfo. Остальные на свое усмотрение.

Жмем CREATE CONFIG. Должны увидеть сообщение:

The config file was saved successfully into RCMAIL_CONFIG_DIR directory of your Roundcube installation.

Жмем CONTINUE. Открывается страница с проверкой настроек. Нам нужно инициализировать базу данных. Для этого жмите на соответствующую кнопку.

Инициализация бд для roundcube

Тут проверять отправку почты неудобно, можно этого не делать. Зайдем в почтовый ящик и там все проверим. Если что, конфиг потом все равно можно вручную отредактировать. Папку /var/www/html/webmail/installer удаляем. Заходим в почтовый ящик через roundcube — http://5.180.137.106/webmail/ Набирать нужно полное имя ящика и пароль. Если все сделали правильно, должны попасть в свой почтовый ящик.

Почтовый ящик в roundcube

Можете попробовать написать и отправить письмо. В настройках можно изменить некоторые параметры web интерфейса. Если будут какие-то ошибки, можно посмотреть лог самого roundcube - /var/www/html/webmail/logs/errors.log Он достаточно информативен. В этой же директории будет вестись лог всех отправленных писем через web интерфейс.

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

Настройка фильтра почты sieve

Sieve очень удобная штука, но вот хорошего интерфейса для управления через почтовый клиент я не знаю. Существует плагин для thunderbird, который так и называется sieve. Но лично мне он не понравился вообще, так как предлагает писать правила определенным кодом. Для этого надо знать синтаксис, тратить время. Можете сами на него посмотреть — https://github.com/thsmi/sieve.

К счастью, есть удобный способ писать правила фильтрации для sieve через roundcube. Там это реализовано отдельным плагином managesieve, который мы активировали во время установки. Его конфиг находится в директории /var/www/html/webmail/plugins/managesieve. Скопируйте дефолтный конфиг и проследите, чтобы там были следующие настройки.

# cp config.inc.php.dist config.inc.php
$config['managesieve_port'] = 4190;
$config['managesieve_host'] = 'localhost';
$config['managesieve_usetls'] = false;

Для создания правила фильтрации, зайдите в свой почтовый ящик через roundcube. Переходите в раздел Настройки -> Фильтры и создавайте новое правило.

Создание фильтра sieve в roundcube

После этого письма будут обрабатываться правилом сразу после поступления в почтовый сервер, в независимости от вашего подключения к ящику. В ящике в папке .sieve появилась запись с настроенным правилом. Можете познакомиться с синтаксисом написания правил. Он не сложный.

Настройка автоответчика

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

Для того, чтобы модуль автоответчика заработал, отредактируйте конфигурационный файл плагина. Для этого открываем его в моем случае по следующему адресу:

# mcedit /var/www/html/webmail/plugins/managesieve/config.inc.php

Изменяем там параметр:

$config['managesieve_vacation'] = 1;

После этого достаточно просто обновить веб интерфейс roundcube, и появятся новые настройки по адресу Настройки -> Отпуск.

Настройка автоответчика в почте

На вкладке Дополнительные настройки есть возможность настроить различные полезные действия, в том числе пересылку входящей почты вашему заместителю. По своей сети настройка автоответчика это просто создание еще одного правила sieve для всей входящей почты.

Общие папки по imap

Рассмотрим настройку необычного и полезного функционала в виде общих папок. С их помощью один пользователь почтового ящика может предоставить другому пользователю доступ к папке внутри своего почтового ящика. Где и как использовать этот функционал, каждый может придумать сам, в зависимости от своих потребностей. Мне кажется это удобным в том случае, когда создан какой-то общий ящик, на который только поступает информация и нет необходимости писать ответ от его имени. То есть по сути работает как обычный почтовый алиас. Но в случае с алиасом и несколькими почтовыми ящиками, письмо падает в каждый ящик. Если таких писем и получателей много, то идет большое дублирование одного и того же письма в рамках почтового сервера. Если сделать ящик и расшарить на нем папку, подключить ее всем пользователям, то дублирования почты не будет. Каждый сможет прочитать письмо, без необходимости его доставки в каждый конкретный ящик.

Настроим общую папку imap. Хотя настраивать нам, по сути, нечего. Мы уже все настроили ранее. Добавили соответствующие настройки в dovecot и активировали плагин acl в roundcube. Теперь нужно просто сделать папку и открыть ее для другого пользователя. Для этого идем в раздел Настройки -> Папки. Создаем там любую папку. В моем случае это папка с названием Общая. После того, как создали папку, открываем ее еще раз.

Настройка общих папок в imap

Добавляем необходимый доступ либо всем ящикам в домене, либо какому-то конкретному. Так же можно указать, какого рода это будет доступ:

  • чтение
  • запись
  • удаление
Разрешение на общую папку imap

Заходим в ящик, которому добавили общий доступ и проверяем.

Подключение общей папки imap

Все в порядке, общая папка imap настроена и подключена. В папке /mnt/mail/shared-folders появился файл с настроенным выше правилом.

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

Настройка DKIM

Напишу своими словами как я понимаю работу dkim. С помощью dkim вся исходящая почта сервера подписывается электронной цифровой подписью, связанной с именем домена. Открытый ключ шифрования с помощью DNS публикуется в txt записи. Таким образом, удаленный сервер, при получении письма от вас, сравнивает цифровую подпись с опубликованным в dns открытым ключом вашего домена. Если все в порядке, то считает, что ваше письмо в самом деле пришло от вас, а не от мошенников. То есть с помощью этой технологии можно однозначно идентифицировать отправителя.

Не путать эту технологию с защитой от спама. Защиты тут нет. Любой спамер так же может себе сделать dkim подпись. Спамеру не составит большого труда настроить на своем сервере dkim и отправлять спам, но подписанный электронной цифровой подписью. Теоретически, dkim помогает защититься от подделки адреса отправителя, когда письмо якобы от вас шлет совсем другой сервер. Но с этим можно бороться и другими способами. В общем, я до конца не понимаю, зачем это надо. Я много лет эксплуатировал сервера без dkim подписей и проблем это не вызывало. Но так как настроить dkim не сложно, сейчас всегда это делаю.

Установка dkim на Centos 8 на момент написания статьи имеет некоторые сложности. Дело в том, что этого пакета до сих пор нет в стабильной версии репозитория Epel, где он обычно был для предыдущих версию. Хорошая новость в том, что он уже есть в тестовой ветке. Если будете настраивать по статье, то сначала попробуйте просто установить пакет через dnf из обычного репозитория epel. Если его там не будет, то ставьте из тестовой ветки, как я.

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

# dnf install opendkim

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

# mkdir -p /etc/postfix/dkim && cd /etc/postfix/dkim

Генерируем ключи для домена:

# opendkim-genkey -D /etc/postfix/dkim/ -d kirushin-vladimir.ru -s mail
kirushin-vladimir.ru имя почтового домена
mail непосредственно имя сервера

На выходе получаете пару файлов — закрытый (приватный) и открытый ключ. Закрытый останется на сервере, открытый будет опубликован в dns. Переименуем их сразу, чтобы не путаться, если у вас будет несколько доменов. Ключи нужно будет делать для каждого домена.

# mv mail.private mail.kirushin-vladimir.ru.private
# mv mail.txt mail.kirushin-vladimir.ru.txt

Создаем файл с таблицей ключей, в которой будут описаны все домены. В данном случае только один.

# mcedit keytable
mail._domainkey.kirushin-vladimir.ru kirushin-vladimir.ru:mail:/etc/postfix/dkim/mail.kirushin-vladimir.ru.private

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

# mcedit signingtable
*@kirushin-vladimir.ru mail._domainkey.kirushin-vladimir.ru

Выставляем права доступа на все файлы:

# chown root:opendkim *
# chmod u=rw,g=r,o= *

Рисуем конфиг службы.

# mcedit /etc/opendkim.conf
AutoRestart Yes
AutoRestartRate 10/1h
PidFile /var/run/opendkim/opendkim.pid
Mode sv
Syslog yes
SyslogSuccess yes
LogWhy yes
UserID opendkim:opendkim
Socket inet:8891@localhost
Umask 022
Canonicalization relaxed/relaxed
Selector default
MinimumKeyBits 1024
KeyFile /etc/postfix/dkim/mail.kirushin-vladimir.ru.private
KeyTable /etc/postfix/dkim/keytable
SigningTable refile:/etc/postfix/dkim/signingtable

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

# mcedit /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 2

Перезапускаем postfix и dkim, последний добавляем в автозагрузку.

# systemctl restart postfix
# systemctl restart opendkim.service
# systemctl enable opendkim.service

Теперь нам надо добавить открытый ключ в dns. Идем в консоль управления dns и добавляем новую txt запись. Ее содержание берем из файла /etc/postfix/dkim/mail.kirushin-vladimir.ru.txt

# cat /etc/postfix/dkim/mail.kirushin-vladimir.ru.txt
mail._domainkey	IN	TXT	( "v=DKIM1; k=rsa; "
	  "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRrqwnax3Slj2dkrrf3hk1X0pfSOWxPh67KYuz2lEwH/rEQARKs1W9bx/QTV5aQQ/pPEsJiEmVXbPjP8aYpfmSg16FA61SuVJBy2Or+xwVGjLDVkGFm1Lu/lxfViWtPaMR5PH2xTceoQfLkF+93y99KfgzTQ0UjAZcyvcPLuYdqQIDAQAB" )  ; ----- DKIM key mail for kirushin-vladimir.ru

Убираем кавычки, лишние проблемы и вставляем. Должно получиться вот так:

Настройка dkim

Проверяю работу. Отправляю письмо на gmail и смотрю лог почтового сервера:

# cat /var/log/maillog
Feb 11 12:20:38 mail postfix/smtpd[19615]: connect from localhost[127.0.0.1]
Feb 11 12:20:38 mail postfix/smtpd[19615]: 4C1A4120F65: client=localhost[127.0.0.1], sasl_method=LOGIN, sasl_username=root@kirushin-vladimir.ru
Feb 11 12:20:38 mail postfix/cleanup[19623]: 4C1A4120F65: message-id=<9f2b1abb24603b73584b05d89011adf5@kirushin-vladimir.ru>
Feb 11 12:20:38 mail opendkim[19547]: 4C1A4120F65: DKIM-Signature field added (s=mail, d=kirushin-vladimir.ru)
Feb 11 12:20:38 mail postfix/qmgr[19542]: 4C1A4120F65: from=<root@kirushin-vladimir.ru>, size=685, nrcpt=2 (queue active)
Feb 11 12:20:38 mail postfix/pipe[19627]: 4C1A4120F65: to=<all_out@kirushin-vladimir.ru>, relay=dovecot, delay=0.23, delays=0.15/0.02/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
Feb 11 12:20:38 mail postfix/smtpd[19615]: disconnect from localhost[127.0.0.1] ehlo=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=6
Feb 11 12:20:38 mail postfix/smtp[19628]: Untrusted TLS connection established to gmail-smtp-in.l.google.com[64.233.162.26]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
Feb 11 12:20:39 mail postfix/smtp[19628]: 4C1A4120F65: to=<zeroxzed@gmail.com>, relay=gmail-smtp-in.l.google.com[64.233.162.26]:25, delay=1.5, delays=0.15/0.03/0.38/0.97, dsn=2.0.0, status=sent (250 2.0.0 OK  1581412839 y133si1852705lfc.170 - gsmtp)
Feb 11 12:20:39 mail postfix/qmgr[19542]: 4C1A4120F65: removed

Все в порядке, электронная цифровая подпись установлена. Проверим, как гугл отреагировал на нашу подпись:

Проверка dkim

Тоже все в порядке. Подпись выполнена корректно, проверку прошла. Дополнительно, проверить корректность dkim записи в dns можно онлайн сервисом — http://dkimcore.org/c/keycheck.

Настройка SPF

Настроим еще одно средство для повышения доверия к нашей почте со стороны других серверов — spf. Расскажу опять своими словами для чего это нужно. Spf запись добавляется в виде txt записи в dns вашего домена. С помощью этой записи вы указываете, какие ip адреса имеют право отправлять почту от вашего имени. Если кто-то из спамеров будет использовать ваше имя домена при рассылке спама, он не пройдет проверку по spf и скорее всего будет идентифицирован как спам.

Можно указать конкретные ip адреса в записи, а можно сказать, чтобы ip адреса проверялись по спискам A и MX записей. У нас простой случай и только 1 сервер с одним ip, поэтому укажем конкретно этот ip адрес. Идем в панель управления dns и добавляем новую txt запись.

kirushin-vladimir.ru. TXT v=spf1 ip4:5.180.137.106 ~all
Настройка spf

Больше ничего делать не надо. Можно снова отправить письмо на gmail и проверить. Обращаю внимание, что на прошлом скрине в gmail уже было указано, что проверка spf прошла, хотя txt запись еще не была создана. Гугл умный. Думаю, он автоматом сопоставил все dns записи домена и сам убедился, что отправка идет с доверенного сервера, к которому привязана A запись и MX запись.

Но отправка может идти не только с почтового сервера. К примеру, может быть отдельно web сервер с интернет магазином. Он по каким-то причинам может отправлять почту сам (нет модуля для smtp отправки, не работает smtp авторизация, разработчики хотят использовать php_mail и т.д.), а не через настроенный почтовый сервер. Так часто бывает. Тогда нужно обязательно добавить в spf запись ip адрес этого web сервера, с которого будет идти отправка.

Настройка DMARC

Для настройки DMARC на самом почтовом сервере ничего делать не надо. По своей сути это просто указание другим, что делать с письмами от вас, не прошедшими проверки dkim и spf (которые являются подделками, если у вас все настроено правильно). Для этого сам принимающий почтовый сервер должен поддерживать работу в соответствии с dmark. Плюс, для вашего домена должны быть настроены правила, что делать в том или ином случае.

Есть три типа действий, которые можно настроить с помощью dmark:

  1. Отклонить письмо.
  2. Пометить письмо как спам.
  3. Ничего не делать.

При этом можно настроить при каждом действии формирование отчета и отправку его на какой-то email адрес. Я очень осторожно отношусь к этим правилам и никогда не настраиваю блокировку или пометку о спаме. Так можно выстрелить себе в ногу и загубить всю свою почту из-за какой-нибудь ошибки. Мне кажется разумнее всего настроить пропускание всех писем, но сделать отправку отчетов на свой существующий адрес. Если вы заметите какую-то подозрительную активность по отчетам, то можно будет временно изменить настройки, чтобы помечать все поддельные письма, к примеру, как спам.

Указанные правила мы сейчас и добавим с помощью txt записи в DNS. Запись будет такая:

v=DMARC1; p=none; rua=mailto:dmarc@kirushin-vladimir.ru
Настройка dmarc

Отчеты будут приходить в xml формате. Нужно будет еще потрудиться, чтобы в них разобраться :) В общем случае, я вообще не слежу за dmark. Думаю, это актуально только для крупных компаний, где есть отдельные люди, которые занимаются обслуживанием почты.

Дополнительный функционал почтового сервера postfix

Я рассмотрел и настроил наиболее актуальный с моей точки зрения функционал почтового сервера. В статье я основывался исключительно на своем опыте работы с почтой в малых и средних организациях, поэтому не претендую на истину в последней инстанции. Рекомендую осмысленно подходить к настройке своего сервера и решать, что нужно именно вам. Будет хорошо, если кто-то укажет на мои ошибки или подскажет какие-то более удобные и эффективные приемы для решения затронутых задач.

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

  1. Защиту от подбора паролей с помощью fail2ban.
  2. Мониторинг почтового сервера postfix с помощью zabbix.
  3. Сбор статистики с помощью pflogsumm или чего-то подобного.
  4. Просмотр и анализ логов с помощью webmin.
  5. Использование бесплатных сертификатов let’s encrypt.
  6. Регулярную очистку служебных почтовых ящиков.
  7. Бэкап всей почтовой базы.
  8. Сбор логов с почтовых серверов в ELK Stack.

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

  1. Clamav — известный антивирус. Считаю, что сейчас он не актуален, так как вирусов, от которых он способен защитить, я уже давно не видел. Сейчас вирусная эпидемия шифровальщиков. От них он не защищает.
  2. Spamassasin — популярный бесплатный антиспам фильтр. Скажу честно, работал с ним очень мало и могу быть не объективен. Насколько я видел его настройку и работу — он требует к себе некоторого внимания, калибровки, особенно на начальном этапе. Мне обычно не хочется этим заниматься.
  3. Graylist — эффективное средство борьбы со спамом. Я уже подробно его рассматривал, когда писал про iredmail, так что не буду повторяться. Скажу лишь, что режет спам очень эффективно и бесплатно, но есть существенные неудобства, которые по моему мнению не перекрывают плюсы. Поэтому я не использую.

В качестве антиспама я предпочитаю коммерческое решение — Kaspersky Anti-Spam. Я знаю этот продукт уже лет 10. Он действительно отлично фильтрует спам. Ложных срабатываний вообще не припоминаю, 95% спама фильтрует, может больше. Субъективно, работает лучше чем антиспам у того же gmail или яндекса. С ним вопрос спама отпадает вообще. Стоит он недорого, можно купить лицензию на меньшее количество ящиков, чем реально используется в системе. Этот вопрос никак не отслеживается и на качество работы не влияет. Но нужно понимать, что это уже нарушение лицензионного соглашения. Но можно всякие хитрости придумать, чтобы и фильтровать и не нарушать.

Борьба со спамом средствами postfix

Сначала хотел сразу все настройки postfix разместить в соответствующем разделе в едином конфиге, но потом передумал и решил все же вынести этот вопрос на отдельное рассмотрение. Возможно, не каждому захочется сразу в эту тему углубляться. Все, что рассказано выше, позволит настроить полноценный почтовый сервер, который будет успешно принимать почту и доставлять ее пользователям. Но в таком виде он будет принимать слишком много спама, но зато не будет проблем с тем, что от кого-то что-то не придет. Как ни крути, но все средства борьбы со спамом так или иначе несут накладные расходы в виде ложных срабатываний с той или иной вероятностью. Если вы решите не заморачиваться и купить Kaspersky Anti-Spam, можете этот раздел не читать. Он сам реализует все те проверки, что мы будем делать. Если же хотите своими силами бороться со спамом средствами postfix, то давайте дальше разбираться.

Я буду использовать штатные возможности postfix, позволяющие отсеять спам по тем или иным параметрам еще до получения письма. Это очень эффективный способ с точки зрения производительности. Благодаря этому, правильно настроенный на отсев спама postfix часто ставят перед exchange, чтобы снизить на него нагрузку. Сразу дам ссылки на официальную документацию с описанием параметров, которые я буду использовать:

  1. smtpd_helo_restrictions
  2. smtpd_sender_restrictions
  3. smtpd_recipient_restrictions
  4. smtpd_data_restrictions
  5. smtpd_client_restrictions

Есть еще парочка — smtpd_etrn_restrictions и smtpd_end_of_data_restrictions, но я ими не пользуюсь.

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

Долго думал, как лучше всего представить информацию по этому разделу. В итоге решил просто написать часть конфига, которая отвечает за restrictions с комментариями. Более подробную информацию по каждой настройке вы можете найти в официальной документации postfix, ссылки я привел выше, либо в гугле. Данные настройки это моя многолетняя калькуляция различных параметров, собранных из черновиков и рабочих серверов. Не везде все было настроено именно в таком виде, так как ситуации бывают разные. Сейчас я постарался все собрать в одном месте и аккуратно описать. Те проверки в борьбе со спамом, что вам не нужны, просто закомментируйте. В конце я еще пройдусь по некоторым из них и поделюсь своим опытом.

#Описание списков исключений
smtpd_restriction_classes = white_client_ip,
                            black_client_ip,
                            block_dsl,
                            white_client,
                            white_helo,
                            black_client,
                            mx_access

# IP адреса, которые нужно пропускать всегда
white_client_ip		= check_client_access hash:/etc/postfix/lists/white_client_ip

# IP адреса, которые нужно блокировать всегда
black_client_ip		= check_client_access hash:/etc/postfix/lists/black_client_ip

# E-mail, которые нужно пропускать всегда
white_client		= check_sender_access hash:/etc/postfix/lists/white_client

# E-mail, которые нужно блокировать всегда
black_client		= check_sender_access hash:/etc/postfix/lists/black_client

# Неправильные значения HELO, которые мы тем не менее принимаем
white_helo = check_sender_access hash:/etc/postfix/lists/white_helo
# Правила для блокировки различных динамических ip.
block_dsl 		= check_client_access regexp:/etc/postfix/lists/block_dsl

# Список приватных сетей, которые не могут быть использованы в качестве IP для MX записей
mx_access		= check_sender_mx_access cidr:/etc/postfix/lists/mx_access

# Проверки на основе данных, переданных в HELO/EHLO hostname
smtpd_helo_restrictions =	permit_mynetworks,
		permit_sasl_authenticated,
		white_client_ip,
                white_helo,
		black_client_ip,
		block_dsl,
		# Отказываем серверам, у которых в HELO несуществующий или не FQDN адрес 
		reject_invalid_helo_hostname,
		reject_non_fqdn_helo_hostname,
		# Запрещаем приём писем от серверов, представляющихся адресом, для которого не существует A или MX записи.
		reject_unknown_helo_hostname

# Проверки клиентского компьютера или другого почтового сервера, который соединяется с сервером postfix для отправки письма
smtpd_client_restrictions = 	permit_mynetworks,
		permit_sasl_authenticated,
		# Отвергает запрос, когда клиент отправляет команды SMTP раньше времени, еще не зная, поддерживает ли Postfix конвейерную обработку команд ESMTP
		reject_unauth_pipelining,
		# Блокируем клиентов с адресами from, домены которых не имеют A/MX записей
		reject_unknown_address,
		reject_unknown_client_hostname

# Проверки исходящей или пересылаемой через нас почты на основе данных MAIL FROM
smtpd_sender_restrictions =	permit_mynetworks,
		permit_sasl_authenticated,
		white_client,
		black_client,
		# Запрет отправки писем, когда адрес MAIL FROM не совпадает с логином пользователя
		reject_authenticated_sender_login_mismatch,
		# Отклоняем письма от несуществующих доменов
		reject_unknown_sender_domain,
		# Отклоняем письма от доменов в не FQDN формате
		reject_non_fqdn_sender,
		# Отклонение писем с несуществующим адресом отправителя
		reject_unlisted_sender,
		reject_unauth_destination,
		# Отклонять сообщения от отправителей, ящики которых не существуют, использовать аккуратно
		#reject_unverified_sender,
		mx_access

# Правила приема почты нашим сервером на основе данных RCPT TO
smtpd_recipient_restrictions =  permit_mynetworks,
		permit_sasl_authenticated,
		# Отклоняет всю почту, что адресована не для наших доменов
		reject_unauth_destination,
		# Отклонение писем с несуществующим адресом получателя
		reject_unlisted_recipient,
		# Отклоняет сообщения на несуществующие домены
		reject_unknown_recipient_domain,
		# Отклоняет сообщения если получатель не в формате FQDN
		reject_non_fqdn_recipient,
		# Отклоняем прием от отправителя с пустым адресом письма, предназначенным нескольким получателям.
		reject_multi_recipient_bounce

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

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

  • reject_invalid_helo_hostname и reject_unknown_helo_hostname — под эти правила иногда попадают почтовые серверы клиентов, которые не очень хорошо настроены. У них бывают неправильные адреса, кривые записи dns, отсутствие обратных зон и т.д. Их не много, но попадаются. Это не страшно, если вы регулярно следите за сервером. Отправитель получит сразу сообщение о том, что его письмо не дошло до вас. Если он как-то сообщит вам о проблеме, вы легко добавите его в белый список и все будет нормально. Если вам не хочется следить за сервером, лучше не указывайте эти ограничения. Но спам они отсекают не плохо. Сюда попадают все завирусованные компьютеры и сервера без нормальных настроек dns (а их чаще всего и нет).
  • reject_unverified_sender — специально его закомментировал. Я тестировал этот параметр. В принципе, работает нормально, но есть, как обычно, нюансы. Поясню, что делает этот параметр. Когда вам кто-то шлет письмо, ваш сервер обращается к серверу отправителю и спрашивает его стандатрной командой, есть ли на сервере такой отправитель. Если удаленный сервер отвечает, что есть, то никаких проблем — письмо принимается. Если удаленный сервер не отвечает или говорит, что такого адресата нет — письмо отклоняем. Очевидно, что такие проверки создают дополнительную постоянную нагрузку. Это нужно учитывать. К тому же, у вас почтовый лог постоянно будет забит этими проверками, особенно, если вам приходит много спама. На каждое спамовое письмо будет идти проверка, а сервера отправителя скорее всего либо нет, либо он неправильный, либо не отвечает и т.д. Все это будет постоянно проверяться и фиксироваться. В общем, я не использую.

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

soft_bounce = yes

Когда он включен, все ответы сервера с кодами ошибок 5XX, заменяются на 4ХХ. То есть постоянная ошибка, которая сразу отклоняет письмо, заменяется на временную, которая предлагает повторить отправку позже. Таким образом, вы увидите работу всех ограничений, но письма не будут отклонены навсегда. Сервер отправителя через некоторое время снова придет к вам с новой попыткой доставки почты. Письмо безвозвратно не отклоняется. Вы можете проанализировать работу фильтра и решить, ставить его на постоянную работу или с ним что-то не так.

Создадим теперь файлы с белыми и черными списками.

cd /etc/postfix/lists && touch white_client_ip black_client_ip white_client black_client white_helo block_dsl mx_access

Ниже пример содержания этих файлов. Вы можете менять по своему усмотрению.

# cat white_client_ip
195.28.34.162 OK
141.197.4.160 OK
# cat black_client_ip
205.201.130.163 REJECT You IP are blacklisted!
198.2.129.162 REJECT You IP are blacklisted!
# cat white_client
# Принимать всю почту с домена яндекс
yandex.ru OK
# Разрешить конкретный ящик
spammer@mail.ru OK
# cat black_client
# Блокировать всю почту с домена mail.ru
mail.ru REJECT You domain are blacklisted!
# Блокировать конкретный ящик
spam@rambler.ru REJECT You e-mail are blacklisted!
# cat white_helo
# Могут попадаться вот такие адреса, которые не пройдут наши проверки
ka-s-ex01.itk.local     OK
exchange.elcom.local    OK
# cat block_dsl
/^dsl.*\..*\..*/i                               553 AUTO_DSL spam
/dsl.*\..*\..*/i                                553 AUTO_DSL1 spam
/[ax]dsl.*\..*\..*/i                            553 AUTO_XDSL spam
/client.*\..*\..*/i                             553 AUTO_CLIENT spam
/cable.*\..*\..*/i                              553 AUTO_CABLE spam
/pool.*\..*\..*/i                               553 AUTO_POOL spam
/dial.*\..*\..*/i                               553 AUTO_DIAL spam
/ppp.*\..*\..*/i                                553 AUTO_PPP spam
/dslam.*\..*\..*/i                              553 AUTO_DSLAM spam
/node.*\..*\..*/i                               553 AUTO_NODE spam
/([0-9]*-){3}[0-9]*(\..*){2,}/i                 553 SPAM_ip-add-rr-ess_networks
/([0-9]*\.){4}(.*\.){3,}.*/i                    553 SPAM_ip-add-rr-ess_networks
/.*\.pppool\..*/i                               553 SPAM_POOL
/[0-9]*-[0-9]*-[0-9]*-[0-9]*-tami\.tami\.pl/i   553 SPAM_POOL
/pool-[0-9]*-[0-9]*-[0-9]*-[0-9]*\..*/i         553 SPAM_POOL
/.*-[0-9]*-[0-9]*-[0-9]*-[0-9]*\.gtel.net.mx/i  553 SPAM_POOL
/dhcp.*\..*\..*/i                               553 SPAM_DHCP
# cat mx_access
127.0.0.1      DUNNO 
127.0.0.2      550 Domains not registered properly
0.0.0.0/8      REJECT Domain MX in broadcast network 
10.0.0.0/8     REJECT Domain MX in RFC 1918 private network 
127.0.0.0/8    REJECT Domain MX in loopback network 
169.254.0.0/16 REJECT Domain MX in link local network 
172.16.0.0/12  REJECT Domain MX in RFC 1918 private network 
192.0.2.0/24   REJECT Domain MX in TEST-NET network 
192.168.0.0/16 REJECT Domain MX in RFC 1918 private network 
224.0.0.0/4    REJECT Domain MX in class D multicast network 
240.0.0.0/5    REJECT Domain MX in class E reserved network 
248.0.0.0/5    REJECT Domain MX in reserved network

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

После редактирования файлов обязательно выполняем команду на перестроение базы данных. Я перестрою сразу все файлы:

cd /etc/postfix/lists && postmap white_client_ip black_client_ip white_client black_client white_helo block_dsl mx_access

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

Приведу в завершении описания методов борьбы со спамом простой пример. Добавим в black_client почтовый адрес и отправим с него письмо.

# cat black_client
zeroxzed@gmail.com REJECT Your e-mail was banned!
# postmap black_client

Отправляем сообщение и проверяем почтовый лог.

# cat /var/log/maillog
Feb 11 16:21:31 mail postfix/smtpd[20115]: connect from mail-ua1-f48.google.com[209.85.222.48]
Feb 11 16:21:31 mail postfix/smtpd[20115]: Anonymous TLS connection established from mail-ua1-f48.google.com[209.85.222.48]: TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
Feb 11 16:21:32 mail postfix/smtpd[20115]: NOQUEUE: reject: RCPT from mail-ua1-f48.google.com[209.85.222.48]: 554 5.7.1 <zeroxzed@gmail.com>: Sender address rejected: Your e-mail was banned!; from=<zeroxzed@gmail.com> to=<root@kirushin-vladimir.ru> proto=ESMTP helo=<mail-ua1-f48.google.com>
Feb 11 16:21:32 mail postfix/smtpd[20115]: disconnect from mail-ua1-f48.google.com[209.85.222.48] ehlo=2 starttls=1 mail=1 rcpt=0/1 data=0/1 quit=1 commands=5/7

Вот и результат. На этом по борьбе со спамом все.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Проверить настроенный почтовый сервер можно с помощью онлайн сервиса https://www.mail-tester.com. Не факт, что получите максимальный бал, но все недочеты будут указаны. Критичное нужно исправить (например, если обратная зона неправильная), некритичное можно пропустить (если dkim, к примеру, не настраивали).

Кажется все написал, что знал по поводу почтового сервера на linux в небольших и средних организациях. У некоторых может возникнуть вопрос, а зачем свой почтовый сервер? Почему бы не воспользоваться средствами корпоративной почты, которую представляют популярные почтовые сервисы бесплатно? У меня есть определенный опыт на этот счет, в том числе негативный. И если некоторое время назад я считал, что свои почтовые серверы в небольших организациях уже не актуальны, то сейчас я так не думаю, поэтому и появилась эта статья.

Так же вам могут быть полезны мои материалы на тему postfix:

Буду рад замечаниям по делу и советам в комментариях. Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

443 комментария

  1. Виктор

    Статья конечно классная одна из лучших, что мне попадались. Но УВЫ из всего выше описанного не получилось ничего от слова совсем.

  2. Михаил

    Владимир, добрый день.

    После двух лет эксплуатации сервера возник вопрос от пользователя, что у него не синхронизируются вложенные папки.
    Протокол IMAP, конечно.

    Т.е. на одном клиенте он создал папку, в ней для удобства создал папки по контрагентам и туда рассовал письма.
    На другом клиенте при синхронизации верхняя папка создалась, но она пустая.
    Я проверил через веб-интерфейс, на сервере та же ситуация, папка есть, вложенных папок нет.

    По результатам поиска нашел, что данная фича работает при формате ящиков MAILDIR.
    Но у Вас в статье и у меня соответственно так и сделано.

    Какие изменения можно внести в конфиг для разрешения вложенных папок?

    • Ничего особенного делать не надо. Протокол imap поддерживает вложенные папки по умолчанию. По крайней мере я нигде не видел, чтобы это отдельно настраивали. Посмотрите напрямую в директории ящика на сервере, сохраняется ли там структура вложенных папок. Может это глюк клиента и папки реально есть только на каком-то клиенте, где они были сделаны. Может быть с именами что-то не так. Туда попали какие-то спец символы, или неподдерживаемая кодировка, поэтому эти директории не отображаются в других клиентах.

      • Михаил

        Спасибо за ответ.

        Проверил у себя на линуксе, клиент Evolution. Действительно все работает.
        В директории ящика пользователя (и у меня тоже) вложенные папки есть вида /.dir.dir1 ...... /.dir.dirN
        Однако я их вижу и в веб-интерфейсе, и в клиенте, а пользователь не видит нигде.

        Уточнил у пользователя, основной клиент Outlook, второй Thunderbird.
        Когда принесет ноут с основным клиентом, посмотрю, может там подписка на эти папки не включена.

  3. Виктор

    Добрый день!
    А подскажите кто-нибудь, как разрешить писать письма на алиас для всех all@mail.ru (домен изменён) только пользователям домена?
    А то сейчас любой желающий может отправить на него письмо и получит весь офис сразу.

    • Чтобы отправка только для своих пользователей работала, надо немного заморочиться. Но ничего особо сложного нет. Я делал через стандартные recipient_restrictions.

      В конфиге делаем примерно так:

      smtpd_recipient_restrictions = permit_mynetworks,
      permit_sasl_authenticated,
      check_recipient_access hash:/etc/postfix/maillist_access
      ..................................

      Файл maillist_access примерно такого содержания:

      all@mail.ru REJECT

      В итоге все, кто подходят под условие permit_mynetworks и permit_sasl_authenticated смогут отправлять сюда письма, а все остальные нет.

      • Виктор

        Спасибо! Работает. Я думал в эту сторону, но что-то в голове логика не так описывала процесс)

  4. Виктор

    При получении письма с сервера host231.wroclaw.dialog.net.pl, отрабатывает ограничение, указанное в файле block_dsl.
    Строка с - /dial.*\..*\..*/i 553 AUTO_DIAL spam видимо в имени сервера видит часть dial в слове dialog и блокирует.

    Как бороться? Добавить отправителя в white_client?

    • Вообще странно, что по этому правилу срабатывает. Там явно после dial стоит точка, а в домене этого нет. Решать можно по разному. Я лично сам не использую подобные списки с регулярными выражениями. Как раз, чтобы не сталкиваться с ложными срабатываниями, которые хоть и редко, но бывают. А в общем случае просто добавьте в белый список, который стоит раньше ограничивающих правил.

  5. У меня почта работает по вашему примеру.
    Но вот возникает ошибка если я пытаюсь подключить SIEM для отправки почты

    Вот в логах

    warning: TLS library problem: error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:331:

    Подскажите как можно это исправить, если не затруднит

    • Судя по ошибке, подключаемая система использует протокол ssl3, который в настройках сервера отключён. Вам надо его либо разрешить глобально, либо настроить исключение для этой системы. В статье я рассказываю, как это сделать.

      • Благодарю за оперативный ответ! Я нашел в чем проблема. У меня был заблокирован порт 587

      • Непонимаю как у меня вообще почта функционировал при закрытом 587

        • Порт 587 используют клиенты для подключения к серверу. На работу самого сервера это не влияет. Кроме того, клиенты могут и 25 порт использовать для отправки. Без 587 порта можно совершенно спокойно работать с сервером.

  6. Евгений

    Хотел бы поблагодарить автора сайта - Владимира за его отличные статьи! Огромное Вам спасибо, Вы очень помагаете реализовать совсем непростые подчас задачи большому количеству тех. специалистов. Статьи очень полезные и грамотно составленные, еще раз спасибо! А теперь внимание вопрос, не только Вам его задаю а всем учасникам, может кто сталкивался. Наблюдаю интересный глюк (а может и не глюк вовсе) со стороны thunderbird при попытке подключения к серверу. Я остановился как раз на моменте когда сервер уже работает получает письма и пора отправить что то из почтового клиента для проверки. Правда я сразу решил получить постоянный сертификат после чего у меня отвалился Pastfix Admin и Php my Admin, но это я победил благодаря вашему совету перетащить директории вышеуказанных в виртуальный хост. Так вот проблема такова что Thunderbird ни в какую не хочет подключаться к моему серверу из под Windы, у меня есть десктопная Ubuntu на которой подключение к Thunderbird проходит на раз и все проверки тоже. На Windows ни при поиске не находит подходящие варианты ни при ручной настройке тоже, только если указать локальный ip адрес сервера подключение проходит, по публичному ip тоже не находит. Сеть у меня крутится на mikrotik сервер стоит за ним, файрвол отключил вообще на время тестов, необходимые порты для работы сервера проброшены. MX, A запись, PTR прописаны как положено. Посоветуйте в какую сторону копать? Заранее благодарен.

    • Если подключается по IP, но не подключается по доменному имени, значит проблема почти наверняка в DNS. Смотрите, как резолвится имя сервера в IP на проблемной машине.

  7. Александр

    Низкий поклон за статью!
    Все закрутилось вроде.
    Не повторяйте мою ошибку не пытайтесь выполнить инструкцию на CentOS 9 - потеряете день жизни..
    При регистрации домена на nic.ru сразу выбирайте тарифы с dns-master или отдельно услугу dns-хостинг заказывайте, а то записи днс не получится изменить
    DNS записи для nic.ru писал в таком формате (сайт обрезает автоматически лишнее):
    хост ТИП Значение Priority TTL
    mail.domainname.su. A IP-АдрПочтовика 3600 долго обновляется
    domainname.su. MX mail 10 3600 тоже долго
    domainname.su. TXT v=spf1 ip4:IP-АдрПочтовика ~all 3600 txt записи быстро
    _dmarc.domainname.su. TXT v=DMARC1; p=none; rua=mailto:dmarc@domainname.su 3600
    mail._domainkey.domainname.su. TXT v=DKIM1; k=rsa; p=JKYBVYVJ////JJKBKB 3600

    проверял функционирование DKIM и SPF
    записи DKIM c DNS https://mxtoolbox.com/dkim.aspx
    здесь проверял почту (ограничение 3 письма в день): https://www.mail-tester.com/test-ecgfl2ygu
    здесь проверял почту: https://dkimvalidator.com/results
    Проверка DMARC записи через DNS запрос https://fixmypc.ru/services/servis-proverki-dmarc-cherez-dns-zapros-onlain/
    может пригодится кому.

    • DNS хостинг сейчас бесплатен почти у всех крупных хостеров. Так что можно не привязываться к nic.ru и его платным тарифам. Я бы даже добавил, что лучше к ним не привязываться, а использовать кого-то другого.

  8. Александр

    Добрый день
    Огромное спасибо за статью, очень сильно выручила:)
    Работает все - почта уходит, приходит, проходят проверки, проходит синхронизация через imapsync, встает следующий вопрос - как автоматизировать процесс создания почтовых ящиков? Суть в чем - как вы правильно отмечали, начинается массовая миграция почтовых серверов с Яндекса на собственные решения, и вручную заводить 200-300-400 учеток - это процесс для сильных духом..
    Что пытался сделать - с помощью phpmyadmin выполнить следующий запрос:

    INSERT INTO mailbox (username, password, name, maildir, quota, local_part, domain, created, modified, active, phone, email_other, token, token_validity, password_expiry) VALUES ('testuser@mydomain.ru', '{PLAIN}mypassword', 'Test User', 'mydomain.ru/testuser@mydomain.ru/', '0', 'testuser', 'mydomain.ru', '2023-03-21 10:00:00', '2023-03-21 10:00:00', '1', '', '', '', '2023-03-21 10:00:00', '2024-03-21 10:00:00')

    Запрос отрабатывается успешно, в постфиксадмин запись появляется, но в поле "Кому" в разделе "Обзор/Ящики" указано "Forward only", тогда как в ящиках, созданных средствами ПостфиксАдмин указано "Mailbox". При этом, ящик создается, в него можно зайти, на него можно отправить письмо, с него можно отправить письмо, все это появляется на диске в хранилище - т.е. визуально оно все ведет себя как обычный ящик. Но вот это Forward Only очень сильно смущает..

    • Если я не ошибаюсь, после создания ящика создаётся в ещё одной таблице запись. В таблице алиасов. Там указан алиас testuser@mydomain.ru и ящик для этого алиаса тоже testuser@mydomain.ru. В общем, проверьте внимательнее, какие записи добавляет postfixadmin после создания ящика.

      • Александр

        Ура, это победа!:)
        да, в таблице alias все отработало как надо, в обзоре тип изменился на Mailbox:)

  9. Сергей

    Добрый день!
    Есть проблемка с почтовым сервером на Postfix. В организацию передали сервер для корпоративной почты. Хотели рассылать на первом этапе расчетные листы. Во время настройки бух.сервера на один (два) ящика рассылка прошла. При массовой рассылке почтовый сервер заблокировал все запросы, в том числе не дает сотрудникам зайти на свой ящик через RoundCube, который находятся в этом же здании (за этим же «белым» IP), что и сервер рассылки. В какую сторону копать? Массовая рассылка – 1500 писем. Для сервера рассылки завел отдельный ящик.

    • Что тут можно посоветовать заочно. Ничего же не известно. Смотрите настройки почтового сервера на предмет ограничения соединений. И смотрите его лог. Там будет видно, в чём конкретно проблема. Важный момент — отправка почты это одно, а вход в веб интерфейс это другое. Отправляет postfix, а входят через веб интерфейс на imap сервер. Это вообще разные службы.

    • Виктор

      У dovecot есть ограничение на количество одновременных процессов. Я с этим столкнулся. В логах было: master: Warning: service(imap-login): process_limit (300) reached, client connections are being dropped
      Так как мой сервер обслуживает не один домен, а достаточно много, решением было еперключить dovecot в perfomance mode.

      service imap-login {
      inet_listener imap {
      port = 143
      }
      service_count = 0 # performance mode. set to 1 for secure mode - вот тут выставить в 0
      process_min_avail = 1
      }

      У меня это в conf.d/10-master.conf

  10. Добрый день
    Может кто сталкивался с такой задачей: Kaspersky Security 8.0 for Linux Mail Server одновременно с OpenDKIM?
    по отдельности работаю, вместе - ошибка.
    main.cf:
    smtpd_milters = unix:/var/run/klms/klms_milter_sock #настроена по мануалу каспера
    smtpd_milters = inet:127.0.0.1:8891

    • У меня они всегда вместе работают и нет проблем. Через milter сколько угодно сервисов можно подключать. Они не мешают друг другу. Какая у вас ошибка?

      • Александр

        Mar 16 19:04:27 mail postfix/smtpd[199217]: warning: Milter service needs transport:endpoint instead of "smtpd_milters"
        Mar 16 19:04:27 mail postfix/smtpd[199217]: warning: Milter service needs transport:endpoint instead of "="

        • Текст ошибки намекает на то, что что-то не то с синтаксисом. Либо при копировании какие-то лишние символы попали в конфиг, либо ещё что-то. Я бы попробовал напечатать то же самое вручную. Ошибка гласит, что для параметра smtpd_milters система ожидает, что будет тип данных transport:endpoint, что и указано как unix:/var/run/klms/klms_milter_sock, но она не воспринимает это значение, а вместо него получает smtpd_milters, который идёт в следующей строке.
          Вторая ошибка аналогична. Вместо значения transport:endpoint, в параметр приходит символ =.
          Можно ещё попробовать пробелы рядом с равно убрать.

  11. Доброго дня,

    Подскажите а можно как то настроить фильтрацию почты в определенное время.
    Например получаешь на почту много писем в inbox а в конце дня фильтруешь по папкам? Такое можно реализовать?

    Или хотябы просто отфильтровать уже имеющеюся почту. А то если писем накопилось много, то фильтровать это все вручную еще та забота.

    Я так понимаю такое надо через крон делать?

    • Не совсем понял, что именно нужно. В статье описан механизм автоматической фильтрации на стороне почтового сервера. Достаточно настроить правила и они будут автоматически работать сразу, а не только в конце дня. И cron не нужен.

  12. Товарищи, а кто нибудь эту связку с действующими конфигами прикручивал к AD, что бы пользователи при аутентификации проходили проверку на стороне домена?

  13. Евгений

    Борьба со спамом средствами postfix
    вы не указали в каком конфиге нужно добавлять эти параметры и в какое место?!
    Можно пжлста об этом по подробнее!?

  14. Коллеги, оставлю маленькую ремарку (возможно кому-то пригодиться)с середины 2022 года DKIM ставится с репозитория EPEL без проблем.
    Я столкнулся с такой проблемой, после установке opendkim и попытке выполнить команду opendkim-genkey -D /etc/postfix/dkim/ -d example.ru -s smtp-server в консоле выдало ошибку -bash: opendkim-genkey: команда не найдена
    Лечится путем установки sudo dnf -y opendkim-tools

  15. Sep 12 17:01:52 imap-login: Info: Login: user=, method=PLAIN, rip=10.92.131.250, lip=10.92.50.80, mpid=9653, TLS, session=
    Sep 12 17:01:52 imap-login: Info: Login: user=, method=PLAIN, rip=10.92.131.250, lip=10.92.50.80, mpid=9655, TLS, session=

  16. Коллеги. добрый день. не могу подключиться к серверу по локалке. клиент тандерберд при автоопределении настроек клиента выяснил что подключение будет STARTTLS метод аутентификации обычный пароль. пишет проверка пароля прошла успешно, но не может войти на сервер. Возможно. имеется ошибка в конфигурации имени пользователя или пароле. Куда рыть? вот лог постфикс.

    сен 12 16:46:17 smtp-server postfix/smtpd[9600]: connect from Sherko-RA.miac.local[10.92.131.250]
    сен 12 16:46:17 smtp-server postfix/smtpd[9600]: improper command pipelining after EHLO from Sherko-RA.miac.local[10.92.131.250]: QUIT\r\n
    сен 12 16:46:17 smtp-server postfix/smtpd[9593]: improper command pipelining after EHLO from Sherko-RA.miac.local[10.92.131.250]: QUIT\r\n
    сен 12 16:46:17 smtp-server postfix/smtpd[9600]: disconnect from Sherko-RA.miac.local[10.92.131.250] ehlo=1 quit=1 commands=2
    сен 12 16:46:17 smtp-server postfix/smtpd[9593]: disconnect from Sherko-RA.miac.local[10.92.131.250] ehlo=1 quit=1 commands=2

    • Эта ошибка неплохо гуглится. Вариантов, почему она возникла, может быть много. Наверняка где-то в конфигурации ошиблись.

  17. Виктор

    Доброго дня всем.
    Владимир, статьи отличные. Прям как шпаргалка на экзамене)
    У меня странная проблема, перекопал половину интернета, никак не могу разобраться
    Сервер настроен, все работает на одном домене.
    Добавил еще один домен через postfixadmin. В DNS сделал верные записи.
    Почта отправляется, но на прием выдает такую ошибку:
    : mail for vi2tech.ru loops back to myself
    На сервере 2 внешних сетевых интерфейса. Роутинг разведен по разным таблицам.
    В master.cf указаны правила для доменов, какой адрес выбирать для отправки.

    Еще проблема, что в roundcube при входе в ящик под вторым доменом и попытке отправить письмо нет отправителя. И отправленные письма не повляются в папках Отправленные...

    Помогите) Что я делаю не так?

    • Трудно что-то посоветовать. У вас какая-то своя специфика с настройками сети и dns. В общем случае добавление второго домена не требует вообще никаких дополнительных настроек. Просто добавляете через админку и всё работает. На самом почтовом сервере ничего настраивать не надо.

      • Виктор

        Может в MYDESTINATION что-то не хватает?

        [root@mail network-scripts]# postconf -n
        alias_database = hash:/etc/aliases
        alias_maps = hash:/etc/aliases
        anvil_rate_time_unit = 60s
        black_client = check_sender_access hash:/etc/postfix/lists/black_client
        black_client_ip = check_client_access hash:/etc/postfix/lists/black_client_ip
        block_dsl = check_client_access regexp:/etc/postfix/lists/block_dsl
        bounce_queue_lifetime = 1d
        broken_sasl_auth_clients = yes
        command_directory = /usr/sbin
        config_directory = /etc/postfix
        daemon_directory = /usr/libexec/postfix
        data_directory = /var/lib/postfix
        debug_peer_level = 2
        debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
        disable_vrfy_command = yes
        dovecot_destination_recipient_limit = 1
        header_checks = regexp:/etc/postfix/header_checks
        html_directory = no
        inet_interfaces = all
        inet_protocols = ipv4
        mail_owner = postfix
        mailq_path = /usr/bin/mailq.postfix
        manpage_directory = /usr/share/man
        maximal_queue_lifetime = 1d
        message_size_limit = 100000000
        milter_default_action = accept
        milter_protocol = 2
        mx_access = check_sender_mx_access cidr:/etc/postfix/lists/mx_access
        mydestination = localhost.$mydomain, localhost
        mydomain = основнойдомен.ru
        myhostname = mail.основнойдомен.ru
        mynetworks = 127.0.0.0/8 79.***.***.240/28 192.168.0.0/16
        myorigin = $myhostname
        newaliases_path = /usr/bin/newaliases.postfix
        non_smtpd_milters = $smtpd_milters
        queue_directory = /var/spool/postfix
        readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
        recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps
        relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf
        sample_directory = /usr/share/doc/postfix-2.10.1/samples
        sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps
        sender_dependent_default_transport_maps = hash:/etc/postfix/sender_transport
        sendmail_path = /usr/sbin/sendmail.postfix
        setgid_group = postdrop
        smtp_always_send_ehlo = yes
        smtp_tls_security_level = may
        smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache
        smtpd_banner = $myhostname ESMTP $mail_name
        smtpd_client_connection_count_limit = 20
        smtpd_client_connection_limit_exceptions = 127.0.0.0/8 79.***.***.240/28 192.168.0.0/16
        smtpd_client_connection_rate_limit = 30
        smtpd_client_event_limit_exceptions = 127.0.0.0/8 79.***.***.240/28 192.168.0.0/16
        smtpd_client_message_rate_limit = 30
        smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_pipelining, reject_unknown_address, reject_unknown_client_hostname
        smtpd_data_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_pipelining, reject_multi_recipient_bounce,
        smtpd_delay_reject = yes
        smtpd_discard_ehlo_keywords = etrn, silent-discard
        smtpd_error_sleep_time = 20
        smtpd_forbidden_commands = CONNECT GET POST
        smtpd_hard_error_limit = 15
        smtpd_helo_required = yes
        smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, white_client_ip, white_helo, black_client_ip, block_dsl, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname reject_unknown_helo_hostname
        smtpd_milters = inet:127.0.0.1:8891
        smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_unlisted_recipient, reject_unknown_recipient_domain, reject_non_fqdn_recipient, reject_multi_recipient_bounce
        smtpd_restriction_classes = white_client_ip, black_client_ip, block_dsl, white_client, white_helo, black_client, mx_access
        smtpd_sasl_auth_enable = yes
        smtpd_sasl_path = private/dovecot-auth
        smtpd_sasl_security_options = noanonymous
        smtpd_sasl_type = dovecot
        smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, white_client, black_client, reject_authenticated_sender_login_mismatch, reject_unlisted_sender, reject_non_fqdn_sender, reject_unknown_sender_domain reject_unauth_destination, mx_access check_sender_access hash:/etc/postfix/sender_access
        smtpd_soft_error_limit = 10
        smtpd_tls_cert_file = /etc/letsencrypt/live/mail.ОСНОВНОЙДОМЕН.ru/fullchain.pem
        smtpd_tls_key_file = /etc/letsencrypt/live/mail.ОСНОВНОЙДОМЕН.ru/privkey.pem
        smtpd_tls_loglevel = 1
        smtpd_tls_received_header = yes
        smtpd_tls_security_level = may
        smtpd_tls_session_cache_timeout = 3600s
        soft_bounce = no
        tls_random_source = dev:/dev/urandom
        unknown_local_recipient_reject_code = 550
        virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf, mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf
        virtual_gid_maps = static:1000
        virtual_mailbox_base = /hdd/mail
        virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
        virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
        virtual_minimum_uid = 1000
        virtual_transport = dovecot
        virtual_uid_maps = static:1000
        white_client = check_sender_access hash:/etc/postfix/lists/white_client
        white_client_ip = check_client_access hash:/etc/postfix/lists/white_client_ip
        white_helo = check_sender_access hash:/etc/postfix/lists/white_helo
        • Виктор

          Короче, кто грустит - посмейтесь )
          При заведении нового домена в postfixadmin, была установлена галочка "Этот домен является резервным MX". (facepalm.jpeg)
          Снял галку и все норм. Два дня бился....

  18. Доброго вечера!

    Не оставляют попыток разобраться с работой Postfix, сейчас пытаюсь победить такую проблему и буду рад любой помощи так как убил целый день на эту проблему:

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

    Отправляю письмо через 25 порт, использую правильный пароль пользователя - письмо отправлено
    Отправляю письмо через 25 порт, использую неправильный пароль пользователя - письмо отправлено

    Отправляю письмо через 587 порт, использую правильный пароль пользователя - письмо отправлено
    Отправляю письмо через 587 порт, использую не правильный пароль пользователя - письмо не отправлено

    Важно! Отправляется письмо с неправильным паролем только на локальный email-адрес на самом сервере.

    2. Пробовал прописать так (по аналогии с 587 портом и 465):

    smtp inet n - y - - smtpd
    -o smtpd_client_restrictions=permit_sasl_authenticated,reject
    ---------

    ---------
    submission inet n - n - - smtpd
    -o content_filter=scan:[127.0.0.1]:10026
    -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
    -o smtpd_client_restrictions=permit_sasl_authenticated,reject

    smtps inet n - n - - smtpd
    -o content_filter=scan:[127.0.0.1]:10026
    -o syslog_name=postfix/smtps
    -o smtpd_tls_wrappermode=yes
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_client_restrictions=permit_sasl_authenticated,reject

    ---------

    Без правильного пароля письма не отправляются. Но из вне на сервер почта не приходит.

    Вообще варианты разные предлагают:
    https://serverfault.com/questions/1047411/postfix-how-to-enable-smtp-authentication-on-local-delivery
    https://www.linux.org.ru/forum/admin/4508752

    Но ничего из этого не работает.

    • Я кажется знаю, почему это происходит. Покажите кусок конфига postfix, где описаны restrictions.

      • Покажу весь конфиг, думаю так правильнее будет. Mynetworks = 127.0.0.1/8 192.168.1.0/24 пробовал убирать подсети по одной и коментировать в конфигах.

        ###############################################main.cf
        
        #### Start Config
        
        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
                ##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 zen.spamhaus.org
                permit
        
        smtpd_data_restrictions =
                permit
        
        smtpd_end_of_data_restrictions =
                permit
        
        #### END Config
        
        ###############################################master.cf
        
        #### Start config
        
        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
          -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
          -o smtpd_client_restrictions=permit_sasl_authenticated,reject
        
        smtps   inet  n  -  n  -  -  smtpd
          -o content_filter=scan:[127.0.0.1]:10026
          -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 -f ${sender} -d ${recipient}
        
        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,no_address_mappings
          -o smtpd_helo_restrictions=
          -o smtpd_client_restrictions=
          -o smtpd_sender_restrictions=
          -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
          -o mynetworks_style=host
          -o smtpd_authorized_xforward_hosts=127.0.0.0/8
        
        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,permit_sasl_authenticated,reject
          -o mynetworks_style=host
          -o smtpd_authorized_xforward_hosts=127.0.0.0/8
        
        #### END config
        • Зачем у вас в конце всех restrictions стоит permit? Без пароля можно только через эти два правила пройти: permit или permit_mynetworks.

          • В моем представлении permit разрешает соединение. Ставим в конец блока restrictions - если ограничения не сработали, то разрешаем. Конечно, могу и ошибаться.

            Закоментировал все permit (пробовал и по одному), permit_mynetworks, но локальная отправка через 25 порт работает все также (с несуществующим пользователем или неправильным паролем).

            Даже уже не знаю куда смотреть, ощущенее что так и должно быть.

            • "В моем представлении permit разрешает соединение. Ставим в конец блока restrictions - если ограничения не сработали, то разрешаем. Конечно, могу и ошибаться."
              Это в корне неверное рассуждение. Разрешаться должно только то, что явно разрешено. А всё остальное блокироваться. Иначе забыв что-то заблокировать, вы это разрешите. А учесть всё невозможно. Безопаснее всё заблокировать и разрешать только то, что нужно. Это же относится к настройке фаерволов и прочих систем доступа.

              "Даже уже не знаю куда смотреть, ощущенее что так и должно быть."
              Так точно не должно быть. Всё, что отправляет без авторизации, где-то прописано. Лучше с этим разобраться, иначе в случае публичного доступа злоумышленники быстро превратят ваш сервер в рассьщик спама. Этим целенаправленно занимаются боты, пробуя различные варианты отправки с публичных серверов.

              • >> Это в корне неверное рассуждение. Разрешаться должно только то, что явно разрешено. А всё остальное блокироваться. Иначе забыв что-то заблокировать, вы это разрешите. А учесть всё невозможно.

                Спасибо за пояснение. Убрал.

                >> Так точно не должно быть. Всё, что отправляет без авторизации, где-то прописано. Лучше с этим разобраться, иначе в случае публичного доступа злоумышленники быстро превратят ваш сервер в рассьщик спама.

                Вероятно выше плохо пояснил. Без авторизации письма во вне не отпраляются. Они отправляются с одного ящика в домене на другой ящик в домене (домены созданы в postfixadmin). Даже если ящик отправитель не существует или пароль к существующему ящику не верный.

                Условно работает только такая отправка any@domain.com => user@domain.com, но не работает any@domain.com => myemail@gmail.com.

                Если создать в postrixadmin alias domain2.com для основного домена domain.com, то отправка на него также работает.

                Глянул по логу, при локальной отправке в логах вообще нет строк по авторизации.

            • Переделал конфиг. Отправку на свой же домен без авторизации победил. У меня было указано [smtpd_helo_restrictions = permit].

              Прописал как в статье:

              smtpd_helo_restrictions =
              permit_mynetworks
              permit_sasl_authenticated
              reject_invalid_helo_hostname
              reject_non_fqdn_helo_hostname
              reject_unknown_helo_hostname

              После этого отправка без авторизации не работает ни в каком виде.

              Владимир, еще раз спасибо за помощь. Вы лучший человек в интернете)

  19. Доброго дня!

    Настроил по статье, за некоторым исключение под наши требования. Все отлично работает если не считать один момент. Логика воспроизведения ошибки такая:

    1) два email test1@mydomen.ru и test2@mydomen.ru.

    2) в postfixadmin настраиваем пересылку с test1 на test2, при этом test1 также остается включенным (если ящик отключить то проблема не воспроизводится). Другого web-интрефеса нет, используем Thunderbird.

    3) отправляем письмо с test3@mydomen.ru на test1@mydomen.ru, письмо приходит пересылка работает, но на test2@mydomen.ru приходит (пересылается) почему-то два одинаковых письма.

    4) если пересылать на внешнюю почту то внешнему получателю придет одно письмо.

    5) если использовать sender_bcc_maps , то писем пересылается также 2.

    Уже все перекопал по настройкам.

    Возможно у кого-то есть 10 лишних минут, чтобы прочитать и подсказать что-то. Заранее благодарен.

    • Как пересылку с test1 на test2 настраиваете?

      • Алиас в postfixadmin или sender_bcc_maps = hash:/etc/postfix/sender_bcc_map , содержимое sender_bcc_map
        test1@domain.ru test1@domain.ru.

        Судя по всему проблема возникла из-за использования amavis, там такие настройки прописаны:

        127.0.0.1:10025 inet n - n - 16 smtpd

        127.0.0.1:10027 inet n - n - 16 smtpd

        Думаю проблема в этом:

        1-е письмо пересылается напрямую (так как два ящика на одном сервере) игнорируя amavis.
        2-е письмо отправляется сперва на amavis и уже после пересылается на целевой ящик.

        В целом проблему решил добавлением в main.cf, не уверен что это правильно:

        receive_override_options=no_address_mappings

        Буду благодарен за любые пояснения!

        • Да, из-за amavis такое может быть. Как решать, не знаю. Я сам amavis не использую обычно. Но когда пользовался, помню, что была такая проблема.

          • В любом случае спасибо.

            Посмотрю что ещё можно настроить, отпишусь.

            • Нашел два варианта, первый описан выше. Второй: добавить параметр [no_address_mappings] для сервиса на который amavis пересылает сообщения после проверки (в моем случае - 127.0.0.1:10025) в master.cf

              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,no_address_mappings

              это решает проблему с дублированием писем при локальной пересылке.

  20. Александр

    Добрый день!
    Подскажите все работает, почта ходит туда и обратно. Почтовый сервер находится за nat, порты прокинуты.

    Но если я пытаюсь из внутренней сети отправить с консоли письмо:
    echo "Alert2" | /usr/sbin/sendmail root@my-domain.ru

    То получаю в логах (сервера с которого отправляю):
    254FD2086E33: to=, relay=none, delay=0.12, delays=0.01/0/0.11/0, dsn=4.4.1, status=deferred (connect to mail.my-domain.ru[xxx.xxx.xxx.xxx]:25: Connection refused)
    где xxx.xxx.xxx.xxx - это белый ip.
    Как я понимаю надо на каждом сервере прописывать relayhost который ссылается на ip адрес почтового сервера (192.168.1.16). Или можно как то разрулить это iptables, чтобы не прописывать на всех серверах relyahost?

    • Здесь чисто сетевая ошибка:
      connect to mail.my-domain.ru[xxx.xxx.xxx.xxx]:25: Connection refused
      Нет подключения к хосту. Решать её можно по-разному вы зависимости от ситуации. Не могу что-то конкретное посоветовать.

  21. Вообще говоря, не только в контексте данной статьи, есть сомнения насчёт использования адресов типа root@domain.tld (упоминается root@kirushin-vladimir.ru). Даже, если mail сервер mail.domain.tld обслуживает домен domain.tld. Т.е. адреса типа root@… по идее соответствуют пользователю root того или иного, конкретного, сервера. Но серверов в пределах домена может же быть много. Тогда кто такой root@domain.tld?

  22. Спасибо за статью.
    Только маленькое замечание, делал Dkim по этой статье, смутила фраза "mail непосредственно имя сервера", а это селектор.
    Как я понял можно как угодно его выбрать, сам в итоге mail и оставил, чтоб больше копипастить хотя у меня имя другое и вобще почта на втором уровне и первый раз когда пытался свое имя подставлять где то запутался...

  23. Евгений

    Всем добрый день!
    Есть существенный вопрос из раздела "Проверка DNS-записей". Вы всё правильно написали, только в дополнение есть ещё такой момент про PTR-запись. многие почтовики при получении почты проверяют её, на наличие/соответствие в рамках борьбы со спамом. Но, кроме того, ещё проверяют HELO-ответ сервера. Тоесть PTR-запись в IP-адресе сервера, A-запись с этим IP, и имя сервера передаваемое в HELO-запросе должны совпадать. Согласны?
    Практический вопрос. Есть почтовый сервер небольшой организации с двумя IP-адресами от разных провайдеров с целью повышения отказоустойчивости. соответственно делаем 2 A-записи (напишу на вашем домене пример).
    mail1.kirushin-vladimir.ru A 5.180.137.106
    mail2.kirushin-vladimir.ru A 82.162.209.37 (например!!)
    и 2 MX записи
    MX 10 mail1.kirushin-vladimir.ru
    MX 20 mail2.kirushin-vladimir.ru
    по указанным IP делаем PTR-записи, каждую у своего провайдера.
    а что делать с HELO-запросом? его можно в зависимости от IP-провайдера через который шлётся почта подставлять нужный в ПО почтового сервера? или как бы вы решали такую проблему?
    Вариант купить зону IP-адресов или провайдеро-независимые IP - совсем радикальный и самый крайний.
    Прописать mail.kirushin-vladimir.ru на оба IP не вариант, потому что DNS будет отдавать IP по принципу Round Robin и есть риск нарваться на нерабочий IP (провайдер отвалился например).
    Был ещё вопрос что делать с почтовыми клиентами, которые цепляются к серверу извне, но я эту проблему решил с помощью VPN. Два подключения, каждое через своего провайдера, а уже оказавшись внутри VPN-клиент идёт к почтовому серверу одним и тем же путём.

    • Я бы не стал заморачиваться с этим. Проверка helo работает не у всех и если она не проходит, то это не сильно влияет на рейтинг по спаму. Никто из крупных почтовых сервисов не следит за helo. У них так же пачки ip и разных доменных имён. Много раз замечал, что там нет совпадений по A записям и helo. Самое важное, чтобы для ip, с которого идёт отправка, была ptr запись и A и MX записи совпадали. Я бы с helo не парился.

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

    • Для локальных компьютеров нужно делать отдельную dns запись, которая будет резолвить имя домена в локальный ip адрес. Это типовая задача и решается она средствами DNS. Если через DNS никак решить не получается, то нужно через firewall на микротик решать этот вопрос с перенаправлением подобных пакетов с внешнего интерфейса на почтовый сервер. Это более сложный вариант и лучше до него не доходить, а сделать всё через DNS.

  25. Застрял на шаге где нужно запустить файл setup.php для postfix
    ошибка
    ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver

    нашел решение
    Сначала проверяем статус SElinux
    # /usr/sbin/getenforce
    Enforcing
    Затем делаем так:
    Для отключения SELinux, сконфигурируйте SELINUX=disabled в /etc/selinux/config
    перезагружаемся и проверяем
    # /usr/sbin/getenforce
    Disabled

  26. Может кому-то поможет. Ubuntu 20.04
    У меня в логах писало delivered to maildir. но во входящих письма не появлялись.

    Неделю бился пока не нашел решение:
    В main.cf добавил local_transport = virtual перед virtual_transport = dovecot

    Все - теперь письма появляются

  27. А есть какой то гайд по тому как установить этот Kaspersky Anti-Spam?
    Там дофига всего Web console, Network agent, etc.. что качать и как ставить вообще не понятно

    • У него хорошая собственная документация на русском языке. Я всегда по ней ставлю. Искать где-то на сайте надо, под рукой у меня нет. Там свой инсталлятор, так что автоматом все ставится и настраивается. Руками только конфиги postfix надо немного подправить.

  28. Виталий

    День добрый. Почта отправляется, но не принимается. Почтовый клиент thunderbird подключается. подскажите что где посмотреть?

  29. Виталий

    День добрый. Не совсем понятно, если у меня на сервере hostname например: postfix74, то мне надо создать домен третьего уровня с именем ПК (ну и прописать соответствующие записи типа А и т.д.)? Например postfix74.example.com? А если я пока просто учусь, у меня есть белый IP и включен DDNS от микротик то я с этим dns не смогу опробовать почтовый сервак (с настроенными пробросами)?

    • Домен почтового сервера вообще никак не связан с hostname. Они могут быть разные. На DDNS почтовый сервер не поднять. Нужны статичные DNS записи типа MX.

  30. Виталий

    День добрый, а если без phpmyadmin то можно и через консоль СУБД создать БД и пользователя?
    mysql -u root -p
    CREATE DATABASE postfix;
    ALTER DATABASE postfix charset=utf8;
    CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'MyPassword';
    GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost';
    FLUSH PRIVILEGES;

  31. Добрый день! Подскажите, пожалуйста, при создании пользователя в postfixadmin делаю следующее: ввожу setup пароль, email пользователя любой, и два раза пароль для него и жму кнопку "Добавить администратора".
    Получаю ошибку: Everything seems fine... attempting to create/update database structure

    Database is up to date: 1841/0

    DEBUG INFORMATION:
    Invalid query: ERROR: invalid input syntax for integer: "t" LINE 1: ..._domain_count,0) as domain_count,CASE active WHEN 't' THEN '... ^

    Check your error_log for the failed query.

    В логах вижу:
    PHP message caused by query SELECT username,password,password as password2,CASE superadmin WHEN 't' THEN '1' WHEN 'f' THEN '0' END as superadmin,CASE superadmin WHEN 't' THEN 'ДА' WH$ WHERE 1=1 AND ( username='postmaster@мойдомен' ) ORDER BY username" while reading response header from upstream, client: ххх.ххх.ххх.ххх (ip адрес), server: _, request: "POST /padmin/publi$ 2021/12/16 12:32:51 [error] 1143#0: *294 FastCGI sent in stderr: "PHP message: Invalid query: ERROR: invalid input syntax for integer: "t"

    Подскажите, как можно исправить ?

    • А ящик какой указываете? Домен не кириллицей случайно? Ошибка выглядит так, как-будто там с вводом какие-то проблемы.

      • Ящик указываю англ. буквами, пробовал и цифрами уже, в формате name@domenname.ru
        Домен не кириллицей, на англ.

        • Попробуйте другой браузер. Я не раз сталкивался с тем, что в каком-то браузере postfixadmin глючил во время установки. Подробностей не помню, но может помочь.

          • Проверил на ie,edge, opera, chrome. К сожалению результат отрицательный...Думаю что проблема где-то в районе БД. (Стоит postgres). А вот где именно...

  32. Столкнулся с проблемой того что postfixadmin не ищет по рус...по названию ящиков ищет, а по описанию выкидует ошибку:
    DEBUG INFORMATION:
    Invalid query: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
    Check your error_log for the failed query.
    Please check the documentation and website for more information.

  33. Сергей

    А можно ли всё тоже самое поднять с Nginx ? Это принципиально на Apache ставить ?

    • Можно, конечно. Подойдет любой веб сервер с php.

      • Сергей

        Огромное спасибо,Владимир. Но. На этапе ещё логирования в postfix пишет Invalid token (session timeout; refresh the page and try again?)
        Всё делал по инструкции. Пробовал ставить cleartext. не помогает. Помогите вы. Уже 3 рутов создал. А войти не могу и хэш подставлял в конфиг как надо......

        • Это либо проблема с сессиями веб сервера, либо браузер что-то блочит в сессии. Пробуйте другой браузер.

  34. Доброго времени суток. У меня проблемы возникли на этапе проверки почты. Я получаю письма на свой ящик если отправляю со своего гуглоского аккаунта. Ну вот отправить ответ Но вот отправить письма обратно на гугловский аккаунт не могу. В логах вот такое вот:

    Nov 28 13:37:59 postfix/smtp[49367]: connect to alt2.gmail-smtp-in.l.google.com[142.250.152.26]:25: Connection timed out
    Nov 28 13:38:08 postfix/smtp[49421]: connect to gmail-smtp-in.l.google.com[74.125.199.27]:25: Connection timed out
    Nov 28 13:38:29 postfix/smtp[49367]: connect to alt3.gmail-smtp-in.l.google.com[172.253.113.27]:25: Connection timed out
    Nov 28 13:38:38 postfix/smtp[49421]: connect to alt1.gmail-smtp-in.l.google.com[64.233.171.27]:25: Connection timed out
    Nov 28 13:38:59 postfix/smtp[49367]: connect to alt4.gmail-smtp-in.l.google.com[173.194.77.26]:25: Connection timed out
    Nov 28 13:38:59 postfix/smtp[49367]: 864BC625BA: to=, relay=none, delay=503, delays=352/0.11/150/0, dsn=4.4.1, status=deferred (connect to alt4.gmail-smtp-in.l.google.com[173.194.77.26]:25: Connection timed out)
    Nov 28 13:39:08 postfix/smtp[49421]: connect to alt2.gmail-smtp-in.l.google.com[142.250.152.26]:25: Connection timed out
    Nov 28 13:39:38 postfix/smtp[49421]: connect to alt3.gmail-smtp-in.l.google.com[172.253.113.27]:25: Connection timed out
    Nov 28 13:40:08 postfix/smtp[49421]: connect to alt4.gmail-smtp-in.l.google.com[173.194.77.26]:25: Connection timed out
    Nov 28 13:40:08postfix/smtp[49421]: C25B1625D4: to=, relay=none, delay=156, delays=0.21/0.01/155/0, dsn=4.4.1, status=deferred (connect to alt4.gmail-smtp-in.l.google.com[173.194.77.26]:25: Connection timed out)
    Nov 28 13:40:52 postfix/anvil[49415]: statistics: max connection rate 1/60s for (smtps:75.154.178.16) at Nov 28 13:37:32
    Nov 28 13:40:52 postfix/anvil[49415]: statistics: max connection count 1 for (smtps:75.154.178.16) at Nov 28 13:37:32
    Nov 28 13:40:52 postfix/anvil[49415]: statistics: max message rate 1/60s for (smtps:75.154.178.16) at Nov 28 13:37:32
    Nov 28 13:40:52 postfix/anvil[49415]: statistics: max cache size 1 at Nov 28 13:37:32

    Не понимаю с чем это может быть связано.

    • У вас тут четко указано, в чем проблема - нет связи с серверами гугла.
      Connection timed out
      А вот с чем это может быть связано, надо разбираться. Очень часто 25-й порт, по которому отправляется почта, по умолчанию у провайдеров заблокирован. Думаю, дело в этом. Поэтому получение почты работает, а отправка - нет.

      • Благодарю. Сервер в Oracle Cloud. Да похоже так и есть, напишу им в поддержку.

        • Это который бесплатный? Скорее всего так просто не разрешат его использовать как почтовый сервер. Нужно будет ряд условий выполнить.

          • Ну посмотрим что они хотят. Я тикет отправил уже, даже ответ получил. Они мне кстати звонили при регистрации. Я свой адрес не хотел указывать в начале, у них система среагировала и меня прям детально допрашивали где я живу, почему указал этот адрес, почему у меня 2 телефона и т.п.

          • Извиняюсь, да это бесплатный аккаунт.

          • Небольшой апдейтю Открыли 25 порт, сделали PTR запись. Заняло у них все это целый месяц. 2 раза продляли триал, был почти в постоянном контакте с их представителем по триальным аккаунтам. Сделали все за бесплатно

            • Получилось в итоге настроить почтовый сервер? Отправка пошла?

              • Да отправка работает, единтвенное что письма в спам уходят несмотря на то что dkim, spf, dmarc настроены и проверка их в том же гугле нормально проходит. Я думаю связанно с тем что домен новый. У меня на работе все письма с новых доменов помечались подозрительными.

                • Да, тут факторов много. Обычное дело, когда с нового сервера письма в спам идут. Надо доверие повышать, только не понятно как :)

  35. Дмитрий

    Подскажите если нужно добавить ещё один домен к уже работающей почте по данному мануалу, как это проще всего сделать? Спасибо.

  36. Подскажите, пытался прикрутить ротацию логов dovecot, не получается. После ротации логов перестают приходить письма, проблемы с доступами к логам. Проверял все с правами вроде нормально
    Ротацию делал так:
    /var/log/dovecot/info.log {
    weekly
    rotate 4
    missingok
    notifempty
    compress
    delaycompress
    create 644 vmail dovecot
    sharedscripts
    postrotate
    chown -R vmail:dovecot /var/log/dovecot/info.log && doveadm log reopen
    endscript
    }

  37. Спасибо за статью. Статья очень хорошая и позволяет сэкономить много времени.
    Делал по ней почтовый сервер на Debian 11. Всё получилось, но есть нюансы:
    1) Многие пакеты установочные имеют другие имена. + многие php модули ставятся через pear. Но в целом всё гуглится.

    2) Postfix при отправке письма писал в логах что не может приконектиться к mysql по сокету. Решается заменой в файлах /etc/postfix/mysql/*.cf строки "hosts = localhost" на строку "hosts = 127.0.0.1:3306"

    3) В файле master.cf настройки postfix надо в строках:

    dovecot unix - n n - - pipe
    flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

    поменять "/usr/libexec/dovecot/deliver" на "/usr/lib/dovecot/dovecot-lda". Согласно документации dovecot (https://wiki2.dovecot.org/LDA/Postfix) в dovecot начиная с 2 версии нет deliver, есть dovecot-lda. Не знаю как у вас на Centos всё работает, так как настройка не привязана к Debian или другой ОС.

    4) В части установки Roundcube вы в php.ini настраиваете только date.timezone = Europe/Moscow. Надо ещё настроить минимум "upload_max_filesize" и "post_max_size". Иначе в Roundcube при создании новых писем допускаются вложения не больше 2 МБ.

    Вроде все подводные камни написал. Ещё раз большое спасибо за статью. БОЛЬШОЙ ЛАЙК!
    С отдельными изменениями по установке пакетов статья полностью подходит для Debian 11.

    • Да, всё верно. Замечания актуальные, а сам я эту статью использую и при настройке почтового сервера на Ubuntu Server. Разница только в названиях пакетов и некоторых путей. Вся основа эта же.

    • Запоздалый ответ:

      deliver это тоже самое что и dovecot-lda, как минимум в Ubuntu 22.04:

      # cd /usr/lib/dovecot/
      # ls -la deliver
      lrwxrwxrwx 1 root root 11 Feb 9 11:13 deliver -> dovecot-lda

  38. Анатолий

    Добрый день.
    Не могли бы подсказать: как лучше создать алиас вида allusers@mydomain.ru, включающий в себя всех пользователей почтового домена?
    Это можно сделать в postfixadmin, но с его помощью приходится вручную актуализировать алиас (добавлять или убавлять учетки пользователей) , что не очень удобно

    • Александр

      В Postfixadmin должен быть скрипт 'mkeveryone.pl' на perl, который создает алиас everyone@... на все ящики.

  39. Друзья а у кого-нибудь есть мысли как вот это решить? Please edit config.local.php - change $CONF['configured'] to true after setting your database settings

    При этом я конфиг шерстил и проверял логи и парорлль

    • Тут дело не в пароле. Нужно параметр сделать:

      $CONF['configured'] = true

      Примерно так, не помню как точно эта строка в конфиге выглядит.

      • Сорри, но параметр - в норме!

        $CONF['configured'] = true;

        #$CONF['postfix_admin_path'] = "/var/www/html/padmin/";

        // In order to setup Postfixadmin, you MUST specify a hashed password here.
        // To create the hash, visit setup.php in a browser and type a password into the field,
        // on submission it will be echoed out to you as a hashed value.
        $CONF['setup_password'] = 'changeme';

  40. Александр

    Добрый вечер, Владимир! Огромное спасибо за Ваши статьи - отличное подспорье во многих рабочих моментах. Подскажите пожалуйста, не сталкивались ли вы с проблемой дублирования папок (нежелательная почта, отправленные, удаленные, черновики) в интерфейсе roundcube и клиенте thunderbird после входа в конкретный почтовый ящик через outlook? Я так понимаю, что outlook создает свои каталоги, не обращая внимания на правила в namespace? Может быть есть какое-то решение, как избежать этой неразберихи в папках, когда клиент использует и outlook, и веб-панель и допустим какой-то мобильный клиент?

    • Решение лично мне неизвестно. Сам постоянно это вижу. Каждый клиент автоматически создает папки, такие, какие он считает нужными. Чем больше клиентов, тем больше папок. Не думаю, что этому есть решение. Нельзя же клиенту запретить создавать папки.

      • Александр

        Благодарю за ответ!
        Понятно, что клиенту запретить создавать папки нельзя. Но может быть можно как-то указать outllook-у использовать стандартные папки imap? Ведь тот же thunderbird или какой-нибудь the bat понимает эту структуру и именование.

        • У него свое понимание стандартных папок. Поэтому он их и создает сам.

          • Александр

            Дополню, из того, что удалось проверить сегодня. Outlook 2013, 2016 (и возможно, выше - не проверял) умеет корректно использовать каталоги Drafts, Sent, Trash и Junk и обрабатывать special use. То есть, ничего лишнего в каталогах на почтовом сервере не создается. Но эти папки отображаются в почтовом клиенте по-английски, как есть. Перевести их названия outlook похоже не может (Входящие и Исходящие переводятся)

  41. Михаил

    Владимир, добрый день.

    По вашей статье поставил на Ubuntu 20.04

    Нюансы, возникшие при установке (другие пакеты, права доступа и пр.), преодолел.

    Обе службы, dovecot и postfix, стартуют без ошибок.
    Через roundcube почта отправляется, в том числе и на внешние сервера.
    Проблема в том, что почта не приходит, ни с внешних адресов, ни локально. Причем, судя по логу postfix, все в порядке, в точности как у Вас.

    В логе dovecot только такое вызывает вопросы.

    Apr 22 06:59:59 imap(root@subdomain.domain.ru): Debug: acl vfile: Global ACLs disabled
    Apr 22 06:59:59 imap(root@subdomain.domain.ru): Debug: acl vfile: file /mnt/mail/subdomain.domain.ru/root@subdomain.domain.ru/.Sent/dovecot-acl not found
    Apr 22 06:59:59 imap(root@subdomain.domain.ru): Debug: acl vfile: file /mnt/mail/subdomain.domain.ru/root@subdomain.domain.ru/.Drafts/dovecot-acl not found
    Apr 22 06:59:59 imap(root@subdomain.domain.ru): Debug: acl vfile: file /mnt/mail/subdomain.domain.ru/root@subdomain.domain.ru/.Trash/dovecot-acl not found
    Apr 22 06:59:59 imap(root@subdomain.domain.ru): Debug: acl vfile: file /mnt/mail/subdomain.domain.ru/root@subdomain.domain.ru/.Junk/dovecot-acl not found

    postfix
    mail.log

    Apr 22 06:55:36 srv postfix/postfix-script[1040]: warning: symlink leaves directory: /etc/postfix/./makedefs.out
    Apr 22 06:55:39 srv postfix/postfix-script[1287]: starting the Postfix mail system
    Apr 22 06:55:39 srv postfix/master[1289]: daemon started -- version 3.4.13, configuration /etc/postfix
    Apr 22 06:59:59 srv postfix/smtpd[1577]: connect from localhost[127.0.0.1]
    Apr 22 06:59:59 srv postfix/smtpd[1577]: 295D710E1102: client=localhost[127.0.0.1], sasl_method=LOGIN, sasl_username=root@subdomain.domain.ru
    Apr 22 06:59:59 srv postfix/cleanup[1586]: 295D710E1102: message-id=
    Apr 22 06:59:59 srv postfix/qmgr[1291]: 295D710E1102: from=, size=561, nrcpt=3 (queue active)
    Apr 22 06:59:59 srv postfix/smtpd[1577]: disconnect from localhost[127.0.0.1] ehlo=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=6
    Apr 22 06:59:59 srv postfix/pipe[1591]: 295D710E1102: to=, relay=dovecot, delay=0.18, delays=0.08/0.03/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
    Apr 22 06:59:59 srv postfix/pipe[1593]: 295D710E1102: to=, relay=dovecot, delay=0.18, delays=0.08/0.04/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service)
    Apr 22 06:59:59 srv postfix/pipe[1588]: 295D710E1102: to=, relay=dovecot, delay=0.18, delays=0.08/0.03/0/0.07, dsn=2.0.0, status=sent (delivered via dovecot service)
    Apr 22 06:59:59 srv postfix/qmgr[1291]: 295D710E1102: removed

    Собственно, что можно еще посмотреть? Детализацию логов повысил, ничего нет.

    • Раз почта не приходит и во входящих логах пусто на этот счет, значит проблемы с соединением. Смотрите в эту сторону. На firewall в первую очередь. Попробуйте телнетом подключиться к почтовому серверу и вручную туда команды по отправке дайте.

      • Михаил

        Владимир, спасибо за быстрый ответ.
        Порты 25,110,465,993,995,587 открыты.

        Клиент IMAP Outlook цепляется и синхронизируется, но только в SENT есть письма.

        Я в недоумении.

        • Михаил

          Владимир, спасибо за быстрый ответ.
          Порты 25,110,465,993,995,587 открыты.

          Клиент IMAP Outlook цепляется и синхронизируется, но только в SENT есть письма.

          Я в недоумении.

          Попробовал отправить через телнет.
          В логах письмо отправлено через dovecot pipe, статус sent, однако в папке SENT пользователя, от чьего имени было письмо, оно так и не появилось. А через вебмайл оно падало именно туда.

          • Михаил

            После поиска по форумам и курения бамбука прием заработал.:)

            После удаления строки в main.cf:

            virtual_transport = dovecot (дублирование транспорта в master.cf через pipe)

            и приведения строки mydestination = localhost.$mydomain, localhost к виду

            mydestination = localhost.localdomain, localhost

            Подозреваю, что последнее не влияет. Проверю позже.

            Странно, что postfix молчит о том, что он пишет (или не пишет) в папки пользовательской почты.

            • Михаил

              Проверил, именно virtual_transport = dovecot блокирует прием.

              Владимир, спасибо за статью, отличное хауту с развернутыми комментариями.
              Ну и конечно, для желающих повторить обязательны базовые знания и желание учиться и думать.:)

  42. Виктор

    Добрый день. Подскажите, возможно я упустил в статье, но если мне нужно больше одного домена? Можно ли организовать работу нескольких доменов на одном сервере?

    • Да, без проблем. Ничего отдельно для этого не надо настраивать. Просто добавляете новые домены через postfixadmin и создаете для них ящики. Единственное, что надо будет сделать - добавить и прописать для каждого домена dkim ключи.

  43. Статья - Агонь! Подскажите, есть ли какое-то решение хранить отправленную почту 16м оутлуком подключенным по pop3, чтобы можно было синкать imap-ом с моб. устройств.

  44. Здравствуйте. Не подскажите как, используя roundcube, открыть в одном браузере на разных вкладках несколько разных почтовых ящиков.

  45. Feb 25 01:37:46 localhost postfix/smtpd[2606]: connect from mail-io1-f47.google.com[209.85.166.47]
    Feb 25 01:37:46 localhost postfix/smtpd[2606]: warning: SASL: Connect to private/dovecot-auth failed: No such file or directory
    Feb 25 01:37:46 localhost postfix/smtpd[2606]: fatal: no SASL authentication mechanisms
    Feb 25 01:37:47 localhost postfix/master[2562]: warning: process /usr/libexec/postfix/smtpd pid 2606 exit status 1
    Feb 25 01:37:47 localhost postfix/master[2562]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

    не понял.. вроде делал все строго по инструкции
    /var/spool/postfix/private/dovecot-auth нету.. там только dovecot 0KB

    • а так шикарный ресурс! спасибо большое! очень много интересного! подписываюсь !

  46. Добрый день! Спасибо за инструкцию! Настраивал долго из-за неопытности, я начинающий любитель :) Все начало ходить, вот только Google не принимает DKIM. Пишет dkim=neutral (bad format) и как результат FAIL. Не сталкивались? :)

    • А что тут сталкиваться. Где-то ошибка, обычное дело. Проверяйте все. У гугла точно ошибки нет :)

      • Все перепроверил раз 100 :) и нашел проблему, которую решить не могу, не хватает знаний :( Когда письмо отправляю с помощью Thunderbird все подписи (DKIM, SPF, DMARK) есть и Google пишет Pass. Если отправляю с сайта (roundcube) то в maillog появляется:
        - no signing table match for 'root@localhost'
        - no signature data
        Каких-то упоминаний об этой ошибке не нашел. Может подскажите?

        • Судя по всему по какой-то причине идет отправка от ящика root@localhost. DKIM говорит, что у него нет подписи для этого домена, потому что его нет в его таблице signingtable.

  47. Добрый день!
    Сглазил, выпадает ошибка при подключения из локальной сети, при подключении с внешней сети все хорошо. Где смотреть?

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.

  48. Прошу извинить, забыл написать и вариант правил скачанный и скорректированный под свои интерфейсы итд, с вашей статьи про настройку iptables. При включение скрипта в клиенте Roudncube появляется и висит строка обновление...и ни одна кнопка не реагирует.

  49. Добрый день! Спасибо все работает. Последний штрих настройка iptables поставила в тупик. Установил пакет iptables-services. Варианты правил разные перепробовал , результата нет. Как включаю скрипт - все отваливается. Прошу у вас есть рабочий конфиг для этой полной готовой системы...или есть другой вариант защиты. Спасибо.

  50. Спасибо разобрался, nano httpd.conf

    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    RedirectMatch ^/$ /webmail/

  51. Сорри выразился некорректно. Вместо страницы приветствия сразу открывалась страница rouncube .

    • Тут не нужно перенаправление. Проще всего исходники roundcube положить в директорию /var/www/html/ , а не webmail. Тогда по умолчанию будет открываться roundcube.

  52. Добрый вечер! Установил сертификат SSL/TLS сертификатов Let's Encrypt. Все работает. Спасибо за науку. Остался один штрих --как страницу приветствия Apache перенаправить на папку /var/www/html/webmail ? Гугл подсказывает много, но редирект пробовал не срабатывает.

  53. Андрей

    Не могу решить проблему второй день
    dovecot не может создать папки для почтовых ящиков, выглядит в логе так
    Mailbox INBOX: open(/usr/postfix_base/mysite.host/mysite@mysite.host/tmp/1612529767.M704652P5437.mail) failed: Read-only file system

    я уже всё по перепробовал, давал на корневую папку 777, толку 0

    ---dovecot.conf
    mail_location = maildir:/usr/postfix_base/%d/%u/
    ---

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

    • Если делать по статье, не будет таких ошибок. Явно что-то где-то напутали. Так трудно сказать, в чем именно ошибка. Но текст явно намекает, что у вас проблемы с правами или чем-то еще. Dovecot не может создать папку с ящиком. Вообще, /usr не подходящее место для хранения почты. Зачем вы там ее пытаетесь разместить?

      • Андрей

        а где лучше хранить почту?

        • Чем вас пример из статьи не устроил? В /usr обычно хранится то, что имеет отношение к самой системе, не пользовательские данные. Их принято хранить в /var, /opt, /mnt, /home

      • Андрей

        Владимир Вы абсолютно правы!!!! перенес папку с базой в /var......и почта пошла, спасибо за науку!

  54. Андрей

    более сложного чем эту связку я еще ничего не настраивал))) лютый треш
    хочется плюнуть и накатить ломанный kerio connect за 20 минут под ключ ))

    • Задача не из простых, если нет опыта :) Но с другой стороны, как его получить? Я тоже долго мучался, когда изучал почтовые сервера.

      Есть еще Zimbra. Там тоже все просто и ломать ничего не надо.

      • Андрей

        Исключительно из-за опыта и знаний мучаюсь уже неделю)))
        Про зимбру знаю, следующая на очереди она
        Да, вот еще что- есть вебморда, называется webmin, там походе можно все настроить из гуи, я пока не пробовал, не хочу снести уже сделанные настройки руками, а вообще надо посмотреть!!

        • Webmin для этого не очень подходит. Рекомендую не привыкать к нему. Вроде все просто кажется, но это тупиковый путь.

    • Алексей

      А что именно тут сложного? Разве что если с линукс не работали то да, конечно сложно.
      Никакого треша тут нет, все вполне логично и без извращений.

      • Да в целом тут большой объем настроек, конфигов. Все это связать надо аккуратно и без ошибок. С DNS не напутать и т.д. Даже по инструкции видно, какая она объемная. Одна из самых больших на сайте. Больше только по asterisk.

        • Андрей

          Владимир, а что у вас прописано в webmail/config/config.inc.php (Roundcube) ???
          $config['default_host'] = 'localhost';

          я если с такой переменной(localhost) захожу через вебморду в новосозданный ящик, то он имеет вид user@localhost вместо user@mydomain(да, в настройках самого почтового ящика можно исправить на правильный, но это же фигня)
          если прописываю $config['default_host'] = 'mydomain'; то залогинится не получается в любой ящик

  55. Прошу извинить но проблема решена директория для хранения почты
    virtual_mailbox_base = /mnt/mail это в примере а реально у нас папка virtual_mailbox_base = /var/vmail

    есть еще проблема фев 01 03:20:42 mailserver systemd[1]: Starting Postfix Mail Transport Agent...
    фев 01 03:20:42 mailserver aliasesdb[2228]: /usr/sbin/postconf: fatal: /etc/postfix/main.cf, line 768: missing '=' after attribute name: "intermediate CA"
    фев 01 03:20:43 mailserver aliasesdb[2228]: newaliases: fatal: /etc/postfix/main.cf, line 768: missing '=' after attribute name: "intermediate CA"
    фев 01 03:20:43 mailserver postfix[2234]: fatal: /etc/postfix/main.cf, line 768: missing '=' after attribute name: "intermediate CA"
    фев 01 03:20:44 mailserver systemd[1]: postfix.service: Control process exited, code=exited status=1
    фев 01 03:20:44 mailserver systemd[1]: postfix.service: Failed with result 'exit-code'.
    фев 01 03:20:44 mailserver systemd[1]: Failed to start Postfix Mail Transport Agent.

    • У вас ошибка в конфигурационном файле. Что-то напутали с параметрами. Смотрите строку 768 в /etc/postfix/main.cf. Там как минимум не хватает знака =, но скорее всего там вообще что-то не то написано.

  56. Добрый день! Cтолкнулся с проблемой на этапе подключения в почтовый ящик roundcube. Проверяю пользователя postfixadmin есть. Пытаюсь зайти под полным именем roundcube не пускает. В базе roundcube смотрю нет ничего. Где я накосячил?

    • Не понял, какого пользователя postfixadmin вы проверяете? Вам надо через postfixadmin создать ящик и пароль к нему. Потом эти данные использовать для подключения в roundcube. Если что, у него есть свой лог файл. Иногда там можно увидеть какие-то подсказки по проблемам.

      • Извиняюсь за неточность. Да в postfixadmin создал пользователя и ящик. При подключении к roundcube ввожу полностью этого пользователя имя@домен пользователя и нет подключения. Создаю еще новый ящик в postfixadmin, пробую зайти по новым пользователем в roundcube нет подключения. Что-то закрыто между postfixadmin и roundcube?

        • А ошибки-то есть какие-нибудь? Roundcube по своей сути работает как обычный imap клиент. Точно так же, как thunderbird, outlook и другие. Если не получается через него подключиться, то либо сам roundcube установлен неправильно и просто не работает, либо не работает сам почтовый сервер. Я бы для начала попробовал подключиться через любой другой почтовый клиент этим же пользователем и проверить, imap сервер в принципе работает или нет.

  57. Добрый день! Спасибо за ваши инструкции. Установил centos8 итд. Дохожу до момента настроек postfixadmin, вношу изменения в /var/www/html/padmin/config.local.php по вашей инструкции со своим ip адресом и запускаю установку postfixadmin http://xx.xx.xx.xx/padmin/public/setup.php и ничего не происходит, может нужно менять данные в файле /var/www/html/padmin/config.inc.php или права какие добавить?
    Прошу извинить .
    Спасибо

    • Вопрос решился, когда убрал из настроек, со своими адресами

      $CONF['footer_text'] = 'Return to http://хх.хх.хх.хх/padmin/public/';
      $CONF['footer_link'] = 'http://хх.хх.хх.хх/padmin/public/';

      Прошу убрать..мой пост спасибо

    • Надо смотреть на логи веб сервера. Может он просто не запущен? Или в настройках где-то ошибка.

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

    • Простого способа нет. Нужно их каким-то образом вырезать в письмах. Я не занимался никогда подобными вещами. По идее, можно обычным консольным sed это делать. Готового решения у меня нет.

  59. Настроил сервер по вашей статье предыдущей, по этой ещё раз проверил.
    Проблема: из консоли Linux письма приходят как надо, а при попытке отправить письмо с портала SalesForce.com никуда теперь не уходит, в октябре ещё работало, а теперь найти причину поломки не могу.
    Лог отправки письма с портала ниже. IP подсеть указана в mydestination.
    В чем может быть ошибка?

    Anonymous TLS connection established from smtp02-cdg-sp1.mta.salesforce.com[85.222.150.225]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: xsasl_dovecot_server_create: SASL service=smtp, realm=(null)
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: name_mask: noanonymous
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: xsasl_dovecot_server_mech_filter: keep mechanism: PLAIN
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: xsasl_dovecot_server_mech_filter: keep mechanism: LOGIN
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]:  smtp02-cdg-sp1.mta.salesforce.com[85.222.150.225]: 221 2.0.0 Bye
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: match_hostname: smtpd_client_event_limit_exceptions: smtp02-cdg-sp1.mta.salesforce.com ~? 127.0.0.0/8
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: match_hostaddr: smtpd_client_event_limit_exceptions: 85.222.150.225 ~? 127.0.0.0/8
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: match_list_match: smtp02-cdg-sp1.mta.salesforce.com: no match
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: match_list_match: 85.222.150.225: no match
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: send attr request = disconnect
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: send attr ident = submission:85.222.150.225
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: private/anvil: wanted attribute: status
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: input attribute name: status
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: input attribute value: 0
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: private/anvil: wanted attribute: (list terminator)
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229009]: input attribute name: (end)
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]:  smtp02-cdg-sp1.mta.salesforce.com[85.222.150.225]: 221 2.0.0 Bye
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: match_hostname: smtpd_client_event_limit_exceptions: smtp02-cdg-sp1.mta.salesforce.com ~? 127.0.0.0/8
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: match_hostaddr: smtpd_client_event_limit_exceptions: 85.222.150.225 ~? 127.0.0.0/8
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: match_list_match: smtp02-cdg-sp1.mta.salesforce.com: no match
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: match_list_match: 85.222.150.225: no match
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: send attr request = disconnect
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: send attr ident = submission:85.222.150.225
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: private/anvil: wanted attribute: status
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: input attribute name: status
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: input attribute value: 0
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: private/anvil: wanted attribute: (list terminator)
    Jan 19 20:01:57 mailrelay postfix/submission/smtpd[229017]: input attribute name: (end)
    Jan 19 20:01:58 mailrelay postfix/submission/smtpd[229009]: disconnect event to all milters
    Jan 19 20:01:58 mailrelay postfix/submission/smtpd[229009]: milter8_disc_event: quit milter inet:127.0.0.1:8891
    Jan 19 20:01:58 mailrelay postfix/submission/smtpd[229009]: disconnect from smtp02-cdg-sp1.mta.salesforce.com[85.222.150.225] ehlo=1 starttls=1 quit=1 commands=3
    Jan 19 20:01:58 mailrelay postfix/submission/smtpd[229009]: free all milters
    Jan 19 20:01:58 mailrelay postfix/submission/smtpd[229009]: free milter inet:127.0.0.1:8891
    • Я не очень понял этот лог. Тут какой-то расширенный дебаг включен, к которому я не привык. В этом фрагменте я не вижу никаких ошибок. Но они точно где-то есть, раз почта не ходит. Смотрите внимательнее логи и вспоминайте, что меняли. Сам по себе почтовый сервер не ломается.

  60. День добрый, подскажите пожалуйста, что я сделал не так,
    у меня команда cat /var/log/maillog, ни чего не выдаёт,
    всё сайты и базы работают без ошибок, но при попытке зайти в почту она виснет и потом выдаёт 504 ошибку
    в чём мой просчёт?
    был бы лог, хотя бы какая-то конкретика была, а так я даже не знаю, где что не работает.

    • Аноним

      Может mail.log, а не maillog?

      • В статье maillog , да и суть не меняется ни того ни другого файла не появляется

    • Лог файл maillog появляется после установки и запуска postfix в системе. При чем тут сайты и базы вообще не понял. Мы вроде почтовый сервер в этой статье настраиваем.

      • Postfix запущен, лог файл не появился. Сайты я имел введу админки все работают.

  61. Добавлю по поводу старых клиентов (в том числе Outlook 2010) на dovecot под Ubuntu 20.04.
    В Ubuntu 20.04 отключены в openssl старые протоколы TLS1 и TLS2, поэтому параметр в dovecot ssl_min_protocol = TLSv1 не срабатывает при обращении старого клиента используя шифрование. Это, разумеется проблема только клиента, однако с этим приходится считаться и в моем случае на уровне системы нужно понизить версию, иначе dovecot выдает ошибку:

    ...TLS handshaking: SSL_accept() failed: error:14209102:SSL routines:tls_early_post_process_client_hello:unsupported protocol, session=...

    Для решения проблемы в файле /etc/ssl/openssl.cnf перед разделом [ new_oids ] добавляем строчку:

    openssl_conf = default_conf

    в конце добавляем эти разделы:

    [ default_conf ]

    ssl_conf = ssl_sect

    [ssl_sect]

    system_default = ssl_default_sect

    [ssl_default_sect]
    MinProtocol = TLSv1
    CipherString = DEFAULT:@SECLEVEL=1

    Сохраняем файл. Запускаем в терминале: export OPENSSL_CONF=/etc/ssl/openssl.cnf
    Далее в кофиге dovecot меняем параметр ssl_min_protocol на этот:

    ssl_min_protocol = TLSv1

    • Александр

      А на Ubuntu 22.04 кто-нибудь пробовал сделать TLSv1? По этой инструкции что-то не получается заставить работать на TLS1.1.

  62. И да, спасибо за статью. Львиную часть информации взял из нее.

    Хотел бы осудить smtpd_*_restrictions.
    Поизучал их https://maxblogs.ru/articles/primenenie-ogranichenii-smtpd__restrictions-v-postfix.
    Пишут что не очень хорошо permit_mynetworks указывать первым. У вас с какой-то целью он стоит первым?

  63. В dovecot 2.3.7.2 (3c910f64b) cледует добавить строку:

    mail_plugins = acl

    Перед строкой

    protocol lda {
    ....
    }

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

    Dec 17 11:34:39 imap(test@qazxsw.ru): Error: Couldn't load required plugin /usr/lib/dovecot/modules/lib02_imap_acl_plugin.so: Plugin acl must be loaded also (you must set: mail_plugins=$mail_plugins acl)

    • Это что-то совсем новое. Я на прошлой неделе настраивал почтовый сервер, нормально все было. Подправил даже немного конфиги.

      • Думаете я придумал? :) В логах же четко сказано, добавьте mail_plugins=$mail_plugins acl :)

      • А, совсмем забыл добавить что это на Ubuntu 20.04. Вы то не на ней. В вашем случае наверное не надо этой строки.

      • Нет идей как сделать рассылку по всем своим пользователям при поступлении письма на определенный ящик.
        Можно, конечно, использовать алиас, но в этом случае каждого нового пользователя придется заносить ящик вручную в алиас, а это не удобно. Сейчас пока собираю информацию. Оказалось не все так просто. Пока склоняюсь к тому, что при поступлении письма на определенный ящик скриптом парсить письмо и скриптом рассылать по всем пользователям из базы данных. Вот надо заставить скрипт запускаться сначала.

        • Тут явно алиас напрашивается. Если уж колхозить скрипты, то по автодобавлению людей в алиасы. Вообще, обычно делается такая структура почтовых ящиков в организации. Создаются алиасы отделов, где все сотрудники отдела. Потом все алиасы отделов объединяются в общий алиас для всей фирмы.

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

          • Да, наверное вы правы.
            Напишу свой web интерфейс по управлению пользователями.
            Postfixadm не очень понравился в плане функциональности.
            Отлично что все в Mysql находится.

            • По-моему, есть еще какие-то панели управления postfix. Я никогда не изучал вопрос, так как меня postfixadmin полностью устраивает. Структура базы mysql очень простая. При желании, можно легко самому добавить все, что нужно. Иногда я напрямую в базу писал что-то для нетипового функционала.

              • Zerox, не могли бы вы выслать export таблицы /fetchmail на test@gtsever29.ru (требуется только структура, разумеется).
                Я ее случайно затер при конфигурировании плагина fetchmail для rouncube.
                Был бы признателен.

  64. Статья полностью актуальна. Сегодня обычным копипастом все настроил. Изменил только имя домена.

  65. У меня вот такая ошибка:
    postfix/pipe[2291324]: 98700611EB: to=, relay=dovecot, delay=4918, d
    elays=4918/0.03/0/0.11, dsn=4.3.0, status=deferred (temporary failure. Command output: Can't open log file /v
    ar/log/dovecot/lda-errors.log: Permission denied )

    devcot логах ничего нет, права на директорию /var/log/dovecot 775 vmail:dovecot

    Помогите, прямо сильный затык

    • В ошибке проблема с доступом к конкретному лог файлу lda-errors.log. Надо права конкретно на него смотреть. И проверять, он вообще существует или нет.

      • Тимофей

        Совершенно верно, он существует и имеет все те же разрешения, что и остальные файлы:

        -rwxrwxr-x 1 vmail dovecot 0 Dec 7 23:12 lda-errors.log

        • Чудес не бывает. Вы где-то ошиблись либо с правами, либо с путем или именем файла. Если совсем никак, закомментируйте все, что касается логов в конфиге. Логи будут писаться в системный лог.

          • Тимофей

            Браво! У меня был закрыт доступ в папку /var/log для остальных пользователей. Теперь все ОК.
            Мне кажется, это нужно отразить в вашем гайде, очень не очевидный момент, особенно когда почтовый архив хранится в другой папке, не связанный с var.
            Еще раз сердечно благодарю!

            • По дефолту в linux у пользователей есть доступ в директорию с логами. Так что это вы сами похоже закрыли его. Вряд ли об этом стоит рассказывать остальным. Это еще догадаться надо так сделать :)

  66. Александр А

    настроил до начала политик безопастности типа spf dkim, все было норм и вот после смены имени хоста все полетело. Был test@localhost, стал test@mail. Вопрос, мне теперь нужно везде в конфигах поменять localhost на mail или в некоторых местах?

  67. Андрей

    Да, в 99% случаев используем outlook. Спасибо, поищу информацию об этом.

  68. Андрей

    Доброго времени суток всем!
    Во первых, хочу поблагодарить автора за прекрасный сайт!
    Спасибо за то, что делитесь с нами информацией.

    При чтении статьи возник следующий вопрос:
    В данный момент почта крутится на Exchange 2010.
    Планирую настроить почтовый сервер по данной статье и если все получится нормально, постепенно перенести на него пользователей.
    Возникает один вопрос при планировании такого перехода - как организовать общую адресную книгу, по аналогии с Exchange.
    Из всего, что я нашел - более менее вменяемое решение (используемое, например в iredmail и mailcow) - это дополнительно установить SoGo.
    Может быть кто-то встречал другой способ организации общих адресной книги в данной связке при наличии active directory?

    • Хорошего решения данного вопроса лично я не знаю. Если в организации используются почтовые клиенты, а не web версия, то там как правило можно подключить адресную книгу ldap. В таком случае указываем AD и получаем все почтовые адреса пользователей из AD. Как по мне, так это нормальный вариант и я всегда использовал его. В качестве клиентов был либо Outlook, либо Thunderbird.

    • Примеры конф. файлов для работы sogo с AD:
      github.com/iredmail/iRedMail/blob/master/samples/sogo/sogo.conf

      • Есть идеи как бороться с подменой поля FROM внутри домена? Получается что со сломанного ящика представляются не сломаным и рассылают спам, все отчеты об неуспешной доставке ложатся в не сломанный ящик…

  69. А как правильно реализуется схема, когда сайты на 2 серверах с разными ip,а postfix+dovecot на третьем?
    Все также настраивается по статье для 3-го сервера, а на первых двух в roundcube указывается база созданная на почтовом сервере?
    И есть ли еще какие то нюансы?

    • Вариантов может быть масса. У roundcube своя база данных, никак не связанная с почтовой. Вы только настраиваете параметры почтового сервера в roundcube - imap и smtp. По сути это обычный почтовый клиент. Разместить его можно где угодно.

  70. Владимир

    Ошибка, перепроверил несколько раз

    Nov 22 22:12:19 mail.******.ge postfix/pickup[1521]: warning: /etc/postfix/main.cf, line 161: overriding earlier entry: smtpd_helo_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_he>
    Nov 22 22:12:19 mail.******.ge postfix/pickup[1521]: warning: /etc/postfix/main.cf, line 183: overriding earlier entry: smtpd_sender_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_>
    Nov 22 22:12:19 mail.******.ge postfix/pickup[1521]: warning: /etc/postfix/main.cf, line 201: overriding earlier entry: smtpd_recipient_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_non_fq>
    Nov 22 22:12:20 mail.******.ge postfix/qmgr[1522]: warning: /etc/postfix/main.cf, line 161: overriding earlier entry: smtpd_helo_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_helo>

    • В статье нет ошибки. Я на прошлой неделе по ней настроил почтовый сервер. Ищите ошибку у себя.

  71. Интересный подход, просто скажу - спасибо.

    Смотрю вашу версию правил Postfix`а, даже решил свои обновить.

    Только порядок слегка смутил, я всегда думал, что правила идут client, helo, sender, recipient, data, end-of-data, ну или в сокращенной версии client, helo, etrn.
    И если правильно вспомню, то включение soft_bounce ломает порядок. Поправьте.

    • Я точно не помню, но по-моему, порядок именно каждого набора правил в конфиге значения не имеет. Они все равно проверяются по мере наступления события в postfix. Очевидно, что сначала идет проверка на момент коннекта client, потом helo и т.д.

  72. Добрый день.

    Спасибо за инструкцию.
    Подскажите в чём может быть проблема. Создаю, как описано, пользователя в postfixadmin. Например, rbt@mail3.nlb.by.
    При отсылке на него письма в логах получаю:
    to=, relay=local, delay=0.32, delays=0.31/0/0/0.01, dsn=5.1.1, status=bounced (unknown user: "rbt")

    в main.cf задавал так:
    myhostname = mail3.nlb.by
    mydomain = nlb.by
    mydestination = $myhostname, localhost.$mydomain, localhost

    Спасибо.

  73. Спасибо за труд, инструкция рабочая, проверили на личном опыте, да и еще на Ubuntu
    Отказались от самоподписанного сертификата, задействовали Cerbot
    Так же отказались от ящиков которые собирают всю почту.
    Закоментил Sieve не запустилась, вернее не понял как ее правильно установить на Ubuntu

    Одна проблема с Алиасами, при отправки сообщение на алиас почту приходит 2 одинаковых письма, пока не понял как полечить.

    • На ubuntu тоже должно нормально настраиваться. Я использовал эту статью для настройки почтового сервера на убунте. Разница только в названиях пакетов. Все остальное одинаково делается.

  74. Виталий

    Получается что дома на виртуалке попробовать не получится без dns записей, только на боевую?

    • Попробовать можно. Вообще без dns записей отправка работать будет. И в целом вся настройка пройдет штатно. Другое дело, что дома у вас скорее всего закрыт 25-й порт. Провайдеры блочат его, чтобы не рассылали спам с домашних сетей.

  75. Просьба направить. Делал всё максимально соблюдая описанное. На этапе проверки почта не приходит в логах выдает ошибки. Кусок лога приведен. Я так понимаю, что не происходит взаимодействие postfix и базы. Хотя база создана, записи о ящиках и доменах там присутствуют. Права пользователю postfix предоставлены полные. Из postfixadmin отправка почты сваливает в ящик root (без создания домена) с сообщением о невозможности доставки.

    Oct 21 14:31:18 mail postfix/smtpd[3762]: connect from localhost[127.0.0.1]
    Oct 21 14:31:19 mail postfix/trivial-rewrite[3765]: warning: do not list domain altszn.ru in BOTH mydestination and virtual_mailbox_domains
    Oct 21 14:31:19 mail postfix/trivial-rewrite[3765]: warning: do not list domain altszn.ru in BOTH mydestination and virtual_mailbox_domains
    Oct 21 14:31:19 mail postfix/smtpd[3762]: 0654F40534A5: client=localhost[127.0.0.1]
    Oct 21 14:31:19 mail postfix/cleanup[3768]: 0654F40534A5: message-id=
    Oct 21 14:31:19 mail postfix/qmgr[3426]: 0654F40534A5: from=, size=579, nrcpt=3 (queue active)
    Oct 21 14:31:19 mail postfix/smtpd[3762]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
    Oct 21 14:31:19 mail postfix/trivial-rewrite[3765]: warning: do not list domain altszn.ru in BOTH mydestination and virtual_mailbox_domains
    Oct 21 14:31:19 mail postfix/trivial-rewrite[3765]: warning: do not list domain altszn.ru in BOTH mydestination and virtual_mailbox_domains
    Oct 21 14:31:19 mail postfix/trivial-rewrite[3765]: warning: do not list domain altszn.ru in BOTH mydestination and virtual_mailbox_domains
    Oct 21 14:31:19 mail postfix/local[3770]: 0654F40534A5: to=, relay=local, delay=0.07, delays=0.01/0.02/0/0.04, dsn=5.1.1, status=bounced (unknown user: "all-out")
    Oct 21 14:31:19 mail postfix/local[3772]: 0654F40534A5: to=, relay=local, delay=0.07, delays=0.01/0.04/0/0.02, dsn=5.1.1, status=bounced (unknown user: "ov22")
    Oct 21 14:31:20 mail postfix/local[3771]: 0654F40534A5: to=, relay=local, delay=1.3, delays=0.01/0.02/0/1.2, dsn=5.1.1, status=bounced (unknown user: "all-in")
    Oct 21 14:31:20 mail postfix/cleanup[3768]: 45577405A058: message-id=
    Oct 21 14:31:20 mail postfix/qmgr[3426]: 45577405A058: from=, size=2409, nrcpt=1 (queue active)
    Oct 21 14:31:20 mail postfix/trivial-rewrite[3765]: warning: do not list domain altszn.ru in BOTH mydestination and virtual_mailbox_domains
    Oct 21 14:31:20 mail postfix/bounce[3775]: 0654F40534A5: sender non-delivery notification: 45577405A058
    Oct 21 14:31:20 mail postfix/qmgr[3426]: 0654F40534A5: removed
    Oct 21 14:31:20 mail postfix/local[3770]: 45577405A058: to=, relay=local, delay=0.01, delays=0/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
    Oct 21 14:31:20 mail postfix/qmgr[3426]: 45577405A058: removed
    Oct 21 14:39:59 mail postfix/submission/smtpd[3778]: connect from ws013.depalt.alt.ru[192.168.0.81]
    Oct 21 14:40:00 mail postfix/submission/smtpd[3778]: disconnect from ws013.depalt.alt.ru[192.168.0.81] ehlo=1 mail=0/1 quit=1 commands=2/3
    Oct 21 14:43:20 mail postfix/anvil[3780]: statistics: max connection rate 1/60s for (submission:192.168.0.81) at Oct 21 14:39:59
    Oct 21 14:43:20 mail postfix/anvil[3780]: statistics: max connection count 1 for (submission:192.168.0.81) at Oct 21 14:39:59
    Oct 21 14:43:20 mail postfix/anvil[3780]: statistics: max cache size 1 at Oct 21 14:39:59
    • Судя по всему вы отправляете почту от домена altszn.ru, но он не прописан ни в mydestination, ни в списке доменов virtual_mailbox_domains. То есть вы не добавили этот домен через postfixadmin. Может просто опечатка где-то?

      • В postfixadmin я его (altszn.ru) заводил первым. Он там точно есть... В админе и список ящиков показывает, и список доменов с содержащимися в них ящиками. Попытка отправки почты telnet mail.altszn.ru 25 работает прямыми командами на root@altszn.ru. Письмо в этом случае попадает в /var/mail (что и указано в конфигах как корень почты), но не в каталог /var/mail/altszn.ru/xxx как ожидалось.

  76. Николай

    Доброго времени суток!
    Есть перспектива настроить postfix/dovecot используя зашифрованное соединения с БД добавив пользователю параметр REQUIRE SSL;
    попробовал найти инфо в интернете, такое возможно, но что нужно дописать для postfix в виртуальных картах?
    Подключить PostfixAdmin используя SSL получилось. Как на счет настройки самого postfix?? Спасибо за ответ!

  77. Добрый день!

    А можно в postfix сделать группу для рассылок по офису? Т.е. создать группу 911@office.com при отправке на которую письма, postfix будет автоматом рассылать письма по всем ящикам офиса, и чтобы этот ящик принимал почту только с адресов @office.com а остальные резал?

    Никак не могу понять как это сделать.
    Спасибо!

    • Это штатно делается через postfixadmin. Создавайте алиас 911@office.com и добавляйте туда любые ящики.

      А вот чтобы отправка только из офиса работала, надо немного заморочиться. Но ничего особо сложного нет. Я так делал через стандартные recipient_restrictions.

      В конфиге делаем примерно так:

      smtpd_recipient_restrictions = permit_mynetworks,
       permit_sasl_authenticated,
       check_recipient_access hash:/etc/postfix/maillist_access
       ..................................

      Файл maillist_access примерно такого содержания:

      911@office.com REJECT

      В итоге все, кто подходят под условие permit_mynetworks и permit_sasl_authenticated смогут отправлять сюда письма, а все остальные нет.

  78. Сергей

    А что можете сказать по железу для почтового сервера на 50-100 пользователей, особенно интересует, можно ли все это в каком-нибудь контейнере proxmox поднять, не будет ли нюансов или должен быть железный сервер?

    • Можно в контейнере или виртуальной машине. Ресурсов много не надо. 4 гига памяти и 2 ядра будет достаточно для старта 50-100 пользователей.

  79. День добрый, а кто нибудь пробовал подключать в эту связку Ldap для заведения ящиков? Может есть опыт?

  80. Подскажите а как добавить List-Unsubscribe: <https://mysite/subscriptions?

  81. Санжар

    Доброго времени суток! Прошелся по инструкции, застрял на установке roundcube.

    База создана, конфиги тоже.

    Но при попытке логина выходит:

    IMAP Error: Login failed for test@example.com against localhost from 192.168.1.5. AUTHENTICATE PLAIN: in /var/www/html/webmail/program/lib/Roundcube/rcube_imap.php on line 200 (POST /webmail/?_task=login&_action=login)

    • Возможно не правильно настроили параметры imap сервера в roundcube. Если делать точно по статье, все получится.

  82. Сергей

    Подскажите в чём может быть причина? Настроил по вашей инструкции, при отправке и получении писем через веб-инстерфейс (roundcube) время исходящих и входящих писем отстаёт на час. В почтовом клиенте (ThunderBird) время писем отображается верно.

    • Возможно в настройках php стоит другой часовой пояс. Roundcube берет его оттуда. Измените в php.ini часовой пояс в параметре date.timezone.

      • Сергей

        В php.ini Asia/Novosibirsk в настройках windows (UTS +7) Новосибирск, а в roundcube отправка и получение как будто +6

        • Сергей

          В настройках roundcube Часовой пояс выставил (UTS +7) Новосибирск вместо Автоматически, теперь верно отображается.

  83. Сергей

    Для установки дополнительных модулей PHP из remi нужно сделать так:

    sudo dnf --enablerepo=remi install php-pear php-mcrypt php-intl php-ldap php-pear-Net-SMTP php-pear-Net-Sieve php-pear-Mail-Mime php-pear-Net-IDNA2

    Описание есть на сайте
    https://centos.pkgs.org/8/remi-x86_64/php-pear-Net-Sieve-1.4.4-1.el8.remi.noarch.rpm.html

    • Спасибо за информацию. Только я так и не понял, почему они без enablerepo=remi не ставятся?

  84. inkvizitooor

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

  85. Сергей

    Небольшая ремарка по поводу нового Thunderbird 78+. Теперь обязательно нужно чтобы имя почтового сервера, которое вводится в поле для подключения совпадало с именем в сертификате иначе 78+ версия не подключается по защищенному соединению никак и при этом на стороне сервера подобная ошибка
    TLS handshaking: SSL_accept() failed: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate: SSL alert number 42
    При этом 68 версия чувствует себя прекрасно.
    По сути получается если домен examle.com и его почтовый сервер mail.example.com находятся на одном сервере, то можно 1 сертификат на все, а если они разнесены по разным ip, то нужно везде свой сертификат с правильным CN.
    Как помнится ранее Thunderbird спрашивал если какие-то нюансы с сертификатом были и можно было занести исключения, а сейчас непонятно все как-то.

    • Получается, они исключили возможность вручную признать сертификат доверенным, даже если он не валидный. Это очень странно, так как браузеры, к примеру, до сих пор позволяют это сделать. Я не проверял эту тему.

  86. Добрый день. Настраиваю сервер по Вашей статье. Сделал все по тексту.Но не отправляются письма, даже на внутренние адреса. В логах пишется это:
    postfix/submission/smtpd[15362]: warning: connect #4 to subsystem private/proxymap: Connection refused
    postfix/submission/smtpd[15362]: warning: connect #7 to subsystem private/proxymap: Connection refused
    postfix/submission/smtpd[15362]: warning: connect #8 to subsystem private/proxymap: Connection refused
    postfix/submission/smtpd[15362]: warning: connect #9 to subsystem private/proxymap: Connection refused
    postfix/submission/smtpd[15362]: warning: connect #10 to subsystem private/proxymap: Connection refused
    postfix/submission/smtpd[15362]: fatal: connect #11 to subsystem private/proxymap: Connection refused
    postfix/master[3709]: warning: process /usr/libexec/postfix/smtpd pid 15362 exit status 1
    postfix/master[3709]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

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

    • Не припоминаю, чтобы сталкивался с такими ошибками. Думаю, вы где-то в конфигах что-то напутали. Могу порекомендовать только проверить еще раз все внимательно. Статья 100% рабочая.

      • Аноним

        Статья то отличная. Спасибо за ответ, буду искать свои косяки. Сначала ругалась на отсутствие proxymap в /var/spool/postfix/private/proxymap. Переустановил postfix и получил вот это.

    • Александр

      Удалось это победить?

    • Вы удалили оригинальное содержимое из файла master.cf, а там было много всего интересного :) Верните взад, а конфиг из статьи добавьте в конец файла.

  87. Евгений

    Добрый день.

    Установил всё по статье, всё работает.
    Добавил ещё один почтовый домен, все тесты прошёл, в roundcube всё работает, но, не могу подключить ящик в outlook, ящик нового домена, с первым всё ок. При подключении outlook пишет "Зашифрованное подключение к серверу недоступно". Какие логи смотреть? Странно что в двух других офисах именно 2016 outlook без проблем ящик добавил, а на 2019 outlook не хочет. Да, ещё почему то джейл Fail2Ban'a - dovecot блокирует тех кто пытается добавить ящик в 2019 outlook. Второй день мучаюсь, явно где то какая то мелочёвка закралась.

    • Евгений

      Если в 2019 аутлуках указываю все настройки imap\smtp и порты вручную, проблем нет, ящик добавляется. Но ведь ящики первого почтового домена добавляются указывая ящик и пароль автоматически и без проблем, не пойму почему на втором почтовом домене такой затык.

      • Евгений

        Вот что в логе /var/log/dovecot/info.log при несостоявшейся настройке ящика в outlook namebox@domain2.ru:
        Aug 23 17:28:04 auth-worker(1393): Info: sql(namebox@domain1.ru,95.31.222.144,): unknown user

        Конечно нет такого пользователя, ведь он не в домене domain1.ru а в домене domain2.ru. Почему подставляется неверный домен?

        Пробовал в mail.conf
        mydestination = localhost
        myorigin = localhost

        Думается мне надо смотреть в сторону /etc/dovecot/dovecot-mysql.conf

        или в postfix во все virtual_*.conf

        Не в запросах ли может быть дело? то как они вытягивают из базы инфу и подставляют её аутлуку при его настройке?

        • С dns может как-то связано. По идее вся эта автонастройка через dns получает адрес mx сервера и пытается по этой записи авторизоваться. Но вообще я мало заморачиваюсь с автонастройкой. Всегда руками прописываю параметры, чтобы как раз не тратить время на эти проблемы.

  88. Александр

    Разрази меня гром, я ни где в статье не вижу где создается база postfix.

    Предположу, что ее создает postfixadmin но я же должен завести пользователя с привилегиями для создания базы в mysql, однако тоже не вижу этого. В конфиге postfixadmin пользователь postfix и пароль 123

    • "Сразу создадим тут пользователя postfix и одноименную базу данных. Запомните учетные данные, они нам далее понадобятся. Установите кодировку базы utf8_general_ci, чтобы потом не возиться с этим."

      Я показываю, как установить phpmyadmin. Дальше через нее вся работа с базой идет.

  89. хорошая инструкция. только ничего нет о том , что в минималке не ставится rsyslog. А он очень дальше нужен. для fail2ban как минимум.

    • подобная и у меня проблемка была.
      Кому как, а я впервые ставлю почтовик
      Много времени потратил на перепроверку всего
      пока не ..:)

      • В моем случаи CentOS-8.2.2004-x86_64-minimal
        была без rsyslog

        • А логи системные как писались? Что-то я не представлю себе систему без syslog.

          • вообще то мне как то незачем придумывать небылицы
            Проблема обнаружилась как в директории /mnt/mail
            ничего не создалосъ. Погуглив нашел решение.
            rsyslog был установлен как отдельный пакет.
            Это 100%

    • В какой минималке? Не припоминаю, чтобы система ставилась без rsyslog. Никогда его отдельно не ставил, хотя обычно всегда использую минимальные установки.

  90. Подскажите нет ли проблем при переходе на dovecot 2.3 Обновил пакеты и почтовіе приложения не соединяются с imap. Конфиг поправил на ssl_min_protocol = TLSv1.2
    Восстанавливаю машину до обновления, все работает. Кроме этой строчки больше изменений не производить в конфе?

    • А ошибки какие? Я не помню точно, какую версию dovecot использую на серверах, надо проверять.

  91. надеюсь на помощь, но никак не поборю
    настройки проверил несколько раз.
    После установки postfix и dovecot
    и их активации ошибок не выдало.
    Была печаль с логами , так как в минималке не останавился rsyslog
    Через postfixadmin созданы были all_in@... и all_out@...
    Но их нет в директории /mnt/mail
    thunderbird 78.1.1 не могу подключить.

    • собственно нашел как тут так и на портале dovecot
      нужен inbox для namespace.
      Подключился eM client, но не thunderbird
      так как другоие директории использовал, были проблемы
      Была возня с roundcube, но уже работает
      На данный момент почему-то не активоровался плагин ACL
      Было у кого-то с ним проблемы?

      • помогите биттэ с ошибкой как
        " Настройки -> Папки. Создаем там любую папку"
        --> не могу создать
        выдает ошибку
        http://joxi.ru/D2PZ0nviJqkqKr

        • Я не понимаю этот язык. Что написано в ошибке?

          • Ах,да. При создании папки произошла ошибка. Все.
            Не дает создать папку. Проблемна вероятно с правами.
            Но...почему

            • получилось весьма интересно.
              много перепроверял. контролировал конфиги
              и факт что все было верно.
              В итоге заработало. Даже как то страно.

  92. Здравствуйте! Спасибо большое за ваши статьи, очень часто ими руководствуюсь. Сейчас настраиваю почтовый сервер и споткнулся на шаге "Самый простой и быстрый способ проверить работу почтового сервера — отправить на него письмо". У меня в логе выдает такое:

    Aug 9 16:25:11 mail postfix/smtpd[23209]: connect from mail-ua1-f48.google.com[209.85.222.48]
    Aug 9 16:25:11 mail postfix/smtpd[23209]: warning: SASL: Connect to private/dovecot-auth failed: No such file or directory
    Aug 9 16:25:11 mail postfix/smtpd[23209]: fatal: no SASL authentication mechanisms
    Aug 9 16:25:12 mail postfix/master[8802]: warning: process /usr/libexec/postfix/smtpd pid 23209 exit status 1
    Aug 9 16:25:12 mail postfix/master[8802]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

    Подскажите пожалуйста, в какую сторону копать. Спасибо!

    • Прошу прощения, проблема была в том, что не сохранил настройки в /etc/dovecot/dovecot.conf. После сохранения лог изменился на:
      Aug 9 17:17:00 mail postfix/smtpd[2703]: connect from mail-ua1-f46.google.com[209.85.222.46]
      Aug 9 17:17:01 mail postfix/smtpd[2703]: Anonymous TLS connection established from mail-ua1-f46.google.com[209.85.222.46]: TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
      Aug 9 17:17:01 mail postfix/smtpd[2703]: 9FDA120ACA27: client=mail-ua1-f46.google.com[209.85.222.46]
      Aug 9 17:17:01 mail postfix/cleanup[3332]: 9FDA120ACA27: message-id=
      Aug 9 17:17:01 mail postfix/qmgr[1707]: 9FDA120ACA27: from=, size=6416, nrcpt=1 (queue active)
      Aug 9 17:17:02 mail postfix/pipe[3333]: 9FDA120ACA27: to=, relay=dovecot, delay=0.36, delays=0.31/0.02/0/0.04, dsn=2.0.0, status=sent (delivered via dovecot service (doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -Pn > dovecot-new.conf d))
      Aug 9 17:17:02 mail postfix/qmgr[1707]: 9FDA120ACA27: removed
      Aug 9 17:17:02 mail postfix/smtpd[2703]: disconnect from mail-ua1-f46.google.com[209.85.222.46] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7

      Письмо в all_in@... не приходит и предупреждение выдает "Aug 9 17:17:02 mail postfix/pipe[3333]: 9FDA120ACA27: to=, relay=dovecot, delay=0.36, delays=0.31/0.02/0/0.04, dsn=2.0.0, status=sent (delivered via dovecot service (doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -Pn > dovecot-new.conf d))"

      • Тут к гадалке не ходи, где-то что-то в конфиге довекота напутано. Если все делать точно по статье, то все получится. Я сам по ней настраиваю сервера.

        • и при попытке авторизации через Thunderbird
          Aug 9 21:27:48 mail postfix/smtpd[43609]: connect from unknown[195.66.199.158]
          Aug 9 21:27:48 mail postfix/smtpd[43609]: disconnect from unknown[195.66.199.158] ehlo=1 quit=1 commands=2

          Это не может быть связано, что версия Dovecot v2.3.8 уже, а в статье 2.2? На ssl_min_protocol менять пробовал, но не помогло((

  93. Владимир

    Подскажите в чом может быть проблема.
    Сделал все в точности как написано в статье. Но про отправке письма оно уходит но до адресата не доходит и в лог пишется следующие
    Aug 6 11:46:25 mail postfix/smtps/smtpd[2665]: warning: hostname 162-86-87-77.omsk.mts.ru does not resolve to address 77.87.86.162: Name or service not known
    Aug 6 11:46:25 mail postfix/smtps/smtpd[2665]: connect from unknown[77.87.86.162]
    Aug 6 11:46:25 mail postfix/smtps/smtpd[2665]: Anonymous TLS connection established from unknown[77.87.86.162]: TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
    Aug 6 11:46:25 mail postfix/smtps/smtpd[2665]: F04276069438: client=unknown[77.87.86.162], sasl_method=PLAIN, sasl_username=info@tkrru.ru
    Aug 6 11:46:26 mail postfix/cleanup[2670]: F04276069438: message-id=
    Aug 6 11:46:26 mail opendkim[818]: F04276069438: DKIM-Signature field added (s=mail, d=tkrru.ru)
    Aug 6 11:46:26 mail postfix/qmgr[1186]: F04276069438: from=, size=716, nrcpt=2 (queue active)
    Aug 6 11:46:26 mail postfix/pipe[2673]: F04276069438: to=, relay=dovecot, delay=0.32, delays=0.25/0.01/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
    Aug 6 11:46:26 mail postfix/smtps/smtpd[2665]: disconnect from unknown[77.87.86.162] ehlo=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=6
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: hash:/etc/postfix/tls_policy_maps is unavailable. open database /etc/postfix/tls_policy_maps.db: No such file or directory
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: hash:/etc/postfix/tls_policy_maps lookup error for "rcconf.ru"
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: smtp_tls_policy_maps, next-hop destination "rcconf.ru": policy table lookup error
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: TLS policy lookup for rcconf.ru/mx.yandex.net: client TLS configuration problem
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: TLS policy lookup for rcconf.ru/mx.yandex.net: client TLS configuration problem
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: TLS policy lookup for rcconf.ru/mx.yandex.net: client TLS configuration problem
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: TLS policy lookup for rcconf.ru/mx.yandex.net: client TLS configuration problem
    Aug 6 11:46:31 mail postfix/smtp[2600]: warning: TLS policy lookup for rcconf.ru/mx.yandex.net: client TLS configuration problem
    Aug 6 11:46:31 mail postfix/smtp[2600]: F04276069438: to=, relay=none, delay=5.3, delays=0.25/0/5/0, dsn=4.7.5, status=deferred (client TLS configuration problem)

    Я понимаю что проблема в TLS но вот решить её самостоятельно не удаётся

    • У вас вот ошибка:

      hash:/etc/postfix/tls_policy_maps is unavailable. open database /etc/postfix/tls_policy_maps.db: No such file or directory

      Если вам не нужны эти настройки, просто закомментируйте в конфиге postfix упоминание об этом файле. Я его дал просто для информации тем, кому будет нужно. Речь вот о чем

      #smtp_tls_policy_maps = hash:/etc/postfix/tls_policy_maps
      • Аноним

        Да. Спасибо.
        Эта настройка мне понадобится в будущем.
        А проблема скорее всего была в том что не корректно сгенерировался сертификат.
        Я переделал сертификат перезапустил postfix и все заработало.
        Спасибо еще раз за ваши статьи.

  94. Первый раз настраивал почтовый сервер на CentOS 8. Очень помогла данная статья. Большое спасибо.

    Столкнулся со следующими проблемами (для примера: сайт - site.ru, почтовый сервер - mail.site.ru, Email - info@site.ru):
    1. Ошибка "Error: namespace configuration error: Duplicate namespace". Лечится добавлением "inbox" после "namespace". Ранее об этом уже писали.
    2. Thunderbird категорически отказался подключаться к серверу по защищенному соединению с любыми вариантами настроек - соединения определял верно, но далее вываливал ошибку при подключении/аутентификации. debug.log:
    imap-login: Debug: SSL alert: where=0x4004, ret=554: fatal bad certificate
    imap-login: Debug: SSL: where=0x2002, ret=-1: error
    imap-login: Debug: SSL error: SSL_accept() failed: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate: SSL alert number 42
    При этом eM Client подключился без проблем, также без проблем прикрутил ящик к своей почте на mail.ru. В итоге понял, что Thunderbird не устраивает сертификат на домен site.ru, т.к. почтовый сервер другой (mail.site.ru). Выпустил сертификат на mail.site.ru, прикрутил к почте - Thunderbird подключился. Но отказался отправлять письма, т.к. домен в Email (site.ru) не соответствует почтовому серверу (mail.site.ru). Перенастроил все так, чтобы почтовый сервер тоже был на site.ru - Thunderbird доволен.

    Оценка письма на mail-tester.com - 7.5. SPF, DKIM, DMARC - проверку прошли.

  95. 93.175.56.122 none
    77.221.87.91 encrypt protocols=TLSv1

    добрый , что это за ип адреса ? я не могу понять откуда взялись и как управлять ?

    • Тут можно ничего не указывать, оставить файл пустым. Это я привел пример, как настроить работу tls индивидуально для отдельных ip адресов.

  96. Владимир. если не затруднит ответьте на вопрос. как сделать что бы при подключении через тандерберд в поле Аутентификации выбирать не Обычный пароль а зашифрованный?
    и еще заметил, что отлук если версия pro то подключается спокойно к почтовому серверу а если уже версии стандарт или любая другая то не подключается.?

    • Насчет зашифрованного пароля не знаю, что надо сделать. Никогда не задавался этим вопросом. По-моему, это не имеет большого смысла во времена tls соединений. Было актуально во времена обычных соединений, нешифрованных. Возможно ошибаюсь, не изучал вопрос.

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

  97. "В" Украине, а не "НА", вроде умный человек или у себя тоже говорите "на России"?

    • На Колыме мы у себя говорим. Не надо меня учить русскому языку.

      • Аноним

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

        • А полетите в отпуск вы в государство Кубу, Кипр или на Кубу, на Кипр? Что за ерунду вы тут разводите? "На Украине" устоявшаяся норма литературного РУССКОГО языка, который я изучал в школе и на котором я разговариваю. И не надо меня учить ему.

          • Аноним

            Я учу как правильно/корректно писать, если в школе учили НА, то видимо плохая школа(учитель) была. Учился при совке, это вообще отдельная вселенная. Но если у вас там на России так говорят, то флаг вам в руки, на России еще и США врагом считают, и терроризм не спонсируют, да вы вообще "молодцы")

            • Я так и не понял, вы на Кубу полетите отдыхать или в Кубу? Вы сами кто такой, чтобы УЧИТЬ? И тем более хаять советское образование.

            • Тараса Шевченко еще поучите, как ему правильно писать надо.

              Як умру, то поховайте
              Мене на могилі
              Серед степу широкого
              На Вкраїні милій.

              • Аноним

                Я живу в Украине, и в Кубу не собираюсь. Если что-то сделано не верно изначально это не значит что нужно крест на лбу поставить и слепо следовать этому по жизни.

                ЗЫ; А вы ПОЭТ?
                ЗЗЫ; Какой сейчас век? 18? 19?

                http://slovopedia.org.ua/30/53411/26270.html
                я думаю такой айтишник загуглит перевод.

                • Если какой-то горе политик в 90-х годах решил, что русский язык надо менять, это не значит, что до этого несколько веков дураки жили и говорили неправильно. Эта независимость мозга от здравого смысла меня уже утомила. Я прекращаю диалог. Живите где хотите и как хотите, и говорите тоже, как вам вздумается, на любом языке. Только не учите меня русскому языку, который я получше Вас знаю, что подтверждает даже этот диалог. "В" или "На" Вас сильно беспокоит, а то, что пишите на русском безграмотно, даже не замечаете, но пытаетесь меня учить грамотности. Сюрр какой-то.

                  • Аноним

                    Не вижу смысла доказывать что-то тому кто слепо верит в советский идеализм. В данном случае ты не прав и это факт. Раньше еще женщин сжигали и расстреливали за имхо. Может твой табель и лучше, но ты явно глепее меня. Живи с этим.

                  • Ну что же сразу на личности переходить? Кто же так спор-то ведет? Нужно жить дружно. А что касается языка, так это не точная наука, тут нет неизменных законов, поэтому любой язык постоянно изменяется под влиянием неких факторов. И как вы уже сказали, какой-то плитик решил изменить. И с того момента все, теперь уже неправильно говорить "на" Украине и сколько не веди разговоров на эту тему, фактически вы будете не правы. А что касается здравого смысла и языка, так это мне кажется лишено здравого смысла)) Какой здравый смысл в языке?? Язык воспринимается как данность, мы говорим так, потому что мы говорим так, и в этом нет логики. Правила языка нужно запоминать а не понимать, поэтому существуют мнемоники. Конечно чем старше мы становимся тем сложнее нам даются перемены, тем более не логичные перемены) Но нужно понимать что мир постоянно меняется, а современный мир, просто невозможно быстро меняется.
                    Да, я тоже фанат логики, поэтому не фанат правил языка, так что прошу заранее меня простить за возможно совершенные ошибки в грамматике ) Но надеюсь моя безграмотность не помешает донесению посыла.

                    • Собственно дело в принципе. В старину говорили на Руси.
                      Или сейчас на Алтает. И не политик решил, а суть якобы
                      по тем же правилам русского языка, что для стран применяют В
                      а для регионов , областей и т.д НА. Украина - не окраина.
                      Русских/РФ граждан менять не собираюсь. Говорю как бывший гражданин УССР, Украины и ныне Германии.
                      Житель Донецка.И считаю что тут про это нет надобности спорить. Тут другая тематика.
                      Прекрасная страница. Был бы доступный мне вид платежа, то сделал бы пожертвование.
                      Реально огромное спасибо.

                    • Виталий

                      Дык автор живет где-то в СССР явно, когда Украина была частью сверхдержавы, пускай тогда в этом "НА" был смысл, но в данном контексте употребляя "НА" Украине он показывает что это не отдельная страна и народ, а часть русского мира. С чем я собственно и не согласен. Считаю что автор должен исправить ошибку, тем более если она вызывает негодование у граждан страны которую он судя из контекста "не признает", если конечно он не напыщеный самовлюбленный лицемер с завышеным ЧСВ ;)

                      ЗЫ; А по теме статья годная.

            • Виктор

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

  98. Здравствуйте, сейчас пробовал в первый раз устанавливать почтовик и столкнулся с проблемой на этапе проверки. Никак не могу ни залогиниться в ящик, ни получить каких-либо писем. Всегда выдаёт access denied
    из maillog'a видны такие записи:
    При попытке получить письмо в ящик:
    NOQUEUE: reject: RCPT from (адрес сервера с которого отправляешь, например мылору) Recipient addres rejected: access denied

    При попытке зайти в ящик через TB:
    improper command pipelining after EHLO

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

    • Эти проблемы вроде решились, оказалось что накосячил с SSL в новой версии dovecot'a
      Но теперь хоть убей не могу получить ни одно письмо и ничего не сохраняется в базе

      • Статья 100% рабочая. Я недавно по ней настраивал. Меньше месяца назад. Внимательно все проверяйте.

      • А как решилась эта проблема? NOQUEUE: reject: RCPT from (адрес сервера с которого отправляешь, например мылору) Recipient addres rejected: access denied
        никак не могу найти причину(

        • В логе должны быть еще ошибки. Смотрите внимательнее. Возможно таблица mysql не читается, где пользователи записаны. Судя по ошибке, нет доступа к списку получателей, то есть пользователей вашего почтового сервера.

  99. Андрей

    Добрый день. Планирую изучить возможность установки у моих клиентов почтовых серверов. Почитал разные статьи и понял, что опенсорсные сервера умеют многое. Но ни где не нашел информации, как организовать на них функционал - при файле больше 20 Мб автоматическая вставка в письмо ссылки на скачивание вместо прикрепления файла непосредственно к письму.
    Это единственное, что останавливает меня от того, чтобы предложить клиентам переехать с Яндекса на свой сервер.
    Как реализовать это? Т.е. пользователь в веб-версии кабинета почты прикрепляет большой файл, а он грузится на внутренний файловый сервер, с которого уже получатель письма скачает по ссылке из письма. При чем отправитель не должен заморачиваться, чтобы самому скопировать файл на ресурс, сгенерировать ссылку и вставить её в письмо. Чтобы было как у Яндекса, Mail.ru, GMail.

    • Такого нет в готовом виде нигде. Нужно колхозить самому и это будет не просто. Есть в Zimbra нечто подобное, но я не уверен, что в бесплатной версии это работает так, как хочется. Скорее всего будет возможность загрузки из общего хранилища, только если файл отправляется внутри почтового сервера, а нее для внешнего клиента.

    • Такое реализовано в почтовом клиенте Thunderbird.

  100. Алексей

    Если включен SElinux потребуется chcon -R -t httpd_sys_content_rw_t /var/www/html/padmin/templates_c на этапе установки Postfixadmin. Иначе установщик не запустится.

  101. Николай

    Доброго времени суток!
    Есть вопрос по настройке black_client_ip
    Подскажите где почитать или может сами сталкивались.
    Есть сервер на базе Ubuntu 20.04, стек LEMP, ну и Postfix/Dovecot.
    Пару дней назад ко мне начал ломится один IP и подбором с попыткой отправить письмо на все возможные адреса домена (то ли данные собирает про всех, что бы спам потом слать, то ли просто подбирает имена юзеров что бы потом взломать, не суть).
    Лог файл завален запросами, ~20тыс. за сутки, конечно же нужно как-то от него избавится, что бы не грузил напрасно Postfix:
    Jul 8 09:36:36 xxxxx postfix/smtpd[2183]: connect from unknown[212.70.149.3]
    Jul 8 09:36:44 xxxxx dovecot: auth-worker(2292): sql(kriste@xxxxxx.com,212.70.149.3): unknown user
    Jul 8 09:36:46 xxxxx postfix/smtpd[2183]: warning: unknown[212.70.149.3]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
    Jul 8 09:36:47 xxxxx postfix/smtpd[2183]: disconnect from unknown[212.70.149.3] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/4
    Наткнулся на Вашу запись в конце поста по настройке списков от спамеров, попытался у себя реализовать, но не получается. Ниже часть настроек из main.cf:

    smtpd_restriction_classes =
    black_client_ip
    black_client_ip = check_client_access hash:/etc/postfix/lists/black_client_ip

    smtpd_helo_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    black_client_ip
    reject_invalid_helo_hostname
    reject_non_fqdn_helo_hostname
    reject_unknown_helo_hostname

    smtpd_client_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unknown_client_hostname

    smtpd_sender_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_non_fqdn_sender
    reject_unknown_sender_domain
    #reject_unverified_sender

    Файлы создал, путь правильный, названия совпадает...

    Добавляю IP:
    212.70.149.3 REJECT You IP are blacklisted!

    Обновляю файл:
    root@xxxxx:/etc/postfix/lists# postmap black_client_ip

    И ничего, он и дальше ломится на сервер и такими же запросами, без изменений: postfix check ошибок не выдаёт, вроде все работает. Куда копнуть дальше?

    • Николай

      Так же хочу заметить что по первом запросе postmap в логе происходит вот такое:
      Jul 8 11:16:41 xxxxx postfix/smtpd[6608]: error: open database /etc/postfix/lists/black_client_ip.db: No such file or directory

      Это продолжаю бороться с данным IP и пересоздал файл black_client_ip, после запроса postmap появляется ещё один файл black_client_ip.db, но он не открывается для чтения, не понятная кодировка файла.

    • С такими товарищами надо бороться с помощью fail2ban - https://serveradmin.ru/fail2ban-postfix-dovecot/ а не черными списками.

      • Николай

        Да, спасибо! Уже реализовал вчера все, сейчас наблюдаю за его поведением. Почитал на просторах интернета что это самый примитивный способ, но работает то он прекрасно! Не пойму в чем примитивность. Главное результат.

        Возвращаясь к баранам, протестировал блокировку black_client, - работает на ура, а вот работу black_client_ip не пойму, почему не срабатывает, какие условия должны быть что бы он сработал?

  102. Спасибо за статью. Есть такой кейс - нужно сделать квоты на исходящую отправку ограничивающие количество писем в час/день? Можете подсказать решение, в статье и комменах не нашел, но возможно я невнимательный))

    • Мне такие решения не известны. Не видел подобного функционала, реализованного в postfix. Думаю, из коробки этого нет. Нужно реализовывать самому, программируя функционал и используя возможности postfix в виде его ограничений.

  103. Здравствуйте.
    Посоветуйте, пожалуйста, в чем может быть проблема:

    VPS c ISPManager 5 (exim + dovecot). Сервер стоит за NAT'ом от Mikrotik. Порты (25, 110 и т.д.) проброшены. Соответственно у сервера, есть "внутренний" IP (192.168....) и "внешний" IP. (93.94.....)

    При отправке почты, она уходит и доставляется на другие сервера. Но при этом в логах the_bat есть ошибка "Server reports error. The response is: Incorrect authentication data".

    Но все письма, отправляемые НА почту на сервере, не доходят. При этом, если задать в настройках "действие по умолчанию" в панели управления ISPManager для этого почтового ящика действие "переслать на ящик ....", то пересылка опять же происходит. То есть, сервер по факту получает почту и почему-то решает, что что-то не так и выполняет "действие по умолчанию при ошибке".

    В reject.log - строка "auth_cram_md5 authenticator failed for хост [IP-адрес]: 535 Incorrect authentication data (set_id=почтовый_ящик)"

    Если отправить почту самому себе - все отлично доставляется.

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

    Заранее спасибо!

    • Так а что тут гадать, если извне нет подключения по 25 порту. Конечно, почта не придет. Надо разбираться с этой проблемой.

  104. Статья полностью актуальна. Только что поднял по ней почтовый сервер с нуля.

  105. Михаил

    Добрый день,

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

    Сервер поднимал на DigitalOcean и, как позже выяснилось, они блокируют исходящие запросы на 25 порт (как и AWS). Написал в поддержку. Там ответили, что не могут открыть 25 порт и мне следует использовать 587 или вообще отправлять все через MailGun или Google. Подскажите, пожалуйста, как заставить postfix использовать 587 порт по-умолчанию? В некоторых статьях советуют указывать relayhost как [my.domain]:587, но в логах postfix все равно шлет на 25 порт.

    Настраивал все четко по Вашим инструкциям.

    • Вас не спасет использование другого порта. У вас запрещена отправка по 25 порту. Именно по этому порту другие почтовые серверы будут ждать от вас соединение. Я не знаю, как лучше обыграть эту ситуацию без потерь. Я лично из-за этого не использую DO. Тоже столкнулся с этим ограничением в свое время.

      В данном случае единственное надежное решение - поднимать где-то в другом месте почтовый сервер. Настраивать отправку почты с вашего почтового сервера в DO или AWS не по 25-му порту через этот второй почтовый сервер, а он уже будет в мир отправлять. Но в таком случае возникает вопрос, нахрена вообще нужен почтовый сервер на DO или AWS?

      • Михаил

        Благодарю за быстрый ответ!

        Тоже думал о переносе сервера на другой хостинг без подобных ограничений, но сходу не припомню адекватных сервисов. Может сможете подсказать один-два хостинга? Или все провайдеры блокируют 25 порт?

        Пока пробую договориться с AWS. Может там поддержка адекватней.

        • Не все. Я бы даже сказал, большинство не блокируют, так что с поиском проблем быть не должно. Вообще, обычно с поддержкой так или иначе можно договориться. К примеру, в linode я писал в поддержку. У них тоже закрыт 25-й порт. Мне там сказали, что нужно создать домен, сделать A и MX запись с этого домена на ip адрес нужной виртуалки и написать им. После этого открывают 25-й порт.

        • Сергей

          Рекомендую Keyweb
          Очень адекватная служба поддержки. У меня с почтовым сервером проблем не было.
          Если что 50% скидка на первый счёт.
          Инвайт Линк: https://my.keyweb.ru//375
          Промокод: 50formyfriend

          Удачи!

          • У меня года два висела реклама Keyweb. Я с ними сотрудничал. В целом, нормальный хостер. Можно пользоваться.

      • Доброго дня!
        По статье настроил на виртуалке тестовый сервер, все работает замечательно. Отдельное спасибо за рабочий гайд для тех, кто впервые настраивает почтовик.
        Столкнулся с проблемой, что при переключении трафика на с ЭР-телекома на Ростелеком перестали уходить письма во внешку. В логах "...status=deferred (connect to mx.yandex.net[77.88.21.249]:25: No route to host)". Перерыл конфиги по статье, думал где-то может что-то забыл подправить кроме DNS записей, но как я понял из комментариев проблема не в сервере.

        А из выше Вами сказанного можно даже не заморачиваться о смене порта на 587?

        • Хотя вот Ростелеком сообщил мне, что ничего не блокирует. Что у меня могло сломаться?

        • По логам явно видно, что проблема сетевая. Тупо нет подключения на 77.88.21.249:25
          connect to mx.yandex.net[77.88.21.249]:25: No route to host
          Попробуйте туда телнетом подключиться с почтового сервера.

          • Уже неделю провайдер держит в работе мое обращение. А на текущий момент эти ребята сделали так, чтобы трассировка по 25 порту до хоста не терялась на выходе в интернет, но подключения по телнету все еще не происходит.

            Если все таки они не сделают ничего, то чем грозит использование 587 или 465 портов для моей исходящей почты?

            • 25 порт используют почти все, а может и вообще все сервера, для обмена почтой между собой. С закрытым 25-м портом на вход и выход вы просто не будете получать почту от других почтовых серверов, и не сможете отправлять на другие почтовые сервера. 587 и 465 порты используются для подключения клиентов почтовых серверов, а не для обмена между серверами.

              • РТ сказали не собираются никаких портов открывать. Странно при этом заявлять в техподдержке юр. лицу, что ничего не блокируется и только через неделю говорить как есть. Ну да ладно. А по теме, все настроил, майл-чекер дает оценку 10/10.
                Спасибо огромное за статью, все по полочкам разложено что зачем и почему.

  106. Здравствуйте!
    Подскажите в чем может быть проблема?
    дошел до шага
    "Создаем группу и пользователя с указанными в конфиге uid 1000"
    Ввел команду - groupadd -g 1000 vmail

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

    Но на этапе "Проверка работы почтового сервера"
    В логе "maillog"

    Jun 10 15:43:19 ugz postfix/smtpd[39439]: connect from ex.server.local[192.168.55.37]
    Jun 10 15:43:19 ugz postfix/smtpd[39439]: Anonymous TLS connection established from ex.server.local[192.168.55.37]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Jun 10 15:43:19 ugz postfix/smtpd[39439]: E907A22A670: client=ex.server.local[192.168.55.37]
    Jun 10 15:43:19 ugz postfix/cleanup[39444]: E907A22A670: message-id=
    Jun 10 15:43:19 ugz postfix/qmgr[39334]: E907A22A670: from=, size=13630, nrcpt=1 (queue active)
    Jun 10 15:43:19 ugz postfix/smtpd[39439]: disconnect from ex.server.local[192.168.55.37] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
    Jun 10 15:43:20 ugz postfix/pipe[39336]: E907A22A670: to=, relay=dovecot, delay=0.08, delays=0.03/0/0/0.04, dsn=4.3.0, status=deferred (temporary failure)

    Подскажите куда копать?

    • Раз у вас такой пользователь уже был, можно было нового не создавать. По ошибке, не понятно, в чем она конкретно, так как в приведенном куске лога нет об этом информации.

      • Я такого пользователя не создавал. ОС поставлена с нуля.

        Подскажите, какие логи можно глянуть, чтобы выяснить в чем проблема?

        • У вас ошибка появляется на передаче письма в dovecot:
          E907A22A670: to=, relay=dovecot, delay=0.08, delays=0.03/0/0/0.04, dsn=4.3.0, status=deferred (temporary failure)

          Смотрите его логи. Возможно он не запущен или с ним какие-то проблемы.

  107. inkvizitooor

    Отличная статья. А в чем отличия starttls от ssl/tls? Что безопаснее?

    • Сейчас уже точно не помню нюансов, но когда узнавал этот момент, вынес мысль о том, что starttls более современная реализация tls, поэтому при возможности стоит использовать ее.

  108. Добрый день, на шаге
    Идем по адресу http://5.180.137.106/padmin/public/setup.php и начинаем установку postfixadmin
    появляется ошибка
    ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver
    каталог создал и права дал, что не так?

    • Может создали не там, где надо. Ошиблись.

    • https://linuxize.com/post/how-to-disable-selinux-on-centos-8/
      отключи и все заработает, мне помогло.

    • Оно ломится в директорию которой нет, создай директорию template_c в "/var/www/html/padmin", рестартани apache(httpd) и будет тебе счастье ;)
      можно конечно порыть почему и где прописан путь к template_c, если интересно.

      ЗЫ: товарищ Zerox, в Украине принято писать "в Украине", уважайте своих читателей;)

      • А в России принято писать "на Украине". И это вы пришли ко мне в гости. Может будете уважать меня? А то какое-то безусловное уважение всюду. Вы уже не первый, кто что-то требует от меня, придя ко мне на сайт. Очень показательный момент. Я когда прихожу к кому-то на сторонний ресурс, не требую к себе никакого уважения, а молча читаю. И если считаю, что меня тут не уважают, то так же молча ухожу. Хозяин, как говорится, барин. У вас, надеюсь, еще не отменили русские народные поговорки?

  109. Дмитрий

    При рассылке с почтовика не всем приходят письма,в логах
    warning: Connection rate limit exceeded: 60 from static.40.219.69.159.clients.your-server.de[
    Не подскажете как решить?

    • Лимит на количество подключений с сервера static.40.219.69.159.clients.your-server.de срабатывает. Надо его увеличить.
      smtpd_client_connection_count_limit=200

  110. А как добавить почтовые ящики без использования postfixadmin через консоль?

    • В данной связке нет такого функционала. Но если очень надо, то можно через консоль сделать прямой запрос в mysql базу на добавление данных. Формат там простой, можно посмотреть по структуре таблицы mailbox.

  111. Евгений

    Добрый вечер! Вы писали в настройке postfix
    "отдельным пунктом я расскажу как использовать полноценные сертификаты".
    Не могли бы вы рассказать?) В частности для let's encrypt, если его можно здесь использовать, конечно.)

  112. Дмитрий

    Здравствуйте! Скажите, можно ли делать почтовый серве на основной домен, без поддомена? Или лучше на поддомен?
    И заодно второй вопрос - в свежей версии не устанавливается php-imap. Пишет, что такого нет, совпадений не найдено. Может что-то подскажете по этому поводу? Вот это dnf module enable php:remi-7.2 выдает ошибку Error: It is not possible to switch enabled streams of a module.

    Буду благодарен за подсказку.

  113. Евгений

    Здравствуйте.

    Меня интересует каким образом можно защитить свой почтовый сервер от перебора паролей? Про fail2ban знаю он блокирует по ip адресу, а как можно не блокируя ip атакующего, отключить ящик на который идут попытки перебора(или неправильнго ввода пароля).
    Допустим человек банально забыл пароль от корпоративной почты и непрекращая долбиться в свою учетку(приложуха на телефоне), как настроить блокировку ящика, по каким критериям это вообще можно сделать и главное КАК?

    • Простых способов тут нет. Но если очень хочется, то реализовать можно. Но нужно будет вручную писать скрипты. Ящик можно отключить, поменяв соответствующую запись в базе mysql. Соответственно, нужно анализировать лог. При обнаружении подробра пароля к ящику, отключать этот язик через запрос в бд.

      • Евгений

        То есть нет штатного механизма при котором если неправильно вводиш пароль ящик блокируется и пользователю предлагается восстановить пароль или обратиться к системному админу?

  114. Статья полностью актуальна. Только что настроил по ней почтовый сервер простым копипастом.

  115. Андрей

    У кого выдает ошибку "Error: namespace configuration error: Duplicate namespace prefix: "" ", в файле /etc/dovecot/dovecot.conf в месте, где описывается namespace

    namespace {
    type = private
    separator = /
    prefix =
    inbox = yes
    ....
    }

    Нужно добавить "inbox" после слова namespace
    Как показано ниже:
    namespace inbox {
    ...
    }

    И на всякий случай удалить файл /etc/dovecot/conf.d/15-mailboxes.conf

    • У меня работает именно в таком виде, как в статье. Пример с рабочего сервера.

    • Андрей

      Хотя я думаю, что не обязательно именно "inbox", dovecot просто ругается на то, что используется два "namespace" и у обоих значение имени = ""

    • Виталий

      У меня такая же ошибка, да действительно добавил inbox, как у вас, и всё заработало. Centos 8. Спасибо.

  116. в логах dovecot

  117. Объясните пожалуйста у меня не соединяется с сервером dovecot ошибка Error: namespace configuration error: Duplicate namespace prefix: ""

    • У вас ошибка в конфиге. Внимательно его проверяйте.

      • я уже 2 раза проверил не пойму в чем причина вроде все так же как и у вас в статье, подскажите может я где накосячил?

        • Заочно не могу ничего подсказать. Ошибка гуглится в англоязычном интернете. Попробуйте почитать варианты решения.

  118. Здравствуйте, подскажите пожалуйста - а как привязать всё вышеописанное к LDAP? Хотя в целом это тянет на отдельный мануал - как отказаться от Active Directory в смешанной среде и заставить "дружить" Windows и Linux клиенты, учитывая интеграцию с почтовиком. За такую инфо я даже готов заплатить.

    • Это не простая тема. Я ее не прорабатывал вообще. Не видел удачных реализаций отказа от AD.

      • Есть готовые "комбайны" вроде Univention, Zentyal (но они бесплатны лишь условно), есть рукотворные варианты скрещивания Samba+OpenLDAP, но от одного чтения мануалов по этой теме уже становится дурно)
        А в свете всё большего "импортозамещения" и отказа от инфраструктуры, заточенной под Microsoft этот вопрос довольно актуален.

        • Я в живую видел офис на Samba в качестве контроллера домена. Переводил все потом на Active Directory. В целом, если сильно надо, то можно настроить. Но работает оно плохо и неудобно. И нужен хороший скилл, чтобы это поддерживать. В том офисе админ ушел, который все это настроил и потом остальные админы тупо не знали, что с этим делать, пока не пришел я и не снес этот домен.

  119. Добрый день! Отличная статья, спасибо за труд. По окончанию настройки возник один вопрос:
    После настройки фильтра почты sieve и создания первого правила фильтрации в Roundcube, в разделе настройки - папки - ниже папки корзина появляются еще 2 папки: dovecot; sieve. (у Вас на это скриншоте тоже их видно https://serveradmin.ru/wp-content/uploads/2020/02/centos-8-postfix-dovecot-20.png). На общую работу вроде не влияют но если бы помогли их убрать, было бы супер!?

    • Тоже обратил на них внимание, но сходу не получилось придумать, как их убрать. Не стал дальше разбираться. Если у вас получится, прошу поделиться решением.

  120. Здравствуйте,
    Есть пару вопросов по почтовому серверу:

    В локальной сети есть SMTP Send only Postfix (192.168.1.200). И есть 2 веб сервера (192.168.1.1 (домен example1.com) и 192.168.1.2 (домен example2.com).
    Они отправляют почту через 1 SMTP Send Only Postfix. Postfix пишет все в 1 лог файл.

    Возникла задача разделить на разные лог файлы, чтобы домен example1.com писал в один лог файл, а второй домен example2.com в другой лог файл. Как это можно сделать?

    Еще вопрос, в main.cf указан
    myhostname = example1
    smtpd_banner = $myhostname

    Получается что когда с веб сервера отправляется почта example2, через SMTP Send only Postfix то если открыть письмо в Gmail (show original), то в заголовках всплывает example1 домен.

    Как можно для домена example2.com отредактировать (или заменить) myhostname = example2 при отправке писем?

    Так-же вопрос, настройка для Ubuntu 18.04 LTS будет +- такая-же по логике, за исключением "немного других команд" (apt) во время установки, верно?

    Спасибо.

    • Сделайте простейший скрипт на bash с выборкой строк по домену и делите так лог файл. Штатно я не знаю, как это сделать и за столько лет не было никогда такой необходимости. Лог это текстовый файл. Вы можете его обрабатывать так, как вам угодно.

      По поводу myhostname так и будет. И это общепризнанная практика. Нет смысла под каждый домен делать свое имя почтового сервера. Это не имеет значения. Вы можете отправлять почту разных доменов через один почтовый сервер. Так и происходит у провайдеров, предоставляющих услугу почтового сервиса. Вся отправка идет через сервера провайдера, где имена тоже провайдера, а не ваши.

    • В Убунту все примерно то же самое. Я настаиваю и на Убунту по своим статьям для Центос.

  121. Андрей

    Добрый день! Подскажите, чем чревато отсутствие пакета php-imap? Не будет работать roundcube или еще что-то?
    Я чайник, после module enable php:remi-7.2 начинает ругаться, что надо удалить, только потом сменить, а мне бы не хотелось ничего удалять и переустанавливать. Или без этого никак, и лучше при установке нового сервера установить всё php из это модуля?
    CentOS 8.1, php 7.2.11

    • Думаю, что roundcube без php-imap работать не будет.

    • Если я правильно понял твою проблему:

      dnf module enable php:remi-7.2
      Последняя проверка окончания срока действия метаданных: 0:00:17 назад, Пн 30 мар 2020 23:51:26.
      Зависимости разрешены.
      The operation would result in switching of module 'php' stream '7.2' to stream 'remi-7.2'
      Ошибка: It is not possible to switch enabled streams of a module.
      It is recommended to remove all installed content from the module, and reset the module using 'dnf module reset ' command. After you reset the module, you can install the other stream.

      То выполни:
      # dnf module reset php
      # dnf module enable php:remi-7.2

  122. Здравствуйте, извините за возможно глупый вопрос, но как быть с удалённым подключением клиентов извне? Просто открыть нужные порты на файерволе и пускать на наш почтовик всех подряд? То есть по идее, любой кто знает пароль начальника, может зайти под ним и скомпроментировать почту от его лица?

    • Да, все верно. Вообще так все публичные почтовые сервисы работают. Любой, кто узнает пароль, сможет зайти в ящик. Тут вариантов нет. Пароль начальника надо беречь.

      Вариант увеличить безопасность - настроить vpn к почтовому серверу. Разрешать подключение только через vpn. Ничего сложного в настройке нет, но пользоваться немного неудобно будет, особенно на смартфонах.

  123. Сергей

    Добрый день.Подскажите,когда Вы даете конфиги,это значит немного изменить исходный или полностью стереть исходный и вставить Ваш?Я в этом вопросе всегда задумываюсь как поступить.

    • Это вам решать :) Я обычно оригинальный конфиг оставляю и меняю там параметры на те, что рекомендуются в статьях. Это если речь идет не про свои инструкции. Лучше осмысленно все делать и вникать в настройки. Если просто все скопировать и вставить, то и понимания не появится.

  124. Сергей

    Здравствуйте, подскажите пожалуйста, можно ли вдовесок ко всему вышеописанному прикрутить глобальный список адресов, который клиенты могли бы получать автоматически при настройке того же thunderbird?

  125. Дмитрий

    Скажите, а от куда вы брали именно этот на бор шифров для dovecot?

    ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

    какой набор можно еще использовать?

  126. Добрый день! Кто подскажет один момент, пытаюсь добавить новый домен в существующий сертификат LetsenCrypt следующей командой:
    certbot certonly --webroot -w /etc/letsencrypt --expand -d имя нового домена

    а он мне пишет:
    Waiting for verification...
    Challenge failed for domain имя домена
    Domain: имя домена
    Type: dns
    Detail: No valid IP addresses found for имя домена

    80 порт открыт, в чём может быть проблема не пойму. В настройках нового домена прописана A запись с IP на действующий почтовый сервер и MX запись также на действующий сервер.

    • Как я понимаю, ошибка Detail: No valid IP addresses found for означает, что не настроена DNS запись для домена. То есть lets encrypt просто не понимает, по какому ip идти проверку делать.

      • Вообще не пойму, есть один почтовый сервер который должен обслужить два домена, один домен настроен нормально, сертификаты получены всё работает исправно. Добавляю второй домен через Postfixadmin выпускаю для него ключ DKIM и прописываю всё это дело в Серверах имён где припаркован домен. Так вот записи со второго домена:

        srv 14400 А внешний IP на wan интерфейсе (такое же точно как и в настройках DNS первого домена)
        @ 14400 MX имя почтового сервера. (такое же точно как и в настройках DNS первого домена)
        10

        остальные записи это DKIM SPF DMARC

        Так вот непонятно что не так прописано, почему LetsenCrypt не поймёт куда ему идти?

  127. Сергей

    Не проходит письмо от отправителя с одинарными кавычками в адресе (старая версия outlook).
    В логе:
    warning: Illegal address syntax from _gateway[10.0.54.1] in RCPT command:
    Нашёл такое решение:
    В main.cf добавляем
    smtpd_command_filter = pcre:/etc/postfix/command_filter.regex
    в /etc/postfix/command_filter.regex
    /^RCPT\s+TO:\s*(.*)/ RCPT TO:$2
    Но видимо, что то делаю неправильно, после перезапуска postfix не стартует.

    • Сергей

      Код в сообщение вставился неверно, решение тут https://meandubuntu.ru/tag/postfix/
      но у меня не получается его применить

    • Много раз видел такую проблему. Решается убиранием кавычек из адреса. Ни разу не пытался костылить на сервере что-то для этого. Это явно проблема почтового клиента, на нем ее и надо решать.

  128. Подскажите пожалуйста, почему был выбран CentOS?
    Каковы причины его использования? Какими соображениями руководствовались? Почему не Debian?
    Спасибо!

    • Centos, а по сути RHEL по факту сейчас промышленный стандарт для линукс систем. Это самая популярная система в enterprise. В вакансиях чаще всего требуется навык работы с этой системой. Debian в продакшене почти не используется. Я не знаю почему. Ubuntu гораздо больше распространена, но в основном в web технологиях. Я работаю одинаково с centos и ubuntu. Для почтового сервера centos подходит больше, так как более стабильная и надежная. В ней более старые пакеты, обновлений на новые версии меньше. Для почтового сервера самое то, чтобы его настроить и забыть, ставя только обновления безопасности.

  129. Дмитрий

    при обращении к /padmin/public/setup.php

    Страница недоступна
    Сайт х.х.х.х пока не может обработать этот запрос.
    HTTP ERROR 500

    • С Веб сервером проблемы. Надо смотреть его логи.

      • Дмитрий

        webserver работает, тестовая стр. открывается, phpmyadmin тоже открывается

      • Дмитрий

        Добрый день еще раз.
        Делал повторно, даже с новой установкой, специально. все равно

        при обращении к /padmin/public/setup.php

        Страница недоступна
        Сайт х.х.х.х пока не может обработать этот запрос.
        HTTP ERROR 500

        cat httpd/error_log
        [Wed Feb 26 17:36:01.550185 2020] [suexec:notice] [pid 31815:tid 140712926230784] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
        [Wed Feb 26 17:36:01.665749 2020] [lbmethod_heartbeat:notice] [pid 31815:tid 140712926230784] AH02282: No slotmem from mod_heartmonitor
        [Wed Feb 26 17:36:01.666882 2020] [http2:warn] [pid 31815:tid 140712926230784] AH02951: mod_ssl does not seem to be enabled
        [Wed Feb 26 17:36:01.671272 2020] [mpm_event:notice] [pid 31815:tid 140712926230784] AH00489: Apache/2.4.37 (centos) configured -- resuming normal operations
        [Wed Feb 26 17:36:01.671330 2020] [core:notice] [pid 31815:tid 140712926230784] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
        [Wed Feb 26 17:36:14.021966 2020] [autoindex:error] [pid 31823:tid 140712196671232] [client 10.1.6.137:61997] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.php) found, and server-generated directory index forbidden by Options directive
        [Wed Feb 26 17:55:04.949855 2020] [mpm_event:notice] [pid 31815:tid 140712926230784] AH00492: caught SIGWINCH, shutting down gracefully
        [Wed Feb 26 17:55:06.141421 2020] [suexec:notice] [pid 32577:tid 140373185280256] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
        [Wed Feb 26 17:55:06.208124 2020] [lbmethod_heartbeat:notice] [pid 32577:tid 140373185280256] AH02282: No slotmem from mod_heartmonitor
        [Wed Feb 26 17:55:06.209264 2020] [http2:warn] [pid 32577:tid 140373185280256] AH02951: mod_ssl does not seem to be enabled
        [Wed Feb 26 17:55:06.213359 2020] [mpm_event:notice] [pid 32577:tid 140373185280256] AH00489: Apache/2.4.37 (centos) configured -- resuming normal operations
        [Wed Feb 26 17:55:06.213426 2020] [core:notice] [pid 32577:tid 140373185280256] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
        cat mariadb/mariadb.log
        2020-02-26 17:38:07 0 [Warning] mysqld: GSSAPI plugin : default principal 'mariadb/mail.eme.ru@' not found in keytab
        2020-02-26 17:38:07 0 [ERROR] mysqld: Server GSSAPI error (major 851968, minor 2529639093) : gss_acquire_cred failed -Unspecified GSS failure.  Minor code may provide more information. Keytab FILE:/etc/krb5.keytab is nonexistent or empty.
        2020-02-26 17:38:07 0 [ERROR] Plugin 'gssapi' init function returned error.
        2020-02-26 17:38:09 0 [Note] InnoDB: Using Linux native AIO
        2020-02-26 17:38:09 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
        2020-02-26 17:38:09 0 [Note] InnoDB: Uses event mutexes
        2020-02-26 17:38:09 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
        2020-02-26 17:38:09 0 [Note] InnoDB: Number of pools: 1
        2020-02-26 17:38:09 0 [Note] InnoDB: Using SSE2 crc32 instructions
        2020-02-26 17:38:09 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
        2020-02-26 17:38:09 0 [Note] InnoDB: Completed initialization of buffer pool
        2020-02-26 17:38:09 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
        2020-02-26 17:38:09 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
        2020-02-26 17:38:09 0 [Note] InnoDB: Creating shared tablespace for temporary tables
        2020-02-26 17:38:09 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
        2020-02-26 17:38:09 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
        2020-02-26 17:38:09 0 [Note] InnoDB: Waiting for purge to start
        2020-02-26 17:38:09 0 [Note] InnoDB: 10.3.17 started; log sequence number 1630815; transaction id 21
        2020-02-26 17:38:09 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
        2020-02-26 17:38:09 0 [Note] InnoDB: Buffer pool(s) load completed at 200226 17:38:09
        2020-02-26 17:38:09 0 [Note] Plugin 'FEEDBACK' is disabled.
        2020-02-26 17:38:09 0 [Warning] mysqld: GSSAPI plugin : default principal 'mariadb/mail.eme.ru@' not found in keytab
        2020-02-26 17:38:09 0 [ERROR] mysqld: Server GSSAPI error (major 851968, minor 2529639093) : gss_acquire_cred failed -Unspecified GSS failure.  Minor code may provide more information. Keytab FILE:/etc/krb5.keytab is nonexistent or empty.
        2020-02-26 17:38:09 0 [ERROR] Plugin 'gssapi' init function returned error.
        2020-02-26 17:38:09 0 [Note] Server socket created on IP: '::'.
        2020-02-26 17:38:09 0 [Note] Reading of all Master_info entries succeeded
        2020-02-26 17:38:09 0 [Note] Added new Master_info '' to hash table
        2020-02-26 17:38:09 0 [Note] /usr/libexec/mysqld: ready for connections.
        Version: '10.3.17-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MariaDB Server
        2020-02-26 17:38:59 8 [Warning] Access denied for user 'root'@'localhost' (using password: YES)
        • Вот ваша ошибка в настройке web сервера Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.php) found, and server-generated directory index forbidden by Options directive

          • Дмитрий

            Хорошо!
            сделал так:

            ServerName site.ru
            ServerAlias http://www.site.ru
            DocumentRoot /web/sites/site.ru/www

            ErrorLog /web/sites/site.ru/log/error.log
            CustomLog /web/sites/site.ru/log/access.log common

            Options FollowSymLinks
            AllowOverride All
            Require all granted

            дал права для апача
            положил туда postfixadmin,

            The Postfix Admin directory layout changed.

            Please update your webserver config so that the DocumentRoot or Alias points to the directory "public".

          • Дмитрий

            так и делаю точь в точь как у вас https://serveradmin.ru/nastroyka-postfix-dovecot-centos-8/#comment-12128

            по идее настраивать по другому сервер нет смысла.

          • Дмитрий

            Ну так как? сможете ответить?

            • У вас ошибки. Что тут еще ответить? Больше и подробнее, чем я написал в своих статьях, я написать не смогу. Для самостоятельной настройки и разбора вся информация есть. Создайте тему на форуме, может там у кого-то возникнет желание вам помочь. У меня нет такой возможности.

              Внимательный копипаст по статье приведет к желаемому результату. Я проверил минимум 2 раза перед публикацией.

  130. Подскажите как правильно создать dkim если у меня домен третьего уровня к примеру mail.domain.ru?

  131. Приветствую!

    Спасибо за статью,
    по предыдущей её версии настроил не один почтовик.
    Интересно было бы все действия из статьи автоматизировать,
    используя Ansible.
    Успехов Вам и развития сайту.

    • Думал об этом, но это слишком сложно для данной задачи. Постоянно нужно проверять и редактировать, особенно то, что касается postfixadmin и roundcube. Если бы я был чисто почтовый админ, я бы заморочился для себя. А так, не вижу смысла. Сэкономлю меньше времени, чем затрачу. Мне обычно надо раз в пол года настроить почтовик. Его настройка будет начинаться с правки плейбука.

  132. Добрый день!
    Статья замечательная.
    Настраивал подобную связку для нескольких доменнов (мультидоменный почтарь) по статье с хабра. Благодаря вашей статье восполнил некоторые пробелы.
    Конфиги не могли бы выложить?

    • По сути все конфиги в статье. Для postfix и dovecot вообще один в один приведены с настроенного сервера. Все остальное не так важно. С мультидоменностью нюансов нет. Описанная конфигурация по-умолчанию мультидоменная. Новый домен можно добавить через postfixadmin. Единственный нюанс возникнет с dkim, но там ничего сложного. Надо просто по аналогии проделать все то же самое для еще одного домена.

  133. Посмотрите на Adminer вместо phpmyadmin, в к-ом регулярно дыры находят. Там ОДИН файл для всего.

  134. В догонку.

    На Postgresql было бы поинтересней )

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

  135. Добрый.

    Спасибо за статью.

    >Было бы круто, если бы mail gateway таки вобрал в себя функционал и самого почтового сервера в виде postfix + dovecot. Это было бы отличное коробочное решение

    В чем проблема развернуть почту прямо на Proxmox Mail Gateway? Там же Дебиан 10 - ставь и пользуй.

    Зы. И снова нет про rspamd (

    • Лезть в готовое решение со своими костылями это значит, что обновиться без геморроя больше не получится. Считаю, это плохая практика для продакшена.

      Я для спама, кому он реально нужен, ставлю касперского, поэтому другие решения даже не смотрю. Если кто-то совсем маленький, что нет денег на антиспам, у него скорее всего и проблем со спамом нет.

      • Замечание про "нищебродство" (вы ж об этом?) - глупое. Не надо так.
        Купите MS Exchange и пользуйте в таком случае.
        А rspamd - очень и очень. И точно не хуже ПО от "тов. майора".

        • Я делюсь своим опытом, а не гипотетическим. У меня он такой и я объясняю, почему он такой. Настраивать бесплатные антиспамы, в которые постоянно надо лезть для калибровки, я не люблю. Это просто дороже, так как время работы специалиста стоит денег. У MS Exchange есть объективные минусы и стоимость его эксплуатации значительно дороже описанного в статье решения.

  136. Приветствую, поднял сервер по Вашей статье но на debian, всё работает прекрасно, возник затык только с листами против антиспама. Если пишу в black_client конкретный ящик вся почта отлетает как и положено, но если пишу домен типа "rambler.ru REJECT bla bla bla" то почта иногда все же проходит. Не подскажите в чем проблема может быть?

    • Так трудно что-то советовать, надо разбираться предметно, какая конкретно почта проходит и почему. И еще, если блочить сразу домен, то если не ошибаюсь, писать надо @rambler.ru

  137. Сергей

    Почтовый сервер находится за микротиком на локальном IP 10.0.20.2
    Подскажите пожалуйста что должно быть указано в /etc/hosts в /etc/hostname, какие параметры в /etc/postfix/main.cf ?
    Настроил по вашей статье, отправляю почту снаружи на root@site.ru письма не приходят, отправляю письмо с root@site.ru на root@site.ru письмо не приходит.

    в логах # cat /var/log/maillog
    postfix/smtpd[1649]: fatal: in parameter smtpd_relay_restrictions or smtpd_recipient_restrictions, specify at least one working instance of: reject_unauth_destination, defer_unauth_destination, reject, defer, defer_if_permit or check_relay_domains
    postfix/master[1303]: warning: process /usr/libexec/postfix/smtpd pid 1649 exit status 1

    В чём может быть причина?

    • Да в конфигах ошибки где-то. Что-то напутали. В hosts и hostname можно писать все, что угодно. В main.cf должно быть указано доменное имя, которое обслуживает почтовый сервер. За микротиком он находится или нет, не имеет значение, главное порты правильно пробросить.

      • Сергей

        Спасибо!
        В main.cf после того как поправил строку на которую ругался posconf -n
        virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf, mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf
        записал в одну строку письма стали приходить, но не уходили с ошибкой SMTP ошибка (554)...
        Вслед за вами изменил
        smtpd_recipient_restrictions = check_relay_domains
        на
        smtpd_recipient_restrictions = permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        reject_multi_recipient_bounce,
        reject_unauth_destination,

        Отправка заработала.

        • Сергей

          Извиняюсь
          smtpd_recipient_restrictions = check_relay_domains
          это я сам внёс поверх ваших записей.
          По итогу у себя исправил только virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf, mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf в одну строку и virtual_uid у меня были отличные от ваших.
          Спасибо за подробное описание в статье.

          • Я не понял, в чем смысл читать статью и делать не как в ней? Вы сначала настройте по статье, она 100% рабочая. Убедитесь, что все работает, а потом переделывайте как угодно.

            • Сергей

              Это скорее от непонимания мной, что как устроено, по невнимательности не заменил virtual_uid на свой (у меня 1000 был уже занят), а что касается smtpd_recipient_restrictions = check_relay_domains тупо скопировал команду из интернета когда искал решение почему не заработало после вашей конфигурации.

              Статья отличная, спасибо!

      • Сергей

        Снаружи через Thunderbird если указать имя сервера как mail.domain.ltd (где domain.ltd мой домен) почта работает, отправляет и принимает письма. Внутри если подключаюсь через Thunderbird можно получить настройки только если указать в имени сервера локальный IP адрес, почта при этом работает, отправляет и принимает на другие почтовые ящики.
        Внутри веб-клиент доступен только по локальному ip, снаружи и внутри по mail.domain.ltd\webmail недоступен.
        Подскажите настройках сервера дополнительно нужно указывать что-то, чтобы и внутри и снаружи был доступ к mail.domain.ltd через Thunderbird и веб-клиенту?
        Или дело только в неправильном пробросе портов?

        • Нет. Все эти проблемы с доменным именем решаются на уровне вашего локального dns сервера. Вам надо в локальной сети по имени домена отдавать локальный интерфейс почтового сервера.

          • Сергей

            Спасибо, разобрался. DNS сервер был указан верно, настроил Hairpin NAT на микротике и вышеуказанные проблемы решились. iptables отключил за ненадобностью.

  138. Сергей

    Установил и настроил Centos 8 по вашим статьям, на гостевой HYPER-V, на разделе в 50 Гб. Как принято хранить почту: на системном диске большего размера или на подключаемом диске?

    Подскажите как вы подключаете диск для ящиков (/mnt/mail), у вас есть такая статья, для совсем новичков?

    • Настоятельно рекомендую подключать отдельный диск для архива и монтировать его в /mnt/mail. Основы по работе с диском есть в статье для debian - https://serveradmin.ru/nastrojka-diskov-v-debian/ В centos все то же самое.

      • Сергей

        Скажите Veeam Agent for Linux поддерживает Centos 8? У вас есть статья по стратегии бэкапа Postfix с примонтированным диском под хранилище писем?

  139. Круто, конечно, все поднять руками. Но проще просто установить Zimbra. Результат тот же самый, но практически в одно действие.

    • Это просто разные решения. Так же можно и iredmail поднять или что-то еще. Готовых сборок много.

    • Мне, например, нравится антиспам от Касперского. Не уверен, что его будет просто прикрутить к Zimbra. А тут пожалуйста. Не нравится roundcube, ставь SoGo и т.д. В общем, больше вариантов кастомизации.

  140. Доброго дня!
    Есть отличное бесплатное коробочное антиспам решение proxmox mail gateway.
    Работает уже почти год, работает отлично, спам не пропускает, очень легко настраивается.
    Советую.

    • Да, я знаю, тестировал его. Мне понравилось по функционалу. Но не нравится то, что это отдельная виртуальная машина. И почтовый сервер у тебя превращается в шлюз+почтовый сервер. В данном случае было бы удобнее, если бы все было в одном. Большого смысла разделять эти функции в общем случае нет. По крайней мере мне так кажется.

      Было бы круто, если бы mail gateway таки вобрал в себя функционал и самого почтового сервера в виде postfix + dovecot. Это было бы отличное коробочное решение.

  141. Отличная статья! Но всегда задавался вопросом, а зачем это необходимо делать на своем сервере когда есть уже готовые, отлаженные вещи типа Яндекс.почта или корпоративная почта для домена от mail.ru? Из-за вопросов приватности и безопасности?

    • Причин может быть много. Я давал ссылку в начале на статью, где это обсуждается. Для небольшой компании что-то вроде Яндекс.Почта еще подойдет. Но если вам надо управлять хотя бы сотней ящиков, это уже не подходит. Нужен свой почтовый сервер.

      Простой пример. У пользователя может быть до сотни настроенных фильтров. Вы замучаетесь разбираться, почему теряется или падает не туда почта где-то в яндексе или гмейле. На своем сервере в разы проще во всем этот разобраться и настроить как надо.

      Или, например, надо автоматом всем почистить ящики, добавить всем одинаковое правило сортировки, сбросить пароли и т.д.. Много нюансов. Свои почтовые серверы по прежнему актуальны и я их регулярно настраиваю. Спрос и потребность в этом есть.

  142. Прекрасная статья, спасибо.

  143. Спасибо большое!Сейчас буду пробовать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar