Postfix на centos 7 + все необходимое: dovecot + imap + mariadb + postfixadmin + roundcube + clamav + spamassassin + антиспам + шифрование

How to Virtual Mail Hosting on CentOS – Postfix MySQL Dovecot PostfixAdmin Amavisd-new Spamassassin Clamav

First things first. If you are a novice at linux I recommend that you should get help with setting this up. This is an advanced email server configuration. This configuration will allow you to serve multiple domains on one server. This howto will allow you to setup a server that is one of four mail server types:

  • Mail server with spam and virus checking (Most people. Do everything in the howto)
  • Mail server w/o spam and virus checking (Someone else is doing email filtering for you)
  • Backup MX / spam and virus filtering server (you want to divide things up)
  • Backup MX (You want to receive and hold mail while your main server is down)

You will get the following features:

  • Postfix: the workhorse behind the mail receiving and sending
  • smtp authentication
  • secure smtp using TLS
  • Dovecot: imap and pop3 mailbox service
  • secure imap and pop3
  • server side filtering of flagged spam to a spam folder
  • mysql: handle all the virtual domains and users
  • PostfixAdmin: GUI for domain administration
  • roundcube: web mail access
  • spam/virus filtering using amavisd-new, spamassassin and clamav

The following books may be helpful for some people.

The Accidental Administrator: Linux Server Step-by-Step Configuration Guide
Learning the bash Shell: Unix Shell Programming (In a Nutshell (O’Reilly))

Start with my HOWTO: CentOS 6.x base server. That howto will get CentOS installed and ready for this howto.

WARNING: Not following the base server howto will cause you grief. Due to 6.4+ changes things will break.

We’ll start with the yum installs. > yum install roundcubemail dovecot dovecot-mysql dovecot-pigeonhole cyrus-sasl-devel cyrus-sasl-sql subversion > yum install perl-MailTools perl-MIME-EncWords perl-MIME-Charset perl-Email-Valid perl-Test-Pod perl-TimeDate > yum install perl-Mail-Sender perl-Log-Log4perl imapsync offlineimap

> yum install amavisd-new clamav clamd razor-agents perl-Convert-BinHex

Postfix.Admin doesn’t have an rpm so we need to download it and put it where we want it.
> wget > tar -xzvf postfixadmin-2.3.5.tar.gz

> mv postfixadmin-2.3.5 /usr/share/postfixadmin

Now generate an SSL certificate for postfix and dovecot to have TLS support. Replace with your server hostname.
> genkey –days 3650

Next we’ll configure the mail store directory. We put it in the /home directory to make backups and other item easy. So type the following. > mkdir /home/vmail > chmod 770 /home/vmail > useradd -r -u 101 -g mail -d /home/vmail -s /sbin/nologin -c “Virtual mailbox” vmail

> chown vmail:mail /home/vmail

Create the apache config file for postfixadmin and restart apache.

alias /mailadmin /usr/share/postfixadmin AllowOverride AuthConfig

> service httpd restart

Now we need to setup the mysql database for postfixadmin. We only need to create the database and user. The setup file will create the rest. > mysql -u root -p -e “CREATE DATABASE postfix;” > mysql -u root -p -e “CREATE USER postfix@localhost IDENTIFIED BY ‘choose_a_password’;”

> mysql -u root -p -e “GRANT ALL PRIVILEGES ON postfix . * TO postfix@localhost;”

Now its time to setup the config file. Don’t forget to set your password. Paste the following into the file. > cd /usr/share/postfixadmin

> nano -w config.local.php


Почтовый сервер для себя! Настройка postfix dovecot 2 spamassasin clamav roundcube postifxadmin

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

apt-getinstall postfix postfix-mysql dovecot-mysql dovecot-sieve dovecot-pop3d dovecot-imapd amavisd-new libclass-dbi-mysql-perl spamassassin clamav clamav-daemon postgrey php-apc nginx mysql-server mysql-client php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache  php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-fpm php5-mysql php5-sqlite php5-common php5-gd php-xml-parser php5-intl php5-mcrypt php5-curl php5-json ntp php5 curl postfix-mysql postfix-pcre postfix postfix-policyd-spf-python p7zip-full php-apc nginx mysql-server mysql-client php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-fpm php5-mysql php5-sqlite php5-common php5-gd php-xml-parser php5-intl php5-mcrypt php5-curl php5-json ntp php5 curl dovecot-managesieved dovecot-antispam wwwconfig-common dbconfig-common

 на вопрос типа настройки postfix выбираем интернет-сайт почтовое имя для домена test.lan В /etc/hostname должно быть имя сервера без доменной части. А в /etc/mailname наоборот — fqdn имя mail.test.lan

Создадим пользователя от имени которого будет работать postfix и dovecot.

groupadd -g 5000 vmailuseradd -g vmail -u 5000 vmail -d/vmail -m

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

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

mkdir /etc/postfix/sslcd /etc/postfix/ssl

Создадим файл настрок сертификата nano openssl.cnf

[req]default_bits = 4096                    default_keyfile = key.pem              encrypt_key = no                       default_md = sha512                    x509_extensions = v3_req               prompt = no                            distinguished_name = req_distinguished_name        [req_distinguished_name]C = RU                              L = Moscow                          O = Roga-I-Kopita LTD               CN = mail.test.lan                  emailAddress = postmaster@test.lan  [v3_req]

