Устанавливаем свой почтовый сервер На базе Postfix и Dovecot с хранением пользователей в Mysql

Всем добрый день!

Решил написать HOWTO по мотивам недавнего внедрения почтового сервера в организации. Материал будет разбит на несколько статей, так как материала много. Параллельно с текстом вся конфигурация будет проверена на новой тестовой инсталляции FreeBSD 10.3.

Итак, в этом материале  мы рассмотрим установку и настройку нашего почтового сервера, попутно установим Mysql, PHP и Nginx. Инсталляция будет проводится в операционной системе FreeBSD 10.3 с локалью UTF-8, сервер будет иметь:

  1. Внешний интерфейс 111.111.111.111
  2. Внутренний интерфейс 10.10.10.10
  3. Имя сервера mail.test.ru
  4. Будем обслуживать домен test.ru
  5. Будем исходить из того, что в DNS вашей зоны внесены:
  • A запись типа mail    IN      A    111.111.111.111
  • MX запись          IN      MX      10      mail.test.ru.

Из чего будет состоять наш почтовый сервер:

  1. Postfix – сам MTA (mail transfer agent)
  2. Dovecot – IMAP и POP3 сервер
  3. PostfixAdmin – WEB интерфейс для администратора почтового сервера (создание, управление пользователями, виртуальными доменами)
  4. RoundCube – пользовательский WEB интерфейс к нашему почтовому серверу

Устанавливаем все необходимое

Предварительно обновив или установив набор портов.
Обновление: portsnap fetch update
Первая установка: portsnap fetch extract

MySQL:

cd /usr/ports/databases/mysql56-server/
make install clean

Разрешаем запуск MySQL сервера:
sysrc mysql_enable="YES"

Запускаем MySQL сервер:
/usr/local/etc/rc.d/mysql-server start

Зададим пароль для пользователя root в MySQL, удалим тестовую базу, запретим удаленные подключения и удалим анонимного пользователя:
mysql_secure_installation

  • Set root password? [Y/n] Y
  • New password: mypassword
  • Re-enter new password: mypassword
  • Remove anonymous users? [Y/n] Y
  • Disallow root login remotely? [Y/n] Y
  • Remove test database and access to it? [Y/n] Y
  • Reload privilege tables now? [Y/n] Y
Создадим базы для PostfixAdmin и RounCube:

mysql -u root -p
mysql> create database postfix;
mysql> grant all on postfix.* to postfix@localhost identified by 'mypassword';
mysql> create database roundcube;
mysql> grant all on roundcube.* to roundcube@localhost identified by 'mypassword';
mysql> \q

Тем самым мы создали две базы данных:

  1. postfix с паролем mypassword и пользователем postfix для PostfixAdmin
  2. rouncube с паролем mypassword и пользователем roundcube для RoundCube

NGINX:

cd /usr/ports/www/nginx
make install clean

В config я убрал поддержку IPV6, т.к. ее не использую и убираю ее везде, остальное оставил по умолчанию.

Настройки установщика NGINX
Настройки установщика NGINX

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

sysrc nginx_enable="YES"

Создадим два виртуальных хоста:

  1. postfix.test.ng.ru для PostfixAdmin
  2. mail.test.ru для RounCube

Место для логов и конфигов и создадим пустые конфиги

mkdir -p /var/log/nginx/postfix
mkdir /var/log/nginx/mail
mkdir /usr/local/etc/nginx/conf.d
touch /usr/local/etc/nginx/conf.d/postfix.test.ru.conf
touch /usr/local/etc/nginx/conf.d/mail.test.ru.conf

Для подключение конфигурационных файлов виртуальных хостов – укажем nginx где они лежат.

В файле /usr/local/etc/nginx/nginx.conf  в секции http (перед последней закрывающей фигурной скобкой) впишем:

