Настройка почтового сервера (Postfix, Dovecot, MariaDB/MySQL) в CentOS/RHEL 7


Предполагается что у вас уже установлены и настроены Apache, MariaDB/MySQL и PHP. Инструкцию по настройке можно прочитать по этой ссылке.

 

Установка PostfixAdmin

Скачаем архив с PostfixAdmin, распакуем и разложим его содержимое по разным папкам:

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

Условимся, что здесь и далее вместо %VMailDB%, %VMailUser% и %VMailPassWord% нужно вписывать название базы данных, имя пользователя и пароль. Никаких процентов!

Пропишем данные о созданной базе в конфигурационный файл PostfixAdmin и сделаем несколько дополнительных настроек:

Подключим PostfixAdmin к веб-серверу Apache:

Открываем в браузере ссылку https://mail.example.com/postfixadmin/setup.php
Проверьте везде ли написано OK в требованиях. Далее задайте пароль для изменения настроек и получившийся хэш сохраните в файл /etc/postfixadmin/config.local.php

Теперь опять открываем в браузере ссылку https://mail.example.com/postfixadmin/setup.php, вводим пароль и создаём учётную запись администратора.

Учётная запись администратора создана, открываем PostfixAdmin по адресу https://mail.example.com/postfixadmin/ и вводим данные администратора. Наша задача для начала создать домен и почтовые ящики пользователей.
Для того чтобы создать домен выбираем в меню «Domain List» и там пункт «New Domain». Заполняем форму (в поле «Transport» необходимо выбрать «dovecot») и нажимаем на кнопку «Add Domain».
После создания домена – создадим пользователей и алиасы. Для этого выбираем в меню «Virtual List» и там пункт «Add Mailbox». Заполняем форму и нажимаем на кнопку «Add Mailbox». По умолчанию для домена создаётся ряд системных алиасов, почта с которых в итоге редиректится на адрес admin@example.com. Нужно теперь создать редирект с имени admin@example.com на адрес администратора. Для этого выбираем в меню «Virtual List» и там пункт «Add Alias». Вводим admin в поле «Alias», в поле «To» вводим полный адрес для редиректа и нажимаем на кнопку «Add Alias».
Теперь открываем список созданных почтовых ящиков и алиасов, выбрав пункт «Virtual List» в меню «Virtual List». Если всё в порядке – приступаем к дальнейшей настройке почтовой системы.

 

Исправление работы PostfixAdmin с русскими символами

  • Для начала исправим кодировку в таблицах MySQL:
  • А теперь исправим php-скрипты PostfixAdmin для правильной работы с кодировкой utf-8:
    Исправить нужно все вызовы функции htmlentities в каталогах /usr/share/postfixadmin и /usr/share/postfixadmin/templates, нужно добавить 2 аргумента |, ENT_QUOTES, 'UTF-8'|.

 

Исправление бага с сохранением extra-опций для fetchmail

  • В файле fetchmail.php дважды выполняется функция escape_string, поэтому слеши сохраняются в MySQL.

 

Установка postfix

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

В CentOS 7 по умолчанию устанавливается postfix, а в предыдущих версиях CentOS нужно было выполнить команду:

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

Блок «VIRTUAL DOMAINS» отвечает за наши обслуживаемые домены и пользователей, которые мы заводили в PostfixAdmin. Блок «SASL» нужен для авторизации пользователей на SMTP, для того чтобы можно было отправлять почту через наш сервер. В блоке «TLS» прописываем наши SSL-сертификаты, для того чтобы всё общение с почтовым сервером проходило в зашифрованном виде. А блок «SMTPD RESTRICTIONS» нужен для того чтобы отсечь львиную долю спама.

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

Создадим список хостов, которые смогут без авторизации отправлять почту через наш почтовый сервис (очень опасная штука, на моей памяти реально такое понадобилось только для одного блейд-центра, который не умел авторизовываться, всё остальное железо спокойно авторизуется на smtp и без проблем отправляет почту).

Настроим dovecot в качестве почтового транспорта:

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

Postfix настроен, но запускать его не будем, пока не настроим dovecot.

 

Установка dovecot

Установим сервер dovecot и сопутствующие плагины для работы с базой MySQL и для работы с Sieve-фильтрами:

 

Запуск сервисов

Запустим dovecot и postfix и добавим их в автозагрузку:

 

Проверка работоспособности SMTP

Теперь проверим, принимает ли postfix почту для нашего домена:

А таким образом проверим подключение через TLS и авторизацию:

 

Настройка firewall