Создадим сертификаты сроком на 100 лет ))

openssl req -new -x509 -days 36500 -config openssl.cnf -out cert.pem -outform PEM -keyout key.pem -keyform PEM

перейдем к настройке самого postfix'а
cd /etc/postfix
файл с настройками это у меня он принял вот такой вот вид

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)biff = noappend_dot_mydomain = noreadme_directory = nosmtp_tls_security_level = maysmtpd_tls_security_level = maysmtpd_tls_received_header =yessmtpd_tls_session_cache_timeout = 3600ssmtpd_tls_cert_file =/etc/postfix/ssl/cert.pemsmtpd_tls_key_file =/etc/postfix/ssl/key.pemsmtpd_use_tls =yessmtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scachesmtp_tls_session_cache_database = btree:${data_directory}/smtp_scachetls_random_source = dev:/dev/urandommyhostname = mail.example.commyorigin =/etc/mailnamemydestination = $myhostname, localhost.$mydomain, localhostrelayhost =mynetworks = [::ffff:]/104 [::1]/128mailbox_command = procmail -a»$EXTENSION»mailbox_size_limit = 0recipient_delimiter = +inet_interfaces = allmax_use = 500disable_vrfy_command =yessoft_bounce = nosmtpd_sasl_auth_enable =yesbroken_sasl_auth_clients =yessmtpd_sasl_authenticated_header =yessmtpd_sasl_tls_security_options = $smtpd_sasl_security_optionssmtpd_sasl_security_options = noanonymoussmtpd_sasl_type = dovecotsmtpd_sasl_path = private/authsmtpd_helo_required =yessmtpd_delay_reject =yessmtpd_discard_ehlo_keywords = etrn, silent-discardsmtpd_recipient_limit = 10smtpd_sender_login_maps = mysql:/etc/postfix/mysql-users.cfvirtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cfvirtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cfvirtual_alias_maps = mysql:/etc/postfix/,mysql:/etc/postfix/,mysql:/etc/postfix/mysql-virtual-alias-domain-maps.cfvirtual_uid_maps = static:5000virtual_gid_maps = static:5000virtual_transport = dovecotdovecot_destination_recipient_limit = 1message_size_limit = 51200000smtpd_client_connection_count_limit = 20smtpd_client_connection_rate_limit = 30maximal_queue_lifetime = 1dbounce_queue_lifetime = 1dsmtpd_client_restrictions =        permit_mynetworks,        check_client_accesshash:/etc/postfix/sender_access,        permit_sasl_authenticated,        reject_unknown_reverse_client_hostname,        warn_if_reject reject_unknown_clientsmtpd_helo_restrictions =        permit_mynetworks,        check_helo_accesshash:/etc/postfix/sender_access,        reject_invalid_helo_hostname,        reject_unknown_helo_hostname,        reject_non_fqdn_helo_hostnamesmtpd_sender_restrictions =        permit_mynetworks,        check_sender_accesshash:/etc/postfix/sender_access,        permit_sasl_authenticated,        reject_non_fqdn_sender,        reject_unverified_sender,        reject_unauthenticated_sender_login_mismatch,        reject_unknown_sender_domainsmtpd_recipient_restrictions =        permit_mynetworks,        check_recipient_accesshash:/etc/postfix/recipient_access,        permit_sasl_authenticated,        reject_non_fqdn_recipient,        reject_unknown_recipient_domain,        reject_multi_recipient_bounce,        reject_unauth_destination,        reject_unlisted_recipient,        check_policy_service inet: =        reject_unauth_pipeliningcontent_filter = smtp-amavis:[]:10024

в папке постфикса создадим файлы только замените HOST на а остальные параметры на свои

user = USERpassword = PASSWORDhosts = HOSTdbname = DBquery =select username from mailbox where username ='%s'

user = USERpassword = PASSWORDhosts = HOSTdbname = DBquery =select username from mailbox where username='%s' AND active ='1'

user = USERpassword = PASSWORDhosts = HOSTdbname = DBquery =select goto fromalias,alias_domain where alias_domain.alias_domain ='%d' andalias.address = concat('%u','@', alias_domain.target_domain) ='1'

user = USERpassword = PASSWORDhosts = HOSTdbname = DBquery =select goto fromalias where address='%s'

user = USERpassword = PASSWORDhosts = HOSTdbname = DBquery =select domain from domain where domain='%s'

user = USERpassword = PASSWORDhosts = HOSTdbname = DBquery =select username from mailbox where username='%s' AND active ='1'
chgrp postfix/etc/postfix/mysql-*.cfchmod u=rw,g=r,o=/etc/postfix/mysql-*.cftouch /etc/postfix/sender_accesstouch /etc/postfix/recipient_accesspostmap/etc/postfix/sender_accesspostmap/etc/postfix/recipient_access

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