include /usr/local/etc/nginx/conf.d/*.conf;

Конфигурационный файл виртуального хоста postfix.test.ru.conf для PostfixAdmin
server {
        listen 80;
        server_name postfix.test.ru;
        root /usr/local/www/postfixadmin/public;
        index index.php;
        charset  utf-8;
        access_log /var/log/nginx/postfix/access.log;
        error_log  /var/log/nginx/postfix/error.log  error;
       
location / {
       try_files $uri $uri/ index.php;
       #Ограничиваем работу вне своей сети
       allow 10.10.10.0/24;
       allow 111.111.111.0/24;
       deny    all;
}

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
       }
}

Конфигурационный файл виртуального хоста mail.test.ru.conf  для RoundCube 
server {
        listen      80;
        server_name mail.test.ru;
        root        /usr/local/www/roundcube;
        access_log  /var/log/nginx/mail/access.log;
        error_log   /var/log/nginx/mail/error.log error;
        
location / {
        index   index.php;
        try_files $uri $uri/ /index.php?$args;
}
 
location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
}
 
location ~ /\.ht {
        deny  all;
}
 
location /favicon.ico {
        log_not_found   off;
        access_log      off;
        }
}

Пока не запускаем Nginx, запустим после установки PostfixAdmin и RoundCube.

PostfixAdmin инсталляция:

cd /usr/ports/mail/postfixadmin
make install clean

В конфигурации отмечаем MYSQL, на PostgreSQL снимаем галку (можно и не снимать)

Конфигурация PostfixAdmin
Конфигурация PostfixAdmin

RoundCube инсталляция:

cd /usr/ports/mail/roundcube
make install clean

В config, я дополнительно отметил GD и PSPELL

roundcube_config

PHP-FPM:

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

sysrc php_fpm_enable="YES"

date.timezone = Europe/Moscow

Запустим:

/usr/local/etc/rc.d/php-fpm start

Так же запустим Nginx:
/usr/local/etc/rc.d/nginx start

PostfixAdmin установка:

Правим

vi /usr/local/www/postfixadmin/config.inc.php
$CONF['configured'] =true;
$CONF['setup_password'] = 'mypassword';
$CONF['default_language'] = 'ru';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'mypassword';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'postmaster@test.ru';
$CONF['generate_password'] = 'YES';
$CONF['show_password'] = 'YES';
# '/([a-zA-Z].*){3}/' => 'password_no_characters 3', # must contain at least 3 characters
# '/([0-9].*){2}/' => 'password_no_digits 2', # must contain at least 2 digits

Переходим в браузере на страницу http://postfix.test.ru/setup.php
Проверяем вывод, при необходимости исправляем ошибки, мне в частности было предложено установить php5-imap, установим:
cd /usr/ports/mail/php56-imap/
make install clean
/usr/local/etc/rc.d/php-fpm restart

[spoiler]postfix_config_setup[/spoiler]

Внизу этой странице вбиваем текущий пароль, который указали в config.inc.php в строке $CONF[‘setup_password’] в поле Setup Password, почтовый адрес администратора и задаем пароль для входа
postfix_config_setup_admin

После этого получим строку подобной этой
postfix_config_setup_admin_passwordВписываем хеш пароля в config.inc.php в строку $CONF[‘setup_password’]

Заходим на postfix.test.ru, вставляем свои данные.
Добавляем домен http://postfix.test.ru/list.php?table=domain

Postfix:

cd /usr/ports/mail/postfix
make install clean

в cofig отмечаем, что нам нужна поддержка MySql и SASL
postfix_config

В конце инсталляции отвечаем утвердительно на вопрос:
Would you like to activate Postfix in /usr/local/etc/mail/mailer.conf [n]? y

Останавливаем sendmail:

# /etc/rc.d/sendmail stop

Запрещаем запуск Sendmail и разрешаем запуск Postfix, прописав соответствующие строки в /etc/rc.conf
sysrc postfix_enable="YES"
sysrc sendmail_enable="NONE"

Отключаем различные задачи для обслуживания Sendmail.
Создаем файл /etc/periodic.conf и вписываем туда следующее:
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

Если по какой-то причине “не активировали” Postfix в конце инсталляции, то проделываем следующее:
mv /etc/mail/mailer.conf /etc/mail/mailer.conf.old
install -m 0644 /usr/local/share/postfix/mailer.conf.postfix /etc/mail/mailer.conf

Создаем дополнительные каталоги для хранения конфигов и ssl ключей:
mkdir /usr/local/etc/postfix/mysql
mkdir /usr/local/etc/postfix/ssl

Создаем ключи шифрования на 10 лет (3650 дней):
cd /usr/local/etc/postfix/ssl
openssl req -new -x509 -nodes -out cert.pem -keyout key.pem -days 3650

Отвечаем на вопросы:

  • Country Name (2 letter code) [AU]:RU
  • State or Province Name (full name) [Some-State]:Russia
  • Locality Name (eg, city) []:Moscow
  • Organization Name (eg, company) [Internet Widgits Pty Ltd]:Testcompany Ltd
  • Organizational Unit Name (eg, section) []:Mail Server
  • Common Name (e.g. server FQDN or YOUR name) []:mail.test.ru
  • Email Address []:postmaster@test.ru

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

mkdir /usr/mail
chown 65534:65534 /usr/mail

Создадим три конфигурационных файла для связи Postfix с Mysql
Для алиасов:
vi /usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf
user = postfix
password = mypassword
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

Для почтовых ящиков:
vi /usr/local/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf
user = postfix
password = mypassword
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s'AND active = '1'

Для виртуальных почтовых доменов:
vi /usr/local/etc/postfix/mysql/mysql_virtual_domains_maps.cf
user = postfix
password = mypassword
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'

Редактируем конфигурационный файл Postfix:
vi /usr/local/etc/postfix/main.cf
myhostname = mail.test.ru
mydomain = mail.test.ru
myorigin = $mydomain
#Принимаем почту локально для mail.test.ru
mydestination = $myhostname
#Для алиасов MySQL
virtual_alias_maps = proxy:mysql:$config_directory/mysql/mysql_virtual_alias_maps.cf
#Файл с запросом для почтовых ящиков
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql/mysql_virtual_mailbox_maps.cf
#Файл с запросом о виртуальных доменах
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql/mysql_virtual_domains_maps.cf
#UID и GID
virtual_minimum_uid = 65534
virtual_uid_maps = static:65534
virtual_gid_maps = static:65534
#Где храним почту
virtual_mailbox_base = /usr/mail
inet_interfaces = all
mynetworks_style = subnet
mynetworks = 10.10.10.0/24, 127.0.0.1/32
#Лимит в 10МБ на размер письма
message_size_limit = 10485760
Лимит на ящик в 1ТБ
mailbox_size_limit = 1073741824

unknown_local_recipient_reject_code = 550
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550
# отложенная обработка всех ограничений
smtpd_delay_reject = yes
# обязательное приветствие HELO/EHLO
smtpd_helo_required = yes
# запрет проверки существования получателя
disable_vrfy_command = yes

#Шифруем исходящие письма
smtp_use_tls = yes
#for gmail
smtp_tls_mandatory_ciphers = high
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3
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

#Разрешаем отправку из нашей сети и запрещеам всем остальным + еще запреты
smtpd_recipient_restrictions =
                           permit_mynetworks,
                           permit_sasl_authenticated,
                           reject_unauth_destination,
                           # запретить некорректные команды конвейера
                           reject_unauth_pipelining,
                           # списки для проверки приветствий, имен хостов,
                           # адресов отправителей и получателей
                           check_helo_access hash:/usr/local/etc/postfix/access_helo,
                           check_client_access hash:/usr/local/etc/postfix/access_client,
                           check_sender_access hash:/usr/local/etc/postfix/access_sender,
                           check_recipient_access hash:/usr/local/etc/postfix/access_recipient,
                           # запретить, если имя хоста отсутствует в DNS
                           reject_unknown_client_hostname,
                           # запретить, если приветствие некорректно
                           reject_non_fqdn_helo_hostname,
                           reject_invalid_helo_hostname,
                           reject_unknown_helo_hostname,
                           # запретить, если адрес отправителя некорректен
                           reject_non_fqdn_sender,
                           reject_unknown_sender_domain,
                           reject_unverified_sender,
                           # запретить, если адрес получателя некорректен
                           reject_non_fqdn_recipient,
                           reject_unknown_recipient_domain,
                           reject_unverified_recipient,
                           # использование внешних списков DNSBL
                           reject_rbl_client bl.spamcop.net,
                           reject_rbl_client zen.spamhaus.org

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

#Подключаем SSL и TLS
smtpd_use_tls = yes
smtpd_tls_received_header = yes
smtpd_tls_cert_file = /usr/local/etc/postfix/ssl/cert.pem
smtpd_tls_key_file = /usr/local/etc/postfix/ssl/key.pem

vi /usr/local/etc/postfix/access_helo
10                         REJECT Incorrect config.
172.16                     REJECT Incorrect config.
192.168                    REJECT Incorrect config.
127.0.0.1                  REJECT Incorrect config.
localhost                  REJECT Incorrect config.
localhost.localdomain      REJECT Incorrect config.

touch /usr/local/etc/postfix/access_client
touch /usr/local/etc/postfix/access_sender
touch /usr/local/etc/postfix/access_recipient

postmap hash:/usr/local/etc/postfix/access_helo
postmap hash:/usr/local/etc/postfix/access_client
postmap hash:/usr/local/etc/postfix/access_sender
postmap hash:/usr/local/etc/postfix/access_recipient

vi /usr/local/etc/postfix/master.cf
smtps     inet  n       -       n       -       -       smtpd
-o smtpd_tls_wrappermode=yes

Запускаем Postfix
/usr/local/etc/rc.d/postfix start

Dovecot:

cd /usr/ports/mail/dovecot2
make install clean

В config обязательно отмечаем поддержку MySQL
dovecot2_config

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

sysrc dovecot_enable="YES"

Копируем конфиги:
cp -r /usr/local/etc/dovecot/example-config/* /usr/local/etc/dovecot/

vi /usr/local/etc/dovecot/dovecot.conf
#Слушаем все интерфейсы
listen = * 

vi /usr/local/etc/dovecot/conf.d/10-auth.conf
# аутентификация открытым текстом
disable_plaintext_auth = no
# аутентификация через MySQL
!include auth-sql.conf.ext
#Закомментируем возможность работы системным пользователям
#!include auth-system.conf.ext

vi /usr/local/etc/dovecot/conf.d/10-mail.conf
mail_home = /usr/mail/%d/%n
mail_location = maildir:~
#GID
first_valid_gid = 65534

vi /usr/local/etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </usr/local/etc/postfix/ssl/cert.pem
ssl_key = </usr/local/etc/postfix/ssl/key.pem

vi /usr/local/etc/dovecot/conf.d/auth-sql.conf.ext
passdb {
             driver = sql
             #Путь до файла с запросом к MySQL
             args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
}
userdb {
            driver = sql
            args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
}

vi /usr/local/etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=mypassword
default_pass_scheme = MD5-CRYPT
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT maildir, 65534 AS uid, 65534 AS gid FROM mailbox WHERE username = '%u' AND active='1'

vi /usr/local/etc/dovecot/conf.d/10-master.conf
service auth {
        unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix
        group = postfix
       }
}

Запускаем Dovecot:
/usr/local/etc/rc.d/dovecot start

Заводим почтовый ящик пользователя через PostfixAdmin

RounCube настройка:

Заходим http://mail.test.ru/installer/
Если видим такую картину, то продолжаем, если не хватает какого-либо PHP модуля, то устанавливаем и передергиваем php-fpm[spoiler] roundcube_01[/spoiler]Нажимаем “NEXT” и в поле “Database setup” вбиваем наши настройки:
roundcube_02

 

Если планируется использовать один домен, то можно жестко указать в поле username_domain, жмем “NEXT”, записываем сгенерированный конфиг в файл: /usr/local/www/roundcube/config/config.inc.php
Нажимаем continue, исправляем DB config и переходим на страницу http://mail.test.ru/, если вы все сделали правильно, то должны увидеть такую страницу:
roundcube_03Вводим пользователя вида test@test.ru и его пароль и попадаем в почту:roundcube_04

Не забываем в конфигурационных файлах заменить имена и IP адреса на свои.
Почтовый сервер готов к использованию. В следующих статьях я опишу, как нам прикрутить к DNS подпись DKIM, так же опишем правила SPF для нашего домена. Настроим Graylist, Clamav, Spamassassin и организуем мониторинг сервера с помощью Mailgraph и Pflogsumm.

До встречи.

0 0 голосовать
Рейтинг статьи
Подписаться
Уведомление о
guest
4 Комментарий
Oldest
Newest Most Voted
Встроенные отзывы
Просмотр всех комментариев
Дмитрий
Дмитрий
2 лет назад

Продолжения настройки пока нет? (DKIM, Graylist, Clamav, Spamassassin)

Дмитрий
Дмитрий
5 месяцев назад
Ответить на  Vladimir

Руки так-и не дошли?)