Проверив что postfix функционирует и готов к принятию почты – открываем его во внешний мир:

 

Настройка FetchMail

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

Теперь создадим конфигурационный файл для fetchmail:

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

Добавим выполнение этого скрипта в cron:

Теперь нам необходимо залогиниться в наш PostfixAdmin и прописать почтовые учётные записи, с которых будет собираться почта. Для этого откроем веб-интерфейс PostfixAdmin и выберем в меню «Fetch Email» пункт «New Entry». Выбираем Mailbox, куда будет складываться почта, вводим имя удалённого сервера, имя пользователя и пароль, так же выбираем протокол по которому будет забираться почта (IMAP/POP3). Если на той стороне IMAP-сервер с несколькими папками, то для каждой папки нужно будет создать отдельную запись для сбора почты, и в каждой записи в поле «Folder» – указать свою папку. Если сбор почты осуществляется используя SSL-шифрование, то необходимо отметить галочкой пункт «SSL active», так же желательно заполнить поле «SSL fingerpring (md5)», для того чтобы Fetchmail не ругался на SSL-сертификат. После этого сохраняем запись нажав на кнопку «Save Changes».
А для получения fingerprint нужно выполнить следующую команду:

В этой статье можно прочитать про настройку спам-фильтра DSpam. Так же там есть пример файла с Sieve-правилами. А в этой статье можно прочитать про установку и настройку веб-интерфейса для почты – RoundCube.