smtp      inet  n       —       —       —       —       smtpdsubmission inet n       —       n       —       —       smtpd   -o syslog_name=postfix/submission   -o smtpd_tls_wrappermode=no   -o smtpd_tls_security_level=encrypt   -o smtpd_sasl_auth_enable=yes   -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject   -o milter_macro_daemon_name=ORIGINATINGpickup    unix  n       —       —       60      1       pickupcleanup   unix  n       —       —       —       0       cleanupqmgr      unix  n       —       n       300     1       qmgrtlsmgr    unix  —       —       —       1000?   1       tlsmgrrewrite   unix  —       —       —       —       —       trivial-rewritebounce    unix  —       —       —       —       0       bouncedefer     unix  —       —       —       —       0       bouncetrace     unix  —       —       —       —       0       bounceverify    unix  —       —       —       —       1       verifyflush     unix  n       —       —       1000?   0       flushproxymap  unix  —       —       n       —       —       proxymapproxywrite unix —       —       n       —       1       proxymapsmtp      unix  —       —       —       —       —       smtprelay     unix  —       —       —       —       —       smtpshowq     unix  n       —       —       —       —       showqerror     unix  —       —       —       —       —       errorretry     unix  —       —       —       —       —       errordiscard   unix  —       —       —       —       —       discardlocal     unix  —       n       n       —       —      localvirtual   unix  —       n       n       —       —       virtuallmtp      unix  —       —       —       —       —       lmtpanvil     unix  —       —       —       —       1       anvilscache    unix  —       —       —       —       1       scachemaildrop  unix  —       n       n       —       —       pipe  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}uucp      unix  —       n       n       —       —       pipe  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender — $nexthop!rmail ($recipient)ifmail    unix  —       n       n       —       —       pipe  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)bsmtp     unix  —       n       n       —       —       pipe  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipientscalemail-backend unix  —       n       n       —       2       pipe  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}mailman   unix  —       n       n       —       —       pipe  flags=FR user=list argv=/usr/lib/mailman/bin/  ${nexthop} ${user}dovecot   unix  —   n   n   —   —   pipe     flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}smtp-amavis unix —     —       n       —       2       smtp       -o smtp_data_done_timeout=1200       -o smtp_send_xforward_command=yes       -o disable_dns_lookups=yes       -o max_use=20127.0.0.1:10025 inet   n       —       —       —       — smtpd       -o content_filter=       -o local_recipient_maps=       -o relay_recipient_maps=       -o smtpd_restriction_classes=       -o smtpd_delay_reject=no       -o mynetworks=       -o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject       -o smtpd_helo_restrictions=       -o smtpd_sender_restrictions=       -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject       -o smtpd_data_restrictions=reject_unauth_pipelining       -o smtpd_end_of_data_restrictions=       -o smtpd_error_sleep_time=0       -o smtpd_soft_error_limit=1001       -o smtpd_hard_error_limit=1000       -o smtpd_client_connection_count_limit=0       -o smtpd_client_connection_rate_limit=0       -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_address_mappings       -o local_header_rewrite_clients=
Читайте также:  K-lite codec pack как пользоваться. как установить

Приступим к редактированию конфигов Dovecot
cd /etc/dovecot/conf.d


disable_plaintext_auth = noauth_realms = example.comauth_mechanisms = plain login#!include auth-system.conf.ext!include auth-sql.conf.ext замените на свой домен, который прописан в /etc/mailname


log_path = syslogsyslog_facility = mail


mail_location = maildir:/vmail/%d/%n/Maildirmail_uid = 5000mail_gid = 5000mail_plugins =quotanamespace inbox {  type = private  separator = .  prefix =  inbox =yes}


service imap-login {  inet_listener imap {    port = 143  }  inet_listener imaps {    port = 993    ssl =yes  }}service pop3-login {  inet_listener pop3 {    port = 110  }  inet_listener pop3s {    port = 995    ssl =yes  }}service auth {  unix_listener auth-userdb {  }  unix_listener/var/spool/postfix/private/auth {    mode = 0666    user = vmail  }}service dict {  unix_listener dict {    mode = 0600    user = vmail  }}


ssl =yesssl_cert =/etc/postfix/ssl/cert.pemssl_key =/etc/postfix/ssl/key.pem


postmaster_address = postmaster@test.lanquota_full_tempfail =yeslda_mailbox_autocreate =yeslda_mailbox_autosubscribe =yesmail_plugins = $mail_plugins autocreate sieve15-mailboxes.conf  mailbox Drafts {    auto = subscribe    special_use = Drafts  }  mailbox Junk {    auto = subscribe    special_use = Junk  }  mailbox Trash {    auto = subscribe    special_use = Trash  }  mailbox Sent {    auto = subscribe    special_use = Sent  }


mail_plugins = $mail_plugins autocreate imap_quota


quota_rule = *:storage=1Gquota_warning = storage=95%%quota-warning 95 %uquota_warning2 = storage=80%%quota-warning 80 %uservicequota-warning {  executable = script/usr/local/bin/  user = dovecot  unix_listenerquota-warning {    user = vmail  }}plugin {  quota = dict:Userquota::proxy::quota}


sieve_default =/vmail/globalsievercsieve_before =/vmail/globalsieverc


driver = mysqlconnect = host=HOST dbname=DB user=USER password=PASSWORDdefault_pass_scheme = MD5-CRYPTpassword_query = SELECT username as user, password FROM mailbox WHERE username ='%u'user_query = SELECT'/vmail/%d/%n' AS home, 5000 AS uid, 5000 AS gid, CONCAT('*:bytes=', CAST(quota AS CHAR)) AS quota_rule FROM mailbox WHERE username ='%u' AND active ='1'


