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

Содержание


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

 

Установка PostfixAdmin

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

$ wget http://sourceforge.net/projects/postfixadmin/files/latest/download?source=files -O postfixadmin.tar.gz
$ tar zxvf postfixadmin.tar.gz --no-same-owner --no-same-permissions --directory=/usr/share
$ rm -f postfixadmin.tar.gz
$ ln -s /usr/share/postfixadmin-2.92 /usr/share/postfixadmin
$ chcon -u system_u /usr/share/postfixadmin* -R
$ mkdir /usr/share/doc/postfixadmin-2.92
$ chcon -u system_u /usr/share/doc/postfixadmin-2.92
$ mv /usr/share/postfixadmin/{ADDITIONS,DOCUMENTS,VIRTUAL_VACATION} /usr/share/doc/postfixadmin-2.92
$ rm -rf /usr/share/postfixadmin/debian
$ chcon -t httpd_sys_rw_content_t /usr/share/postfixadmin/templates_c
$ chown root:apache /usr/share/postfixadmin/templates_c
$ chmod g+w /usr/share/postfixadmin/templates_c
$ mkdir /etc/postfixadmin
$ touch /etc/postfixadmin/config.local.php
$ chown root:apache /etc/postfixadmin/config.local.php
$ chmod 0640 /etc/postfixadmin/config.local.php
$ chcon -u system_u /etc/postfixadmin -R
$ chcon -t httpd_sys_content_t /etc/postfixadmin/config.local.php
$ ln -s /etc/postfixadmin/config.local.php /usr/share/postfixadmin/
$ chcon -u system_u /usr/share/postfixadmin/config.local.php -R

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