Comments

  1. Сделали все так и получаем:

    an 26 02:39:03 mail fetchmail-all[3344]: can’t lock /var/run/fetchmail/fetchmail-all.lock
    Jan 26 02:39:03 mail fetchmail-all[3344]: can’t lock /var/run/fetchmail/fetchmail-all.lock
    Jan 26 02:39:03 mail postfix/pickup[2570]: 45F3C84045B: uid=89 from=
    Jan 26 02:39:03 mail postfix/cleanup[2675]: 45F3C84045B: message-id=
    Jan 26 02:39:03 mail postfix/pickup[2570]: 45F3C84045B: uid=89 from=
    Jan 26 02:39:03 mail postfix/cleanup[2675]: 45F3C84045B: message-id=
    Jan 26 02:39:03 mail postfix/qmgr[2571]: 45F3C84045B: from=, size=829, nrcpt=1 (queue active)
    Jan 26 02:39:03 mail postfix/qmgr[2571]: 45F3C84045B: from=, size=829, nrcpt=1 (queue active)
    Jan 26 02:39:03 mail postfix/proxymap[2572]: warning: table «mysql:/etc/postfix/sql/virtual_domains_maps.cf»: empty lookup result for: «maindomain.ru» — ignored
    Jan 26 02:39:03 mail postfix/proxymap[2572]: warning: table «mysql:/etc/postfix/sql/virtual_domains_maps.cf»: empty lookup result for: «maindomain.ru» — ignored
    Jan 26 02:39:03 mail dovecot: lda: Error: user admin@maindomain.ru: Mail access for users with UID 8 not permitted (see first_valid_uid in config file, uid from userdb lookup).
    Jan 26 02:39:03 mail dovecot: lda: Fatal: Invalid user settings. Refer to server log for more information.
    Jan 26 02:39:03 mail dovecot: lda: Error: user admin@maindomain.ru: Mail access for users with UID 8 not permitted (see first_valid_uid in config file, uid from userdb lookup).
    Jan 26 02:39:03 mail dovecot: lda: Fatal: Invalid user settings. Refer to server log for more information.

    Получается, что пользователь mail с uid=8 gid=12 не имеет прав на запись в папку …… хотя права стоят 777 на папку…….

    • А что показывает cat /var/log/audit/audit.log | grep AVC ?

  2. неверно название директив было введено извиняюсь ….
    first_valid_uid = 8
    first_valid_gid = 12 <—— тут ошибся в названии

    Дошел до настроек fetchmail

    $ nano -w /etc/postfix/fetchmail.conf <—— тут его не, создаем
    $db_type = "mysql";
    $db_host="localhost";
    $db_name="%VMailDB%";
    $db_username="%VMailUser%";
    $db_password="%VMailPassWord%";

    $ chcon -u system_u /etc/postfixadmin/fetchmail.conf <—— мы же его в другом месте создавали ??? там такого файла нет
    $ chown root:postfix /etc/postfixadmin/fetchmail.conf
    $ chmod 0640 /etc/postfixadmin/fetchmail.conf

    Да и потом:
    $ cp /usr/share/doc/postfixadmin-*/ADDITIONS/fetchmail.pl /usr/libexec/postfix/
    $ chmod 0755 /usr/libexec/postfix/fetchmail.pl
    $ sed -i 's/\/etc\/mail\/postfixadmin/\/etc\/postfixadmin/g' /usr/libexec/postfix/fetchmail.pl <— как раз говорим что искать "/etc/postfixadmin/fetchmail.conf"

    $ sed -i 's/-f \$filename -i/-s -f \$filename —pidfile/g' /usr/libexec/postfix/fetchmail.pl
    $ nano -w /usr/libexec/postfix/fetchmail.pl
    $mda =~ s/\${mailbox}/${mailbox}/;
    # syslog("info","fetch ${src_user}@${src_server} for ${mailbox}");

    $ chcon -u system_u /usr/libexec/postfix/fetchmail.pl
    $ mkdir /var/run/fetchmail
    $ chcon -u system_u /var/run/fetchmail
    $ chown postfix:mail /var/run/fetchmail
    $ chmod 0775 /var/run/fetchmail

    Так где настройки fetchmail должны лежать то ?

  3. Добрый день!
    Не могли бы вы привести настройки сети, перед тем как начать настраивать постфик и все остальное?
    интересует как правильно настроить DNS (в плане заглушки) для работы.

  4. Добрый день!
    Подскажи пжл, как настроить DNS заглушку для работы с postfix или какие нужны сетевые настройке перед установкой почтового сервера

  5. Yevgeny Taradayko
    28.03.2015 - 01:17

    Автору респект и уважуха, это пожалуй лучшее что я видел за последние пол-года. Даже среди английских статей. Отличная систематизация и оформление. Большое спасибо! Буду писать скрипт по автоматической установке почтовой системы по Вашей статье. 🙂 Ну правда для совсем ленивых админов нехватило только описания создания самоподписных сертификатов но это мелочь. Супер!

  6. Евгений
    06.05.2015 - 15:43

    $ mkdir /var/run/fetchmail
    $ chcon -u system_u /var/run/fetchmail
    $ chown postfix:mail /var/run/fetchmail
    $ chmod 0775 /var/run/fetchmail

    после перезагрузки сервера не создается /var/run/fetchmail и в логах пишет can’t lock /var/run/fetchmail/fetchmail-all.lock

    • Да, есть такой баг. Пока в файл /etc/rc.local временно добавил пару строк:
      mkdir /var/run/fetchmail
      chown postfix:postfix /var/run/fetchmail

  7. Всю голову расшиб
    Мигрируем с mdaemon настраиваю сборщик почты на mdaemon простая авторизация без ssl

    по POP3
    Aug 9 01:37:01 mail fetchmail[45115]: Статус запроса=3 (AUTHFAIL)
    Aug 9 01:40:02 mail fetchmail[45615]: Ошибка авторизации для itadmin@domain.com@mail.domain.com
    Aug 9 01:40:02 mail fetchmail[45615]: For help, see http://www.fetchmail.info/fetchmail-FAQ.html#R15
    Aug 9 01:40:02 mail fetchmail[45615]: Статус запроса=3 (AUTHFAIL)
    Aug 9 01:42:01 mail fetchmail[45629]: Неизвестный логин или ошибка аутентификации для itadmin@domain.com@mail.domain.com

    IMAP
    Aug 9 01:42:01 mail fetchmail[45629]: Ошибка сокет при выборке из itadmin@domain.com@mail.domain.com
    Aug 9 01:42:01 mail fetchmail[45629]: Статус запроса=2 (SOCKET)

    Где может быть проблема? логин с паролем точно верные и введены правильно.
    Пробовал по IP адрес сервера в postfixadmin вводить и логин до собаки — результат тот же ….:(

  8. подскажите, а как быть вот с такой штукой как setrlimit, при старте dovecot пишет:

    master: Error: setrlimit(RLIMIT_NPROC, 4190): Operation not permitted

    systemctl status -l dovecot
    dovecot.service — Dovecot IMAP/POP3 email server
    Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled)
    Active: active (running) since Вс 2015-09-20 15:15:03 EEST; 2s ago
    Process: 2810 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
    Main PID: 2815 (dovecot)
    CGroup: /system.slice/dovecot.service
    ├─2815 /usr/sbin/dovecot -F
    ├─2818 dovecot/anvil
    ├─2819 dovecot/log
    └─2821 dovecot/config

    сен 20 15:15:03 pupkin.net systemd[1]: Starting Dovecot IMAP/POP3 email server…
    сен 20 15:15:03 pupkin.net systemd[1]: Started Dovecot IMAP/POP3 email server.
    сен 20 15:15:03 pupkin.net dovecot[2815]: master: Error: setrlimit(RLIMIT_NPROC, 4190): Operation not permitted
    сен 20 15:15:03 pupkin.net dovecot[2815]: master: Dovecot v2.2.10 starting up for imap, sieve (core dumps disabled)

  9. подскажите как быть с такой ошибкой:

    master: Error: setrlimit(RLIMIT_NPROC, 4190): Operation not permitted

    systemctl status -l dovecot
    dovecot.service — Dovecot IMAP/POP3 email server
    Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled)
    Active: active (running) since Вс 2015-09-20 15:15:03 EEST; 2s ago
    Process: 2810 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
    Main PID: 2815 (dovecot)
    CGroup: /system.slice/dovecot.service
    ├─2815 /usr/sbin/dovecot -F
    ├─2818 dovecot/anvil
    ├─2819 dovecot/log
    └─2821 dovecot/config

    сен 20 15:15:03 pupkin.net systemd[1]: Starting Dovecot IMAP/POP3 email server…
    сен 20 15:15:03 pupkin.net systemd[1]: Started Dovecot IMAP/POP3 email server.
    сен 20 15:15:03 pupkin.net dovecot[2815]: master: Error: setrlimit(RLIMIT_NPROC, 4190): Operation not permitted
    сен 20 15:15:03 pupkin.net dovecot[2815]: master: Dovecot v2.2.10 starting up for imap, sieve (core dumps disabled)

    ну можно по простому, например # semanage permissive -a dovecot_t , а как правильно?

  10. nano -w /etc/postfix/sql/virtual_domains_maps.cf

    select_field почему description?
    я поставил
    select_field = domain

    • Где-то я прочитал следующее: «Postfix does not care about the result in this query, it is more of a yes/no answer.», так что description вполне вписывается в логику.

  11. Yevgeny Taradayko
    23.03.2016 - 13:27

    Заметил один недостаток в данной конфигурации. Смптомы: при отправке на gmail.com при получении письма видим красный поломанный навесной замочек вверху слева. Диагноз: Почта отправляется без ssl/tls шифрования.
    Лекарство:
    Строчки ниже нужно добавить в TLS раздел main.cf

    smtp_use_tls = yes
    tls_high_cipherlist = 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:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
    smtp_tls_mandatory_ciphers = high
    smtp_tls_mandatory_protocols=!SSLv2,!SSLv3
    smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

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

  12. У вас опечатка вкралась:
    $ dovecot.service — Dovecot IMAP/POP3 email server — это не команда, а вывод команды $ systemctl status dovecot

    • Угу, пропустил команду systemctl dovecot status.
      Исправил. Спасибо!

  13. Александр
    07.07.2016 - 14:29

    Добрый день!
    Как можно подключиться к 25 порту на localhost, если в вашем /etc/postfix/master.cf нет записи для этого порта ?
    master запускается на 465

    • Обратите внимание на самую первую строчку этого файла не являющуюся комментарием.

      • Александр
        07.07.2016 - 18:05

        Спасибо за ответ! Я разобрался, Ваша первая запись как говорит о том, что нужно запускать smtps. Я создавал новый конфиг только с теми записями, что указали Вы и это моя ошибка. Я отредактировал дефолтный конфиг и всё завелось.
        Сейчас я столкнулся с другой проблемой —
        при подключении telnet’ом получаю вот такую ошибку —
        451 4.3.0 : Temporary lookup failure
        Вместо mail@mydomain.ru — существующий ящик.

        Доступы до БД есть, всё в порядке.
        Изначально стоит задача — сделать параллельный почтовый сервер тому, что уже существует.
        Тот, что уже существует развёрнут на FreeBsd на старых версиях postfix + dovecot.
        У меня была идея следующая — развернуть сервер, поставить туда centos 7.2, установить все обновления и развернуть ту же связку + развернуть дамп базы с основного. Создать MX запись с mail2.domain.ru и привязать её к этому серверу.
        И, в случае поломки основного, у сотрудников сменить сервер в почтовых клиентах.
        Так же можно будет при отключении основного почтового сервера, поменять внешний адрес mail.mydomain.ru на мой новый сервер, а на сервере поменять настройки на основной почтовый сервер.

  14. Не получается подключиться к почтовому серверу. Пишет: «Thunderbird не удалось найти настройки для вашей учетной записи почты». При этом из RoundCube получается залогиниться.
    Подскажите пожалуйста в какую сторону смотреть.

Добавить комментарий

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