connect = host=HOST dbname=DB user=USER password=PASSWORD

и не забываем, что вместо HOST мы пишем и так далее. Ниже надо заменить table = quota на table = quota2. и полностью закоментировать 


quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext

Создадим скрипт оповещения превышении квоты

nano /usr/local/bin/quota-warning.s



Антиспам Postfix. Настройка Spamassassin, Postgrey, ClamAV

Для организации почтового сервера чаще всего применяются связка из программных пакетов Postfix и Dovecot. Однако нормальной работа почтовой системы на сервере может считаться только в случае наличия защиты от спама. Большая часть отправляемых писем представляет собой именно спам. Тема статьи — настройка spamassassin и других пакетов, позволяющих фильтровать входящие письма.

Рассмотрим установку антиспам системы на базе Spamassassin, Postgrey, ClamAV. Изначально имеем функционирующий почтовый сервер Postfix + Dovecot на Debian 8.

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

Начнем с конфигурации clamav


Запускаем реконфигурицю пакета в графическом интерфейсе:

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

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

На этом конфигурация clamav закончена.

При перезапуске службы в выводе можно заметить сообщения об ошибках следующего вида:
Setting up clamav-daemon (0.99.

2+dfsg-0+deb8u2) …
[FAIL] Clamav signatures not found in /var/lib/clamav … failed!
[FAIL] Please retrieve them using freshclam … failed!
[FAIL] Then run '/etc/init.d/clamav-daemon start' … failed!

Если они выводятся выполняем команду

Затем запускаем clamav-daemon

Установка и настройка SpamAssassin

Устанавливаем SpamAssassin.

Создаем системного пользователя, от имени которого будет выполняться процесс

Вносим изменения в конфигурационный файл:

Прежде всего даем указание на необходимость включения демона


Далее задаем:


OPTIONS=»—create-prefs —max-children 5 —username spamd —helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log»

Указываем имя pid файла


Правила Spamassassin должны автоматически обновляться, даем указание на необходимость этого:


Чтобы спам успешно отсеивался в конфигурационном файле нужно задать правила, в соответствии с которыми будет работать пакет

SpamAssassin по умолчанию будет отсеивать письма, набравшие более 5.0 баллов (баллы прибавляются при присутствии в письмах того или иного признака спама).

rewrite_header Subject ***** SPAM _SCORE_ *****

report_safe 0

required_score 5.0

use_bayes 1

use_bayes_rules 1

bayes_auto_learn 1

skip_rbl_checks 0

use_razor2 0

use_dcc 0

use_pyzor 0

На этом все, чтобы SpamAssassin мог работать с  Postfix сделаем указание на необходимость подгрузки SpamAssassin

Добавляем фильтр:

smtp inet n — — — — smtpd

-o content_filter=spamassassin

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

spamassassin unix — n n — — pipe

user=spamd argv=/usr/bin/spamc -f -e

/usr/sbin/sendmail -oi -f ${sender} ${recipient}

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

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

-U /var/spool/postfix/spamass/spamass.sock
-u spamass-milter

-s 350000

Обновляем данные

Перезапускаем службы:

Настройка postgrey

Поскольку пакет установили на начальном этапе переходим к настройке, которая элементарна

Смотрим на каком порту работает postgrey

Обычно это 10023 или 6000

Идем в конфиг и указываем хости и порт, а также необходимое время задержки при приеме письма

POSTGREY_OPTS=»—inet= —delay=60″

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

Перезапускаем службы

Читайте про настройку веб-интерейса для работы с почтой, который взаимодействует с файлами на диске и не использует базы при этом очень удобен (подходит только для частного использования).


Настройка почтового сервера на базе Exim+Dovecot+SpamAssassin+Clamav c веб-мордами Vexim+RoundCube на CentOS 6

Пропустить и перейти к содержимому

В дополнение к статье по настройке почтового сервера на FreeBSD решил написать как настроить тоже самое, но на ОС CentOS 6.

Подключаем репозиторий Remi и Epel

rpm —import rpm -Uvh yum install yum-priorities rpm —import

rpm -ivh

Приводим файл /etc/yum.repos.d/epel.repo к такому виду

[epel] name=Extra Packages for Enterprise Linux 6 — $basearch #baseurl=$basearch mirrorlist=$basearch failovermethod=priority enabled=1 priority=10 gpgcheck=1


и файл /etc/yum.repos.d/remi.repo к такому виду:

[remi] name=Les RPM de remi pour Enterprise Linux $releasever — $basearch #baseurl=$releasever/remi/$basearch/ mirrorlist=$releasever/remi/mirror enabled=1 priority=10 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi


[remi-test] name=Les RPM de remi en test pour Enterprise Linux $releasever — $basearch #baseurl=$releasever/test/$basearch/ mirrorlist=$releasever/test/mirror enabled=0 gpgcheck=1


Ставим MySQL , добавляем в атозагрузку и стартуем:

yum install mysql mysql-server chkconfig —levels 235 mysqld on

/etc/init.d/mysqld start