$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.40-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE `%VMailDB%` DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> CREATE USER '%VMailUser%'@'localhost' IDENTIFIED BY '%VMailPassWord%';
Query OK, 0 rows affected (0.03 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON `%VMailDB%`.* TO '%VMailUser%'@'localhost';
Query OK, 0 rows affected (0.03 sec)

MariaDB [(none)]> \q
Bye

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

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

$ nano -w /etc/postfixadmin/config.local.php
<?php
$CONF['configured'] = true;
$CONF['setup_password'] = 'changeme';
$CONF['default_language'] = 'en';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = '%VMailUser%';
$CONF['database_password'] = '%VMailPassWord%';
$CONF['database_name'] = '%VMailDB%';
$CONF['admin_email'] = 'postmaster@example.com';
$CONF['page_size'] = '50';
$CONF['default_aliases'] = array (
    'MAILER-DAEMON' => 'postmaster@example.com',
    'abuse' => 'postmaster@example.com',
    'postmaster' => 'hostmaster@example.com',
    'webmaster' => 'hostmaster@example.com',
    'hostmaster' => 'root@example.com',
    'root' => 'admin@example.com'
);
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['transport'] = 'YES';
$CONF['transport_options'] = array (
    'dovecot',  // for virtual accounts
    'virtual',  // for virtual accounts
    'local',    // for system accounts
    'relay'     // for backup mx
);
$CONF['transport_default'] = 'dovecot';
$CONF['vacation'] = 'NO';
$CONF['vacation_control'] = 'NO';
$CONF['vacation_control_admin'] = 'NO';
$CONF['backup'] = 'YES';
$CONF['sendmail'] = 'YES';
$CONF['logging'] = 'YES';
$CONF['fetchmail'] = 'YES';
$CONF['fetchmail_extra_options'] = 'YES';
$CONF['footer_text'] = 'Return to mail.example.com';
$CONF['footer_link'] = 'http://mail.example.com';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';

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

$ nano -w /etc/httpd/conf.d/postfixadmin.conf
# postfixadmin - Web based Management tool created for Postfix.
# 
# Allows only localhost by default
#
# But allowing postfixadmin to anyone other than localhost should be considered
# dangerous unless properly secured by SSL

Alias /postfixadmin /usr/share/postfixadmin

<Directory /usr/share/postfixadmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
       Require ip 192.168.0.0/16
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
     Allow from 192.168.0.0/16
   </IfModule>
</Directory>
$ chcon -u system_u /etc/httpd/conf.d/postfixadmin.conf
$ systemctl reload httpd.service

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

$ nano -w /etc/postfixadmin/config.local.php
$CONF['setup_password'] = 'd2aec49ec9b65d5e606ea7ddcdb78d3a:831aa5735816eb6480232a93e859a1de84aec174';

Теперь опять открываем в браузере ссылку 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:
    $ echo "ALTER DATABASE \`%VMailDB%\` CHARACTER SET utf8;" >temp.txt
    $ echo "ALTER TABLE \`%VMailDB%\`.\`quota\` DROP PRIMARY KEY, ADD PRIMARY KEY (`username`) COMMENT '';" >>temp.txt
    $ mysql -u root -p --database=%VMailDB% -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' >>temp.txt
    $ mysql -u root -p --database=%VMailDB% <temp.txt
    $ rm -f temp.txt
    
  • А теперь исправим php-скрипты PostfixAdmin для правильной работы с кодировкой utf-8:
    Исправить нужно все вызовы функции htmlentities в каталогах /usr/share/postfixadmin и /usr/share/postfixadmin/templates, нужно добавить 2 аргумента |, ENT_QUOTES, 'UTF-8'|.

 

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

  • В файле fetchmail.php дважды выполняется функция escape_string, поэтому слеши сохраняются в MySQL.
  • $ nano -w /usr/share/postfixadmin/fetchmail.php
    #		$formvars[$key]= escape_string( function_exists($func) ?$func($val) :$val);
    		$formvars[$key]= function_exists($func) ?$func($val) :$val;
    

 

Установка postfix

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

$ mv /var/spool/mail/ /srv/
$ ln -s /srv/mail/ /var/spool/mail
$ chcon -u system_u -t mail_spool_t /var/spool/mail -R

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

$ yum -y install postfix && yum -y remove sendmail

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

$ nano -w /etc/postfix/main.cf
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mynetworks_style = host
mynetworks = $config_directory/mynetworks
smtpd_banner = $myhostname ESMTP $mail_name

# ---------------------- VIRTUAL DOMAINS START ----------------------
virtual_alias_maps		= proxy:mysql:$config_directory/sql/virtual_alias_maps.cf
virtual_mailbox_domains		= proxy:mysql:$config_directory/sql/virtual_domains_maps.cf
virtual_mailbox_maps		= proxy:mysql:$config_directory/sql/virtual_mailbox_maps.cf
#virtual_mailbox_limit_maps	= proxy:mysql:$config_directory/sql/virtual_mailbox_limit_maps.cf
virtual_mailbox_base		= /var/spool/mail
virtual_uid_maps		= static:8
virtual_gid_maps		= static:12
mailbox_size_limit		= 104857600
message_size_limit		= 104857600
relay_domains			= proxy:mysql:$config_directory/sql/relay_domains.cf
relay_recipient_maps		= proxy:mysql:$config_directory/sql/relay_recipient_maps.cf
transport_maps			= proxy:mysql:$config_directory/sql/transport_maps.cf
#transport_maps			= hash:$config_directory/transport
#virtual_transport		= dovecot
dovecot_destination_recipient_limit = 1
# ----------------------- VIRTUAL DOMAINS END -----------------------

# ------------------------- SASL PART START -------------------------
broken_sasl_auth_clients	= yes
smtpd_helo_required		= yes
smtpd_client_restrictions	= permit_sasl_authenticated
smtpd_sender_restrictions	= permit_sasl_authenticated
smtpd_sasl_auth_enable		= yes
smtpd_sasl_security_options	= noanonymous
smtpd_sasl_tls_security_options	= $smtpd_sasl_security_options
smtpd_sasl_type			= dovecot
# Can be an absolute path, or relative to $queue_directory
smtpd_sasl_path			= private/auth
# -------------------------- SASL PART END --------------------------

# -------------------------- TLS PART START -------------------------
smtpd_use_tls			= yes
smtpd_tls_auth_only		= yes
smtpd_tls_CAfile		= /etc/pki/tls/certs/sub.class2.server.ca.pem
smtpd_tls_cert_file		= /etc/pki/tls/certs/mail.example.com.crt
smtpd_tls_key_file		= /etc/pki/tls/private/mail.example.com.key
smtpd_tls_mandatory_protocols	= !SSLv2,!SSLv3
smtpd_tls_received_header	= yes
smtpd_tls_loglevel		= 1
tls_random_source		= dev:/dev/urandom
# --------------------------- TLS PART END --------------------------

# ------------------ SMTPD RESTRICTIONS PART START ------------------
disable_vrfy_command		= yes
non_fqdn_reject_code		= 450
invalid_hostname_reject_code	= 450
maps_rbl_reject_code		= 450
unverified_sender_reject_code	= 550
#header_checks			= pcre:$config_directory/header_checks
#body_checks			= pcre:$config_directory/body_checks
#warning: the restrictions reject_unknown_(sender|recipient)_domain
#will trigger if your DNS becomes unavailable
smtpd_recipient_restrictions =
	permit_mynetworks
	permit_sasl_authenticated
	reject_unauth_destination
	reject_invalid_helo_hostname
	warn_if_reject reject_non_fqdn_helo_hostname
	warn_if_reject reject_unknown_helo_hostname
	warn_if_reject reject_unknown_client
	reject_non_fqdn_sender
	reject_non_fqdn_recipient
	reject_unknown_sender_domain
	reject_unknown_recipient_domain
	check_client_access hash:$config_directory/rbl_override
	reject_rbl_client zen.spamhaus.org
	reject_rbl_client bl.spamcop.net
	reject_rbl_client dnsbl.sorbs.net=127.0.0.2
	reject_rbl_client dnsbl.sorbs.net=127.0.0.3
	reject_rbl_client dnsbl.sorbs.net=127.0.0.4
	reject_rbl_client dnsbl.sorbs.net=127.0.0.5
	reject_rbl_client dnsbl.sorbs.net=127.0.0.7
	reject_rbl_client dnsbl.sorbs.net=127.0.0.9
	reject_rbl_client dnsbl.sorbs.net=127.0.0.11
	reject_rbl_client dnsbl.sorbs.net=127.0.0.12
	permit

smtpd_data_restrictions =
	permit_mynetworks,
	reject_unauth_pipelining,
	reject_multi_recipient_bounce,
	permit
# ------------------- SMTPD RESTRICTIONS PART END --------------------

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

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

$ nano -w /etc/postfix/rbl_override
mail.example.com	OK
1.2.3.4			OK
mail.example.org	OK
2.3.4.5			OK
$ postmap /etc/postfix/rbl_override
$ chcon -u system_u /etc/postfix/rbl_override*

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

$ nano -w /etc/postfix/mynetworks
# localhost
127.0.0.0/8
# sw01.example.com
192.168.255.123/32
$ chcon -u system_u /etc/postfix/mynetworks

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

$ nano -w /etc/postfix/master.cf
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_sasl_authenticated,reject
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=mail:mail argv=/usr/libexec/dovecot/deliver -d ${recipient}

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

$ mkdir /etc/postfix/sql

$ nano -w /etc/postfix/sql/virtual_alias_maps.cf
hosts		= localhost
dbname		= %VMailDB%
user		= %VMailUser%
password	= %VMailPassWord%
table		= alias
select_field	= goto
where_field	= address
additional_conditions = AND active = '1'

$ nano -w /etc/postfix/sql/virtual_domains_maps.cf
hosts		= localhost
dbname		= %VMailDB%
user		= %VMailUser%
password	= %VMailPassWord%
table		= domain
select_field	= description
where_field	= domain
additional_conditions = AND backupmx = '0' AND active = '1'

$ nano -w /etc/postfix/sql/virtual_mailbox_maps.cf
hosts		= localhost
dbname		= %VMailDB%
user		= %VMailUser%
password	= %VMailPassWord%
table		= mailbox
select_field	= maildir
where_field	= username
additional_conditions = AND active = '1'

$ nano -w /etc/postfix/sql/virtual_mailbox_limit_maps.cf
hosts		= localhost
dbname		= %VMailDB%
user		= %VMailUser%
password	= %VMailPassWord%
table		= mailbox
select_field	= quota
where_field	= username
additional_conditions = AND active = '1'

$ nano -w /etc/postfix/sql/relay_domains.cf
hosts		= localhost
dbname		= %VMailDB%
user		= %VMailUser%
password	= %VMailPassWord%
table		= domain
select_field	= domain
where_field	= domain
additional_conditions = AND backupmx = '1' AND active = '1'

$ nano -w /etc/postfix/sql/relay_recipient_maps.cf
hosts		= localhost
dbname		= %VMailDB%
user		= %VMailUser%
password	= %VMailPassWord%
table		= alias
select_field	= goto
where_field	= address
additional_conditions = AND active = '1'

$ nano -w /etc/postfix/sql/transport_maps.cf
hosts		= localhost
dbname		= %VMailDB%
user		= %VMailUser%
password	= %VMailPassWord%
table		= domain
select_field	= transport
where_field	= domain
additional_conditions = AND active = '1'

$ chown root:postfix /etc/postfix/sql/ -R
$ chcon -u system_u /etc/postfix/sql -R
$ chmod 0640 /etc/postfix/sql/*.cf
$ chmod 0750 /etc/postfix/sql/
$ newaliases

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

 

Установка dovecot

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

$ yum -y install dovecot dovecot-mysql dovecot-pigeonhole

$ nano -w /etc/dovecot/dovecot.conf
protocols = imap

$ nano -w /etc/dovecot/conf.d/10-auth.conf
#!include auth-system.conf.ext
!include auth-sql.conf.ext

$ nano -w /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/spool/mail/%d/%n
mail_privileged_group = mail
mail_access_groups = mail
mmap_disable = yes
first_valid_uid = 8
first_valid_gid = 12

$ nano -w /etc/dovecot/conf.d/10-master.conf
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = mail
    group = mail
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

$ nano -w /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/pki/tls/certs/mail.example.com.crt
ssl_key = </etc/pki/tls/private/mail.example.com.key
ssl_ca = </etc/pki/tls/certs/sub.class2.server.ca.pem
ssl_protocols = !SSLv2 !SSLv3

$ nano -w /etc/dovecot/conf.d/15-lda.conf
postmaster_address = postmaster@example.com
hostname = mail.example.com
lda_mailbox_autocreate = yes
lda_mailbox_autosubscribe = yes
protocol lda {
  mail_plugins = sieve
}

$ nano -w /etc/dovecot/conf.d/20-managesieve.conf
protocols = $protocols sieve

$ nano -w /etc/dovecot/conf.d/90-sieve.conf
plugin {
  sieve = /var/spool/mail/%Ld/%Ln.sieve/.dovecot.sieve
  sieve_dir = /var/spool/mail/%Ld/%Ln.sieve/
  sieve_extensions = +notify +imapflags
}

$ nano -w /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=%VMailDB% user=%VMailUser% password=%VMailPassWord%
user_query = \
  SELECT CONCAT("/var/spool/mail/", domain) AS home, 8 AS uid, 12 AS gid, \
    'maildir:/var/spool/mail/%d/%n' AS mail, CONCAT("dirsize:storage=", quota) AS quota \
  FROM mailbox WHERE username = '%u' AND active = '1'
password_query = \
  SELECT username AS user, password, \
    CONCAT("/var/spool/mail/", domain) AS userdb_home, 8 AS userdb_uid, 12 AS userdb_gid \
  FROM mailbox WHERE username = '%u' AND active='1'
iterate_query = SELECT username AS user FROM mailbox WHERE active='1'
$ chcon -u system_u /etc/dovecot/dovecot-sql.conf.ext
$ chmod 0600 /etc/dovecot/dovecot-sql.conf.ext

 

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

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

$ systemctl enable dovecot
$ systemctl start dovecot
$ systemctl status dovecot
dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled)
   Active: active (running) since Wed 2014-11-26 15:58:44 MSK; 3min 41s ago
 Main PID: 20380 (dovecot)
   CGroup: /system.slice/dovecot.service
           ├─20380 /usr/sbin/dovecot -F
           ├─20384 dovecot/anvil
           ├─20385 dovecot/log
           └─20387 dovecot/config

Nov 26 15:58:44 example.com systemd[1]: Started Dovecot IMAP/POP3 email server.
Nov 26 15:58:44 example.com dovecot[20380]: master: Dovecot v2.2.10 starting up for imap, sieve (core dumps disabled)

$ systemctl enable postfix
$ systemctl restart postfix
$ systemctl status postfix
postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled)
   Active: active (running) since Wed 2014-11-26 16:01:53 MSK; 1s ago
  Process: 20542 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 20558 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 20555 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 20552 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 20630 (master)
   CGroup: /system.slice/postfix.service
           ├─20630 /usr/libexec/postfix/master -w
           ├─20631 pickup -l -t unix -u
           ├─20632 qmgr -l -t unix -u
           └─20633 proxymap -t unix -u

Nov 26 16:01:52 example.com systemd[1]: Starting Postfix Mail Transport Agent...
Nov 26 16:01:53 example.com postfix/postfix-script[20628]: starting the Postfix mail system
Nov 26 16:01:53 example.com postfix/master[20630]: daemon started -- version 2.10.1, configuration /etc/postfix
Nov 26 16:01:53 example.com systemd[1]: Started Postfix Mail Transport Agent.

 

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

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

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.example.com ESMTP Postfix
EHLO localhost
250-mail.example.com
250-PIPELINING
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: wakko@example.org
250 2.1.0 Ok
RCPT TO: admin@example.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Hi, Admin!

It's only test and nothing else.
.
250 2.0.0 Ok: queued as 43A7A209ED22
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

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

$ echo -ne "\0test@example.com\0testpassword" | base64
AHRlc3RAZXhhbXBsZS5jb20AdGVzdHBhc3N3b3Jk
$ openssl s_client -starttls smtp -connect localhost:25 -crlf -ign_eof
CONNECTED(00000003)
depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority
verify return:1
depth=1 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Class 1 Primary Intermediate Server CA
verify return:1
depth=0 C = RU, CN = mail.example.com, emailAddress = hostmaster@example.com
verify return:1
---
Certificate chain
 0 s:/C=RU/CN=mail.example.com/emailAddress=hostmaster@example.com
   i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
---
Server certificate
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
subject=/C=RU/CN=mail.example.com/emailAddress=hostmaster@example.com
issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
---
No client certificate CA names sent
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 2450 bytes and written 410 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: ...
    Session-ID-ctx:
    Master-Key: ...
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - ...

    Start Time: 1417022108
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
250 DSN
EHLO localhost
250-mail.example.com
250-PIPELINING
250-SIZE 104857600
250-ETRN
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN AHRlc3RAZXhhbXBsZS5jb20AdGVzdHBhc3N3b3Jk
235 2.7.0 Authentication successful
MAIL FROM: test@example.com
250 2.1.0 Ok
RCPT TO: test@example.org
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
It's only test message.
.
250 2.0.0 Ok: queued as 8078F20A8F43
QUIT
221 2.0.0 Bye
closed

 

Настройка firewall

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

$ firewall-cmd --permanent --zone=public --add-service=smtp
$ firewall-cmd --permanent --zone=public --add-service=imaps
$ firewall-cmd --permanent --zone=public --add-port=465/tcp
$ firewall-cmd --permanent --zone=public --add-port=4190/tcp
$ firewall-cmd --reload

 

Настройка FetchMail

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

$ yum -y install fetchmail perl-LockFile-Simple perl-Sys-Syslog

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

$ nano -w /etc/postfixadmin/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

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

$ 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
$ 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

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

$ crontab -u postfix -e
MAILTO=root
*/1 * * * *	/usr/libexec/postfix/fetchmail.pl

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

$ echo "QUIT" | openssl s_client -connect mail.example.org:993 -showcerts | sed -ne '/BEGIN/,/END/p' >/tmp/temp.crt
depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority
verify return:1
depth=1 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Class 1 Primary Intermediate Server CA
verify return:1
depth=0 description = 907535-Ri93n22WJHt0psNK, CN = mail.example.org, emailAddress = postmaster@example.org
verify return:1
notAfter=Oct 13 05:50:16 2015 GMT
verify return:1
depth=0 description = 907535-Ri93n22WJHt0psNK, CN = mail.example.org, emailAddress = postmaster@example.org
notAfter=Oct 13 05:50:16 2015 GMT
verify return:1
DONE
$ openssl x509 -in /tmp/temp.crt -fingerprint -noout -md5 | sed "s/MD5 Fingerprint=//"
4F:80:51:CD:B5:1C:6A:37:74:3A:46:4B:E1:02:A7:BC
$ rm -f /tmp/temp.crt

В этой статье можно прочитать про настройку спам-фильтра 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 получается залогиниться.
    Подскажите пожалуйста в какую сторону смотреть.

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