Установим пароь для root в MySQL следующей командой:


Устанавливаем nginx ( да да, как и в прошлый раз мы обойдемся без тяжеловесного Apache и сделаем все на NGINX + PHP-FPM ), добавим в автозагрузку и стартуем
yum install nginx
chkconfig —levels 235 nginx on
/etc/init.d/nginx start

Ставим PHP-FPM и необходимые модули PHP:

yum —enablerepo=remi,remi-test install php php-fpm php-common php-pear php-pdo php-mysql php-pgsql php-pecl-memcache php-gd php-mbstring php-mcrypt php-xml php-pear-DB php-posix

Приводим файл /etc/php-fpm.conf к такому виду:

Читайте также:  Компьютер работает медленно. зависает windows. комп стал тормозить. низкая производительность пк

[global] pid = /var/run/php-fpm/ error_log = /var/log/php-fpm/error.log


А файл /etc/php-fpm.d/www.conf к такому:

[www] listen = /tmp/php-fpm.sock user = apache group = apache pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 slowlog = /var/log/php-fpm/www-slow.log php_admin_value[error_log] = /var/log/php-fpm/www-error.log

php_admin_value[memory_limit] = 128M

Настраиваем nginx. Для этого приводим файл /etc/nginx/nginx.conf к такому виду:

user apache;
worker_processes 2;

error_log /var/log/nginx/error.log;

pid /var/run/;

events { use epoll; worker_connections 8192;


http { include /etc/nginx/mime.types;

default_type application/octet-stream;

log_format main '$remote_addr — $remote_user [$time_local] «$request» ' '$status $body_bytes_sent «$http_referer» '

'»$http_user_agent» «$http_x_forwarded_for»';

access_log /var/log/nginx/access.log main;

sendfile on; client_body_buffer_size 16K; client_header_buffer_size 1k; client_max_body_size 32M; large_client_header_buffers 2 1k; client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10; reset_timedout_connection on; server_tokens off;

gzip on;


upstream php-fpm { server unix:/tmp/php-fpm.sock;


# Virtual hosts

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


и создаем файлы виртуальых хостов:
1) Для Vexim ( /etc/nginx/conf.d/ ) файл выглядит вот так:

server { listen 80; server_name; access_log /var/log/nginx/exim-access.log; error_log /var/log/nginx/exim-error.log; root /usr/share/vexim2/vexim; index index.php;

charset utf-8;

location = /favicon.ico { log_not_found off; access_log off;


location = /robots.txt { allow all; log_not_found off; access_log off;


location ~ .php$ { fastcgi_pass php-fpm; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;


location ~ /.ht { deny all; } }

2) Для Roundcube файл ( /etc/nginx/conf.d/ ) выглядит так:

server { listen 80; server_name; access_log /var/log/nginx/mail-access.log; error_log /var/log/nginx/mail-error.log; root /usr/share/roundcubemail; index index.php;

charset utf-8;

location = /favicon.ico { log_not_found off; access_log off;


location = /robots.txt { allow all; log_not_found off; access_log off;


location ~ .php$ { fastcgi_pass php-fpm; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;


location ~ /.ht { deny all; } }

и перезагружаем nginx:

/etc/init.d/nginx restart

Устанавливаем Exim,Dovecot и прочее ПО:

yum install -y exim exim-mysql dovecot dovecot-mysql clamd clamav spamassassin

Скачиваем и распаковываем Vexim
cd /usr/share/ wget tar zxvf vexim2.2.1.tar.gz

chown -R root:root vexim2/

Копируем конфиги из Vexim в каталог с Exim

mv /etc/exim/exim.conf /etc/exim/exim.conf.bak cp /usr/share/vexim2/docs/configure /etc/exim/exim.conf

cp /usr/share/vexim2/docs/vexim-* /etc/exim/

Добавляем юзера Vexim

useradd vexim -u 90 -d /usr/local/mail -s /sbin/nologin -m

Устанавливаем БД для Vexim

perl /usr/share/vexim2/setup/ —act=newdb —dbtype=mysql —uid=93 –gid=93 —mailstore=/usr/local/mail

Редактируем файл


и прописываем доступ к БД

$sqldb = «vexim»; имя БД $sqluser = «vexim»; логин

$sqlpass = «PASSWORD»; пароль заданный ранее

Отключим и удалим Postfix, который по умолчанию уже стоит в системе CentOS 6.

alternatives —config mta chkconfig —level 123456 postfix off service postfix stop

yum remove postfix -y

Отключаем SELINUX:
echo 'SELNIUX=disabled' >> /etc/selinux/config

Добавлеяем сервисов в автозагрузку
chkconfig —level 35 clamav on chkconfig —level 35 spamassasin on chkconfig —level 35 exim on

chkconfig —level 35 dovecot on

Выставляем права:

usermod -a -G exim clamav chmod -Rf g+w /var/spool/exim chmod -Rf g+s /var/spool/exim chown exim:exim -R /usr/local/mail

chown exim:exim -R /var/spool/exim

Правим пути в конфиге Exim:

cd /etc/exim/ sed -i.bak -e ‘s//usr/local/etc//etc/g’ exim.conf

sed -i.bak -e ‘s/MAILMAN_USER=mailnull/MAILMAN_USER=exim/g’ -e ‘s/MAILMAN_GROUP=mail/MAILMAN_GROUP=exim/g’ exim.conf

Находим в конфигe exim строку: MY_IP = CHANGE и описываем свой ip


Находим: trusted_users = avleen:www

и меняем на apache . Остается:

trusted_users = apache
Менякем юзера, от которого будет запускаться exim, меняем строки

exim_user = mailnull
exim_group = mail

exim_user = exim
exim_group = exim

Находим закоментированную строку, отвечающую за подключение к MySQL серверу,раскоментируем ее и поставим там свой пароль:
hide mysql_servers = localhost::(/tmp/mysql.sock)/vexim/vexim/PASSWORD

Находим секцию system_aliases: и в ней меняем строки

user = mailnull
group = mail на

user = exim
group = exim

И запускаем:
service exim start

Настраиваем Dovecot:
Приводим конфиг /etc/dovecot/dovecot.conf к такому виду:

base_dir = /var/run/dovecot/ disable_plaintext_auth = no first_valid_uid = 93 listen = * login_greeting = Dovecot ready man. login_log_format_elements = user=< %u> method=%m rip=%r lip=%l %c mail_location = maildir:~/Maildir

log_path =/var/log/dovecot

# Log file to use for informational and debug messages. # Default is the same as log_path.

#info_log_path =

# Prefix for each line written to log file. % codes are in strftime(3) # format.

log_timestamp = «%b %d %H:%M:%S «

passdb { driver = pam } passdb { args = /etc/dovecot/dovecot-mysql.

conf driver = sql } protocols = imap pop3 service auth { unix_listener auth-master { group = exim mode = 0660 user = exim } user = root } service imap-login { chroot = client_limit = 256 process_limit = 128 process_min_avail = 3 service_count = 1 vsz_limit = 64 M } service pop3-login { chroot = client_limit = 256 process_limit = 128 process_min_avail = 3 service_count = 1 vsz_limit = 64 M } ssl = no userdb { driver = passwd } userdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } protocol imap { imap_client_workarounds = tb-extra-mailbox-sep mail_plugins = quota imap_quota } protocol pop3 { pop3_client_workarounds = outlook-no-nuls oe-ns-eoh pop3_uidl_format = %08Xu%08Xv }

Настраиваем подключение к MySQL в файле /etc/dovecot/dovecot-mysql.conf
driver = mysql connect = host=/var/lib/mysql/mysql.

sock user=vexim password=PASSWORD dbname=vexim default_pass_scheme = MD5-CRYPT password_query = SELECT crypt as `password` FROM users,domains WHERE users.username = '%u' AND users.enabled = '1' AND users.type = 'local' and domains.

enabled = '1' and domains.domain_id = users.domain_id

user_query = SELECT pop as home, uid, gid FROM users WHERE username = '%u'

И запускаем все:

/etc/init.d/dovecot start /etc/init.d/clamav start

/etc/init.d/spamassassin start

Устанавливаем roundcube

cd /usr/share wget

tar zxvf roundcubemail-0.8.1.tar.gz

mv roundcubemail-0.8.1 roundcubemail chown -R apache:apache roundcubemail/

chmod -R 777 roundcubemail/temp/ roundcubemail/logs/

Создаем базу

mysql -p Enter password: ( вводим пароль от root MySQL )

Welcome to the MySQL monitor. Commands end with ; or g.

Вводим команду
CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

И команду
GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password'; ( вместо password пишем пароль для юзера roundcube )

и выходим командой quit

Импортируем БД
mysql -p roundcubemail < roundcubemail/SQL/mysql.initial.sql ( вводим пароль от root MySQL )

Копируем конфиги

cp roundcubemail/config/ roundcubemail/config/
cp roundcubemail/config/ roundcubemail/config/

редактируем файл roundcubemail/config/

и вместо pass пишем пароль заведенный для юзера roundcube
$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';

Редактируем roundcubemail/config/

и заменяем в нем строки: $rcmail_config['default_host'] = ''; на

$rcmail_config['default_host'] = 'localhost';

$rcmail_config['smtp_server'] = ''; на
$rcmail_config['smtp_server'] = 'localhost';

$rcmail_config['smtp_user'] = ''; на

$rcmail_config['smtp_user'] = '%u';

$rcmail_config['smtp_pass'] = ''; на
$rcmail_config['smtp_pass'] = '%p';

$rcmail_config['smtp_auth_type'] = ''; на
$rcmail_config['smtp_auth_type'] = 'CRAM-MD5';

$rcmail_config['language'] = ; на
$rcmail_config['language'] = ru_RU;

$rcmail_config['create_default_folders'] = false; на
$rcmail_config['create_default_folders'] = true;

$rcmail_config['default_charset'] = ''; на
$rcmail_config['default_charset'] = 'UTF-8';

и сохраняем.

Теперь Roundcube доступен по адресу а Vexim по


Почтовый сервер Postfix. Часть 1 (Postfix + dovecot + SSL + Vimbadmin + Roundcube)

Сегодня будем заниматься настройкой сервера Postfix и Dovecot под высокую нагрузку с подписями DKIM, SPF, управлением и доступом через web-интерфейс и SSL-шифрованием. Подписи нам нужны, чтобы письма с нашего сервера не попадали в спам и набирали максимальное количество баллов лояльности других почтовых серверов.

Генерация SSL-сертификатов

cd /etc/ssl

Для начала, сгенерируем SSL-сертификаты для нашего будущего почтового сервера.

openssl genrsa -out 2048 openssl req -new -key -out

openssl x509 -req -days 365 -in -signkey -out

Настройка Postfix

Теперь приступим к первичной настройке самого Postfix-сервера. Для начала, установим все необходимые пакеты.
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql mysql-server dovecot-sieve dovecot-managesieved mc Правим конфиг мастера

mcedit /etc/postfix/

submission inet n — — — — smtpd
smtps inet n — — — — smtpd

Затираем main.conf и вносим туда свою конфигурацию.
mcedit /etc/postfix/

myhostname = myorigin = /etc/mailname # TLS parameters smtpd_tls_cert_file=/etc/ssl/ssl-bundle.crt smtpd_tls_key_file=/etc/ssl/

key smtpd_use_tls=yes #Handle SMTP authentication using Dovecot smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination mydestination = localhost # using Dovecot's LMTP for mail delivery and giving it path to store mail virtual_transport = lmtp:unix:private/dovecot-lmtp # virtual mailbox setups virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_alias_maps = mysql:/etc/postfix/mysql/ virtual_mailbox_domains = mysql:/etc/postfix/mysql/ virtual_mailbox_maps = mysql:/etc/postfix/mysql/

Создадим дирректорию, где будут лежать наши запросы к mariadb (mysql)
mkdir /etc/postfix/mysql
mcedit /etc/postfix/mysql/

Читайте также:  Wifi дома

и добавляем наши основные запросы.
user = vimbadmin password = password hosts = dbname = vimbadmin

query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'

mcedit /etc/postfix/mysql/

user = vimbadmin password = password hosts = dbname = vimbadmin

query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1'

mcedit /etc/postfix/mysql/

user = vimbadmin password = password hosts = dbname = vimbadmin

query = SELECT maildir FROM mailbox WHERE username = '%s' AND active = '1'

Настройка Dovecot

Теперь приступим к первичной настройке Dovecot. Для начала, создадим группу и пользователя для dovecot, где он будет хранить письма.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail -m

Выбираем, какие протоколы будем использовать. Сразу добавим sieve, так как в дальнейшем он нам все-равно понадобится.
mcedit /etc/dovecot/dovecot.conf

!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp sieve

> /etc/dovecot/conf.d/10-mail.conf

Письма будем хранить в специальном формате dovecot_а — mdbox. Планируется, что в почтовых ящиках будет хранить по несколько тысяч писем. С таким форматом будет удобнее =)

mcedit /etc/dovecot/conf.d/10-mail.conf
mail_location = mdbox:/var/vmail/%d/%n

namespace inbox { inbox = yes


Правим настройки аутентификации
mcedit /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no
auth_mechanisms = plain login

Комментируем #!include auth-system.conf.ext чтобы выключить стандартную аутентификацию. У нас все будет через mysql

passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=5000 gid=5000 home=/var/vmail/%d/%n allow_all_users=yes


mcedit /etc/dovecot/dovecot-sql.conf.ext

Добавим запрос к SQL-серверу на получение данных о наших пользователях.

driver = mysql connect = host= dbname=vimbadmin user=vimbadmin password=password password_query = SELECT username AS user, password, homedir AS userdb_home, uid AS userdb_uid, gid AS userdb_gid FROM mailbox WHERE username = '%u'

iterate_query = SELECT username AS user FROM mailbox

И, наконец, праивм master.conf
mcedit /etc/dovecot/conf.d/10-master.conf

service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail } user = dovecot } service auth-worker { user = vmail


Перезагружаем наши демоны, чтобы изменения вступили в силу.
service dovecot restart
service postfix restart

Настройка ViMbAdmin

Переходим к настройке Vimbadmin. Он нам нужен, чтобы администрировать наш сервер через web-интерфейс без доступа к консоли. Права на создание учеток можно выдать HR-отделу, чтобы снять с админов обязанности по работе с новыми сотрудниками.

Для начала, склонируем себе git-репозиторий vimbadmin_а.
cd /usr/local apt-get install subversion git-core git clone git:// vimbadmin

cd /usr/local/vimbadmin

Затем, установим все необходимые пакеты.
apt-get install nginx php7.0-fpm php7.0-mysql php7.0-pspell php7.0-curl php7.0-xml php7.0-xmlrpc

Разработчики данного софта рекомендую ставить его через php-композер. Так с сделаем.
curl -sS | php php composer.phar install

chown -R www-data: /usr/local/vimbadmin

Создадим базу данных и пользователя vimbadmin

CREATE DATABASE `vimbadmin`; GRANT ALL ON `vimbadmin`.* TO `vimbadmin`@`localhost` IDENTIFIED BY 'password'; FLUSH PRIVILEGES;


Приступаем к правке конфигурационных файлов.
cp application/configs/application.ini.dist application/configs/application.ini
mcedit application/configs/application.ini

defaults.mailbox.uid = 5000 defaults.mailbox.gid = 5000 defaults.mailbox.homedir = «/var/vmail/» resources.doctrine2.connection.options.driver = 'pdo_mysql' resources.doctrine2.connection.options.

dbname = 'vimbadmin' resources.doctrine2.connection.options.user = 'vimbadmin' resources.doctrine2.connection.options.password = 'password'


host = 'localhost'

mv public/.htaccess.dist public/.htaccess ./bin/doctrine2-cli.php orm:schema-tool:create

chown -R www-data:www-data /usr/local/vimbadmin

Выставим часовой пояс в настройках PHP. У меня MSK.
mcedit /etc/php/7.0/fpm/php.ini
date.timezone = «Europe/Moscow»

создадим симлинки, чтобы потом не искать, что где находится
ln -s /usr/local/vimbadmin/ /var/www/ и рестартуем php-fpm.

service php7.0-fpm restart

Далее создаем vhost nginx_а.
mcedit /etc/nginx/sites-available/vimbadmin

server { server_name; access_log /var/log/nginx/vimbadmin.log; error_log /var/log/nginx/vimbadmin.error.log; root /usr/local/vimbadmin/public; index index.

php; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.

php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }


Создаем симлинк и рестартуем nginx.
ln -s /etc/nginx/sites-available/vimbadmin /etc/nginx/sites-enabled/
service nginx restart

Вносим последние правки в конфиг vimbadmin. Данные получаем из web-инсталлера. Заодно, сразу выберем тип шифрования паролей. Этого просит наш dovecot.
mcedit application/configs/application.ini

securitysalt = «» resources.auth.oss.rememberme.salt = «» defaults.mailbox.password_salt = «»

defaults.mailbox.password_scheme = «dovecot:MD5-CRYPT»

Настройка Web-интерфейса Roundcube для доступа пользователей к почтовым ящикам

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

cd /tmp wget tar xvzf roundcubemail-1.2.1-complete.tar.gz mv roundcubemail-1.2.1 /var/www/roundcube

chown -R www-data.root /var/www/roundcube/

Создадим vhost для roundcube

mcedit /etc/nginx/sites-available/roundcube

server { server_name; access_log /var/log/nginx/roundcube.log; error_log /var/log/nginx/roundcube.error.log; root /var/www/roundcube; index index.

php; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.

php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }


Создаем симлинк и перезагружаем сервис. Так и не привыкну никак к systemctl =)
ln -s /etc/nginx/sites-available/roundcube /etc/nginx/sites-enabled/
service nginx restart

Добавим необходимые для roundcube модули PHP.
apt install php7.0-mbstring php7.0-intl

Открываем в браузере и продолжаем инсталляцию.

Да, и не забываем создать базу для roundcube =)
CREATE DATABASE `roundcube`; GRANT ALL ON `roundcube`.* TO `roundcube`@`localhost` IDENTIFIED BY 'password'; FLUSH PRIVILEGES;


Продолжение следует =)


Set up a mail server with PostfixAdmin and MariaDB on CentOS 7

In this guide, we will explain how to setup and configure a mail server with PostfixAdmin, Postfix, Dovecot, MariaDB and SpamAssasin on a CentOS VPS. PostfixAdmin is a PHP-based web front-end that allows you to manage virtual domains and users for a Postfix mail transport agent. This guide should work on other Linux VPS systems as well but was tested and written for a CentOS 7 VPS.

If you use an Ubuntu VPS, follow our tutorial to set up a mail server with Postfix, Dovecot, Spamassassin, SQLite and PostfixAdmin on an Ubuntu 16.04 VPS

If you want to use SQLite instead of MariaDB, follow our tutorial to set up a mail server with Postfix, Dovecot, Spamassassin, SQLite and PostfixAdmin on a CentoOS 7 VPS

1. Update the system and install necessary packages

yum update && yum install wget nano

2. Create system user

For security reasons, we will create a new system user who will be the owner of all mailboxes.

useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c «Virtual Mail User» vmail mkdir -p /var/vmail chmod -R 770 /var/vmail chown -R vmail:mail /var/vmail

3. Install MariaDB

MariaDB 5.5 is shipped in the default CentOS 7 repository, to install it just run:

yum install mariadb-server

To start the MariaDB service and enable it to start on boot, execute the following commands:

systemctl start mariadb.service systemctl enable mariadb.service

Run the following command to secure your MariaDB installation:


Next, we need to create a database for our postfixadminHQ instance.

mysql -uroot -p MariaDB [(none)]> CREATE DATABASE postfixadmin; MariaDB [(none)]> GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'strong_password'; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> q

4. Install PHP and all necessary PHP modules

CentOS 7 ships with PHP version 5.4, to install PHP and necessary modules, run:

yum install php php-mysql php-imap php-mbstring php-common

If you don’t have Apache installed, install it with:

yum install httpd

5. Install PostfixAdmin

The latest version of PostfixAdmin, version 3, supports MySQL/MariaDB, PostgreSQL, and SQLite databases. In this guide, we will use MariaDB.
Download the PostfixAdmin archive from SourceForge and extract it in the /var/www/html/ directory:

wget -q -O — «» | tar -xzf — -C /var/www/html

Open the mail configuration file and edit the following values:


Ссылка на основную публикацию