CentOS: установка и настройка Dovecot 2 + Exim + ClamAV + Postfixadmin

Автор: | 07/12/2014
 

exim_logoУстановка выполняется на:

# cat /etc/redhat-release
CentOS release 6.5 (Final)

Предполагается, что MySQL и Apache HTTP уже установлены.

Создаём базу для доменов и почтовых ящиков:

mysql> create database vexim;
Query OK, 1 row affected (0.00 sec)

Создаём пользователя и даём доступ к этой базе:

mysql> grant all on vexim.* to vexim@localhost identified by 'PassWord';
Query OK, 0 rows affected (0.00 sec)

Устанавливаем всё необходимое для Postfixadmin:

# yum -y install php-imap php-mbstring php-common php-pdo php-mysql php-cli

Установка Posfixadmin

Качаем архив:

# wget http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.91/postfixadmin-2.91.tar.gz
...
2014-07-12 09:14:03 (540 KB/s) - “postfixadmin-2.91.tar.gz” saved [2489702/2489702]
# tar xpf postfixadmin-2.91.tar.gz
# mv postfixadmin-2.91 /var/www/vhosts/postfixadmin.domain.org.ua
# chown -R setevoy:setevoy /var/www/vhosts/postfixadmin.domain.org.ua
# rm postfixadmin-2.91.tar.gz
# cd /var/www/vhosts/postfixadmin.domain.org.ua

В файле config.inc.php настраиваем доступ к созданной базе:

$CONF['configured'] = true;
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'vexim';
$CONF['database_password'] = 'PassWord';
$CONF['database_name'] = 'vexim';ar.gz

Установка ClamAV

Требуется репозиторий Epel или RPMForge:

# yum -y install clamd

Редактируем /etc/clamd.conf:

# Run as another user (clamd must be started by root for this option to work)
# Default: don't drop privileges
User exim

Редактируем /etc/freshclam.conf:

# By default when started freshclam drops privileges and switches to the
# "clamav" user. This directive allows you to change the database owner.
# Default: clamav (may depend on installation options)
DatabaseOwner exim

Меняем владельца:

# chown -R exim:exim /var/log/clamav
# chown -R exim:exim /var/run/clamav/

Запускаем:

# service clamd start

Установка Exim и Dovecot

# yum -y install dovecot dovecot-mysql exim exim-mysql
...
Installed:
dovecot.x86_64 1:2.0.9-7.el6_5.1 dovecot-mysql.x86_64 1:2.0.9-7.el6_5.1 exim.x86_64 0:4.72-5.el6 exim-mysql.x86_64 0:4.72-5.el6

Проверяем:

# yum list installed | grep -E "exim|dovecot"
dovecot.x86_64 1:2.0.9-7.el6_5.1
dovecot-mysql.x86_64 1:2.0.9-7.el6_5.1
exim.x86_64 4.72-5.el6 @epel
exim-mysql.x86_64 4.72-5.el6 @epel

Наcтройка Dovecot

Получаем UID пользователя exim (от него у нас будут работать и ClamAV, и Dovecot и сам Exim):

# cat /etc/passwd | grep exim
exim:x:93:93::/var/spool/exim:/sbin/nologin

Редактируем файл /etc/dovecot/dovecot.conf, и приводим его к такому виду (было желание описать все подробно — но их слишком много, см. ссылки в конце статьи):

base_dir = /var/run/dovecot/
disable_plaintext_auth = no

# задаём UID пользователя
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:/var/vmail/%d/%u

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
}
protocol lda {
  auth_socket_path = /var/run/dovecot/auth-master
  postmaster_address = root@domain.org.ua
}

Создаём файл с описанием подключения к MySQL — /etc/dovecot/dovecot-mysql.conf:

driver = mysql
connect = host=localhost dbname=vexim user=vexim password=PassWord
default_pass_scheme = MD5-CRYPT
password_query = SELECT `username` as `user`, `password` FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'
user_query = SELECT 93 AS `uid`, 93 AS `gid` FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'

Проверим базу (вообще мы пользователя создадим позже, тут просто для примера) — найдём пользователя:

mysql> use vexim;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT 93 AS `uid`, 93 AS `gid` FROM `mailbox` WHERE `username` = 'root@domain.org.ua' AND `active`='1';
+-----+-----+
| uid | gid |
+-----+-----+
| 93 | 93 |
+-----+-----+
1 row in set (0.00 sec)

Хеш пароля:

mysql> SELECT `username` as `user`, `password` FROM `mailbox` WHERE `username` = 'root@domain.org.ua' AND `active`='1';
+---------------------+------------------------------------+
| user | password |
+---------------------+------------------------------------+
| root@domain.org.ua | $1$eae4d3fb$80IltPiRe52/deAF3hmlO. |
+---------------------+------------------------------------+
1 row in set (0.00 sec)

Создаём директорию:

# mkdir /var/vmail
# chown exim:exim -R /var/vmail
# chown exim:exim -R /var/spool/exim

Запускаем и проверяем:

# service dovecot start
Starting Dovecot Imap: [ OK ]
# tail /var/log/maillog
...
Jul 12 09:53:38 venti dovecot: master: Dovecot v2.0.9 starting up (core dumps disabled)

Запустился, пока без ошибок.

Настройка Exim

# mv /etc/exim/exim.conf /etc/exim/exim.conf.default

Создаём новый /etc/exim/exim.conf:

# имя хоста, будет использоваться при HELO
primary_hostname = mx0.domain.org.ua

# Параметры доступа к MySQL
# hide - не выводить при выполнении проверки конфигурации exim -bV
# Формат - адрес/база/пользователь/пароль
hide mysql_servers = localhost/vexim/vexim/PassWord

# если есть несколько внешних IP/интерфейсов - указываем какой слушать
# local_interfaces = 77.***.***.20

# список локальных доменов, будет использоваться в виде +local_domains
# например для отключения проверок;
# тут включаем все домены из "своей базы"
# можно добавить список через двоеточие
domainlist local_domains = ${lookup mysql{SELECT `domain`
 FROM `domain` WHERE
 `domain`='${quote_mysql:$domain}' AND
 `active`='1'}}

# список доменов, к которым разрешаем релей почты
domainlist relay_to_domains = ${lookup mysql{SELECT `domain`
 FROM `domain` WHERE
 `domain`='${quote_mysql:$domain}' AND
 `active`='1'}}

# список сетей, из которых разрешён релей
hostlist relay_from_hosts = localhost:127.0.0.0/8:77.***.***20

# задаём имена ACL для проверок
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
# acl_smtp_helo = acl_check_helo
# подключаем ClamAV
av_scanner = clamd:/var/run/clamav/clamd.sock

# Проверка на спам; подключим позже
# spamd_address = /var/run/spamd.sock

# TLS, тоже подключим позже
# SSL/TLSпубличный сертификат и приватный ключ
# tls_certificate = /etc/ssl/certs/mail.pem
# tls_privatekey = /etc/ssl/certs/mail.pem
# tls_advertise_hosts = *
# tls_on_connect_ports=465

# домен, добавляемый при отправке локальной почты;
# например письма от root будут вида root@domain.org.ua
qualify_domain = domain.org.ua

# домен для локальный получателей, противоположность пункта выше;
# если не указать - будет использоваться значение из qualify_domain
qualify_recipient = domain.org.ua

# принимать ли почту с доменов, состоящих из IP;
# не вижу адекватных серверов, которые бы так отправляли - запрещаем;
# по-умолчанию тоже false
allow_domain_literals = false

# пользователь, под которым будет работать Exim
exim_user = exim
exim_group = exim
never_users = root

# отключаем запросы идентификации хоста по RFC 1413
# т.к. у многих отправителей с этим проблемы
rfc1413_query_timeout = 0s

# если смысл указать только при использовании нестандартных портов;
# и при настройке TLS/SSL;
# у меня провайдер блокирует 25, поэтому на сервере добавил 250;
daemon_smtp_ports = 25 : 250

# Unqualified names - адреса отправителей,
# для которых домен указан без "завершающей части";
# - точки, например - root@domain
# разрешаем только для списка relay_from_hosts
sender_unqualified_hosts = +relay_from_hosts

# то же, но для получателей
recipient_unqualified_hosts = +relay_from_hosts

# timeout, после которого удаляем недоставленные bounce message:
# Non-Delivery Report (NDR), Delivery Status Notification (DSN),
# Non-Delivery Notification (NDN)
ignore_bounce_errors_after = 45m

# timeout, после которого недоставленное письмо будет удалено из очереди
timeout_frozen_after = 7d

# адрес, на который будут отправляться уведомления о недоставленных письмах
freeze_tell = root@domain.org.ua

# список хостов, которым не делаем проверку корректности HELO/EHLO
helo_accept_junk_hosts = 127.0.0.0/8

# timeout перед попыткой отправки замороженного
# (недоставленного с первой попытки) письма
auto_thaw = 1h

# приветственное сообщение сервера
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"

# макс. количество одновременных подключений для отправки
smtp_accept_max = 50

# макс. кол-во писем за одно подключение
smtp_accept_max_per_connection = 25

# макс. подключений с одного хоста
smtp_accept_max_per_host = 10

# установите true, что бы письма обрабатывались
# в очереди по мере их поступления -
# "раньше пришло - раньше ушло";
# иначе используется случайный порядок отправки;
# нельзя использовать если след. опция true
queue_run_in_order = false

# если установлено в true - Exim будет разбивать очередь
# по отдельным поддиректориям (62 штуки) в /var/spool/exim/,
# вместо создания одного списка на отправку;
# все директории будут обрабатываться в случайном порядке
# полезно в плане производительности если много почты
split_spool_directory = true
remote_max_parallel = 15
return_size_limit = 70k
message_size_limit = 64M

# разрешаем символ "_" в сообщении HELO от клиентов
helo_allow_chars = _

# принудительная синхронизация с клиентом при обмене сообщениями/командами
# может быть проблема с некоторыми почтовыми клиентами, например с Thunderbird
smtp_enforce_sync = true

# формат лога
# + - писать в лог;
# - - не писать в лог;
# +all_parents - записывать все промежуточные хосты (?);
# +connection_reject - разорванные соединения;
# +incoming_interface - интерфейс (реально - IP);
# +lost_incoming_connections - потерянные входящие соединения;
# +received_sender - отправитель;
# +received_recipients - получатель;
# +smtp_confirmation - подтверждения SMTP?;
# +smtp_syntax_error - ошибки синтаксиса SMTP;
# +smtp_protocol_error - ошибки протокола SMTP;
# -queue_run - работа очереди (замороженные сообщения);
# полный список и вообще про логгирование:
# http://www.exim.org/exim-html-current/doc/html/spec_html/ch-log_files.html
log_selector =
 +all_parents
 +connection_reject
 +incoming_interface
 +lost_incoming_connection
 +received_sender
 +received_recipients
 +smtp_confirmation
 +smtp_syntax_error
 +smtp_protocol_error
 -queue_run

 # должен отключать формат даты syslog-а в логе exim-а, но разницы не увидел
syslog_timestamp = false

 # правила проверки почты по ACL
begin acl

 # проверяем адрес получателя - блок ACL acl_check_rcpt
 #
acl_check_rcpt:

 accept hosts = :

 # некорректные символы в адресе (кроме "своих" доменов из списка local_domains)
 deny message = "incorrect symbol in address"
 domains = !+local_domains
 local_parts = ^[./|] : ^.*[@%!] : ^.*/../

 # принимать почту для ящиков postmaster в доменах из списка local_domains
 # в данном случае не нужно
 # accept local_parts = postmaster
 # domains = +local_domains

 # отклоняем, если нет HELO/EHLO
 deny message = "HELO/EHLO required by SMTP RFC"
 condition = ${if eq{$sender_helo_name}{}{yes}{no}}

 # отклоняем отправителей, у которых IP вместо домена
 # исключение - список relay_from_hosts
 deny message = "Your IP in HELO - access denied!"
 hosts = * : !+relay_from_hosts
 condition = ${if eq{$sender_helo_name}
 {$sender_host_address}{true}{false}}

 # отклоняем, если в HELO наш собственный IP
 deny condition = ${if eq{$sender_helo_name}
 {$interface_address}{yes}{no}}
 hosts = !127.0.0.1 : !localhost : *
 message = "My IP in your HELO! Access denied!"

 # отклоняем, если в EHLO наше имя хоста
 deny message = Message was delivered by ratware - own
 condition = ${if match_domain{sender_helo_name}
 {$primary_hostname:+local_domains:+relay_to_domains}
 {true}{false}}
 log_message = remote host used our name in EHLO/HELO.

 # отклоняем отправителей с именем хоста только из цифр
 deny condition = ${if match{$sender_helo_name}
 {N^d+$N}{yes}{no}}
 hosts = !127.0.0.1 : !localhost : *
 message = "Incorrect HELO string"

 # отклонять отправителей, у которых в имени хоста adsl/dialup и т.д.
 # не используется в данном случае
 # deny message = "your hostname is bad (adsl, poll, ppp & etc)."
 # condition = ${if match{$sender_host_name}
 # {adsl|dialup|pool|peer|dhcp}
 # {yes}{no}}

 # задаём задержку при подключении клиента
 # спам-боты как правило не дожидаются ответа сервера
 # требуется smtp_enforce_sync = true
 set acl_m0 = 30s
 accept hosts = +relay_from_hosts:127.0.0.0/8
 set acl_m0 = 0s
 delay = $acl_m0

 # проверяем в спам-базах
 # сервера спам-баз опрашиваются по очереди
 # сверху вниз, если не отправитель не найден на первом, то
 # запрашивается второй, и т.д.;
 # если не найден ни в одном
 # из списка - то почта пропускается
 deny message = "you in blacklist - $dnslist_domain -->
   $dnslist_text; $dnslist_value"
   log_message = REJECT: Listed in $dnslist_domain
   hosts = !+relay_from_hosts
   dnslists = cbl.abuseat.org :
   dul.dnsbl.sorbs.net :
   sbl-xbl.spamhaus.org

 # проверяем наличие получателя в локальных доменах
 accept domains = +local_domains
 verify = recipient

 # принимаем почту от локальных доменов
 accept hosts = +relay_from_hosts

 # пропускаем прошедшим авторизацию
 accept authenticated = *

 # если письмо не попало не под одно правило в списке - отклоняем его
 deny message = "Access deny - this not open relay!"
 log_message = REJECT: We aren't an open relay

acl_check_data:

 deny malware = *
 message = "Your message contains viruses: $malware_name"

 # тут потом добавим фильтры антиспама

 accept

begin routers

dnslookup:
 driver = dnslookup
 domains = ! +local_domains
 transport = remote_smtp
 ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
 no_more

system_aliases:
 driver = redirect
 allow_fail
 allow_defer
 data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE
 `address`='${quote_mysql:$local_part@$domain}' OR
 `address`='${quote_mysql:@$domain}'}}

dovecot_user:
 driver = accept
 condition = ${lookup mysql{SELECT `goto` FROM
 `alias` WHERE
 `address`='${quote_mysql:$local_part@$domain}' OR
 `address`='${quote_mysql:@$domain}'}{yes}{no}}
 transport = dovecot_delivery

begin transports

remote_smtp:
 driver = smtp

dovecot_delivery:
 driver = pipe
 command = /usr/libexec/dovecot/deliver -d $local_part@$domain
 message_prefix =
 message_suffix =
 delivery_date_add
 envelope_to_add
 return_path_add
 log_output
 user = exim

address_pipe:
 driver = pipe
 return_output

address_reply:
 driver = autoreply

begin retry

* * F,2h,15m; G,16h,1h,1.5; F,4d,6h

begin rewrite

begin authenticators

auth_plain:
  driver = plaintext
  public_name = LOGIN
  server_prompts = Username:: : Password::
  server_condition = "${if crypteq{$2}{${lookup mysql{SELECT `password` FROM `mailbox` WHERE `username` = '${quote_mysql:$1}'}}}{yes}{no}}"
  server_set_id = $1

auth_login:
  driver = plaintext
  public_name = PLAIN
  server_condition = "${if crypteq{$3}{${lookup mysql{SELECT `password` FROM `mailbox` WHERE `username` = '${quote_mysql:$2}'}}}{yes}{no}}"
  server_prompts = :
  server_set_id = $2

auth_cram_md5:
  driver = dovecot
  public_name = CRAM-MD5
  server_socket = /var/run/dovecot/auth-client
  server_set_id = $auth1

Проверяем синтаксис конфига:

# exim -bV
Exim version 4.72 #1 built 13-Jun-2014 12:17:50
Copyright (c) University of Cambridge, 1995 - 2007
Berkeley DB: Berkeley DB 4.7.25: (September 9, 2013)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc TCPwrappers OpenSSL Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm nis nis0 nisplus passwd sqlite
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
OpenSSL compile-time version: OpenSSL 1.0.1e-fips 11 Feb 2013
OpenSSL runtime version: OpenSSL 1.0.1e-fips 11 Feb 2013
Configuration file is /etc/exim/exim.conf

Ошибка будет выглядеть так (оставим незакрытую скобку { для примера):

# exim -bV
Exim version 4.72 #1 built 13-Jun-2014 12:17:50
Copyright (c) University of Cambridge, 1995 - 2007
Berkeley DB: Berkeley DB 4.7.25: (September 9, 2013)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc TCPwrappers OpenSSL Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm nis nis0 nisplus passwd sqlite
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
OpenSSL compile-time version: OpenSSL 1.0.1e-fips 11 Feb 2013
OpenSSL runtime version: OpenSSL 1.0.1e-fips 11 Feb 2013
2014-07-13 09:29:08 Exim configuration error in line 72 of /etc/exim/exim.conf:
option setting expected: {

Устанавливаем права доступа:

# chmod -Rf g+w /var/spool/exim
# chmod -Rf g+s /var/spool/exim

Отключаем и удаляем Postfix:

# alternatives --config mta

There are 2 programs which provide 'mta'.

Selection Command
-----------------------------------------------
*+ 1 /usr/sbin/sendmail.postfix
2 /usr/sbin/sendmail.exim

Enter to keep the current selection[+], or type selection number: 2

Устанавливаем 2 (sendmail.exim) вместо 1 (sendmail.postfix) — таким образом MTA по-умолчанию у нас будет Exim.

# chkconfig postfix off
# service postfix stop
Shutting down postfix: [ OK ]
# yum -y remove postfix

Добавляем в автозагрузку Exim:

# chkconfig exim on
# chkconfig dovecot on

Запускаем его:

# service exim start
Generating exim certificate: [ OK ]
Starting exim: [ OK ]

Проверяем порты:

# netstat -anpt | grep 25
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 10962/exim
tcp 0 0 0.0.0.0:250 0.0.0.0:* LISTEN 10962/exim

Проверяем лог:

# tail /var/log/exim/main.log
2014-07-12 10:10:33 exim 4.72 daemon started: pid=10217, -q1h, listening for SMTP on port 25 (IPv6 and IPv4)

Настройка Postfixadmin

Настраиваем виртуалхост для Postfixadmin (Apache HTTP установлен по этой>>>  статье).

Создаём файлы логов:

# touch /var/log/httpd/postfixadmin.domain.org.ua-access.log
# touch /var/log/httpd/postfixadmin.domain.org.ua-access.log

Создаём директорию для php-обработчика:

# mkdir /var/www/php-cgi/postfixadmin.domain.org.ua/

Копируем файлы:

# cp -r /var/www/php-cgi/domain.org.ua/* /var/www/php-cgi/postfixadmin.domain.org.ua/
# chown -R setevoy:setevoy /var/www/php-cgi/postfixadmin.domain.org.ua/

Обязательно проверяем права:

# ls -l /var/www/php-cgi/postfixadmin.domain.org.ua/
total 4
-rwxr-xr-x 1 setevoy setevoy 117 Jul 12 10:18 php.cgi

Создаём конфиг /etc/httpd/conf.d/postfixadmin.domain.org.ua.conf:

<VirtualHost 127.0.01:8080>
 DocumentRoot /var/www/vhosts/postfixadmin.domain.org.ua
 ServerName postfixadmin.domain.org.ua
 ServerAlias www.postfixadmin.domain.org.ua
 CustomLog /var/log/httpd/postfixadmin.domain.org.ua-access.log combined
 ErrorLog /var/log/httpd/postfixadmin.domain.org.ua-error.log

 <IfModule mod_fcgid.c>
 SuexecUserGroup setevoy setevoy

 <Directory /var/www/vhosts/postfixadmin.domain.org.ua>
   Options +ExecCGI
   AllowOverride All
   AddHandler fcgid-script .php
   FCGIWrapper /var/www/php-cgi/postfixadmin.domain.org.ua/php.cgi .php
   Order allow,deny
   Allow from all
 </Directory>
 </IfModule>
</VirtualHost>

Проверяем конфиг Apache HTTP:

# httpd -t
Syntax OK

Перезапускаем:

# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]

Создаём конфиг для NGINX:

# cp /etc/nginx/conf.d/domain.org.ua.conf /etc/nginx/conf.d/postfixadmin.domain.org.ua.conf

Редактируем /etc/nginx/conf.d/postfixadmin.domain.org.ua.conf:

server {
  listen 80;
  server_name postfixadmin.domain.org.ua wwww.postfixadmin.domain.org.ua;

  location ~ /.ht {
    deny all;
  }

  location ~* .(jpg|swf|jpeg|gif|png|css|js|ico)$ {
    root /var/www/vhosts/postfixadmin.domain.org.ua;
  }

  location / {
    proxy_pass http://127.0.0.1:8080;
  }
}

Проверяем, перезапускаем:

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# service nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]

Открываем страницу http://postfixadmin.domain.org.ua/setup.php и внизу задаём пароль установки (обязательное условие — минимум 2 цифры в пароле):

CentOS: установка и настройка Dovecot 2 + Exim +ClamAV + Postfixadmin

Редактируем файл /var/www/vhosts/postfixadmin.domain.org.ua/config.inc.php, добавляем:

$CONF['setup_password'] = '35e58ee76c4ac888d0573cdfeedea346:9edaacb88681bdcc64cd0ed5cbd229695b60442b';

Где строка символов (хеш пароля) — та же, что и на странице.

Создаём аккаунт «root«:

CentOS: установка и настройка Dovecot 2 + Exim +ClamAV + Postfixadmin

 

Теперь переходим в саму панель управления http://postfixadmin.domain.org.ua/login.php:

CentOS: установка и настройка Dovecot 2 + Exim +ClamAV + Postfixadmin

 

Добавляем новый домен:

CentOS: установка и настройка Dovecot 2 + Exim + ClamAV + Postfixadmin

CentOS: установка и настройка Dovecot 2 + Exim + ClamAV + Postfixadmin

 

 

 

Создаём ящик:

CentOS: установка и настройка Dovecot 2 + Exim + ClamAV + Postfixadmin

 

 

CentOS: установка и настройка Dovecot 2 + Exim + ClamAV + Postfixadmin

Т.к. мы не снимали галочку «Отправить приветственное письмо» — Exim должен был отправить его на созданный ящик.

Проверяем лог /var/log/exim/main.log:

2014-07-12 11:54:51 Delay 0s for localhost [127.0.0.1] with HELO=venti.domain.org.ua. Mail from root@domain.org.ua to root@domain.org.ua.
2014-07-12 11:54:51 1X5t51-0002q7-4d &lt;= root@domain.org.ua H=localhost (venti.domain.org.ua) [127.0.0.1] I=[127.0.0.1]:25 P=esmtp S=531 from &lt;root@domain.org.ua&gt; for root@domain.org.ua
2014-07-12 11:54:51 1X5t51-0002q7-4d =&gt; root &lt;root@domain.org.ua&gt; R=dovecot_user T=dovecot_delivery
2014-07-12 11:54:51 1X5t51-0002q7-4d Completed

Проверяем каталог:

# ls -l /var/vmail/domain.org.ua/root@domain.org.ua/new/
# cat /var/vmail/domain.org.ua/root@domain.org.ua/new/1405155291.M318313P10925.venti.domain.org.ua,S=646,W=664
Return-path: &lt;root@domain.org.ua&gt;
Envelope-to: root@domain.org.ua
Delivery-date: Sat, 12 Jul 2014 11:54:51 +0300
Received: from localhost ([127.0.0.1] helo=venti.domain.org.ua)
by mx0.domain.org.ua with esmtp (Exim 4.72)
(envelope-from &lt;root@domain.org.ua&gt;)
id 1X5t51-0002q7-4d
for root@domain.org.ua; Sat, 12 Jul 2014 11:54:51 +0300
To: root@domain.org.ua
From: root@domain.org.ua
Subject: =?utf-8?Q?=D0=94=D0=BE=D0=B1=D1=80=D0=BE_=D0=BF=D0=BE=D0=B6=D0=B0=D0=BB?= =?utf-8?Q?=D0=BE=D0=B2=D0=B0=D1=82=D1=8C!?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Hi,

Welcome to your new account.

Письмо есть, всё работает.

Настраиваем IPTABLES:

# iptables -I INPUT 6 -p tcp --dport 25 -m state --state NEW -j ACCEPT
# iptables -I INPUT 6 -p tcp --dport 250 -m state --state NEW -j ACCEPT
# iptables -I INPUT 6 -p tcp --dport 143 -m state --state NEW -j ACCEPT
# iptables -I INPUT 6 -p tcp --dport 110 -m state --state NEW -j ACCEPT
# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

Подключаемся внешним почтовым клиентом, проверяем лог /var/log/maillog:

Jul 12 12:06:10 venti dovecot: imap-login: Login: user=<root@domain.org.ua>, method=PLAIN, rip=37.***.***.56, lip=77.***.***.20

Заодно, можно увидеть работу dnsblacklist:

2014-07-13 19:35:34 H=(gmail.com) [222.100.140.4] I=[77.***.***.20]:25 F=<advertisebz09hoard@gmail.com> rejected RCPT <support@setevoy.kiev.ua>: REJECT: Listed in cbl.abuseat.org

Проверим с помощью telnet, для большей наглядности:

$ telnet 77.***.***.20 110
Trying 77.***.***.20...
Connected to 20.***.***.77.colo.static.dc.***.com.
Escape character is '^]'.
+OK Dovecot ready man.
user root@domain.org.ua
+OK
pass PassWord
+OK Logged in.
list
+OK 8 messages:
1 664
2 664
3 664
4 664
5 664
6 717
7 938
8 1938
.

Отправка:

$ telnet 77.***.***.20 25
Trying 77.***.***.20...
Connected to 20.***.***.77.colo.static.dc.***.com.
Escape character is '^]'.
220 mx0.domain.org.ua, ESMTP EXIM 4.72
helo domain.kiev.ua
250 mx0.domain.org.ua Hello domain.kiev.ua [77.***.***.40]
mail from:root@domain.kiev.ua
250 OK
rcpt to:root@domain.org.ua
250 Accepted
data
354 Enter message, ending with "." on a line by itself
Hello, username!
.
250 OK id=1X5tp3-0002z2-NK
quit
221 mx0.domain.org.ua closing connection
Connection closed by foreign host.

На сервере проверяем:

# cat /var/vmail/domain.org.ua/root@domain.org.ua/cur/1405158157.M75523P11478.venti.domain.org.ua,S=352,W=362:2,Sb
Return-path: <root@domain.kiev.ua>
Envelope-to: root@domain.org.ua
Delivery-date: Sat, 12 Jul 2014 12:42:37 +0300
Received: from [77.***.***.40] (helo=domain.kiev.ua)
by mx0.domain.org.ua with smtp (Exim 4.72)
(envelope-from <root@domain.kiev.ua>)
id 1X5tp3-0002z2-NK
for root@domain.org.ua; Sat, 12 Jul 2014 12:42:36 +0300

Hello, username!

Позже надо будет добавить Greylisting, Spamassassin и поддержку шифрования по TLS.

Exim debugging

Несколько команд для проверки работы Exim.

Проверить отправку можно так:

# exim -v root@domain.org.ua
...
From: root@domain.org.ua
To: 1th@remotedomain.kiev.ua
Subject: Testing Exim
This is a test message.
LOG: MAIN
<= root@domain.org.ua U=root P=local S=369
# Loading lookup modules from /usr/lib64/exim/4.72-5.el6/lookups
Loaded "mysql.so" (1 lookup types)
Loaded 1 lookup modules
delivering 1X6Dtu-00050z-Tr
LOG: MAIN
=> root <root@domain.org.ua> R=dovecot_user T=dovecot_delivery
LOG: MAIN
Completed

Проверить работу антивируса:

# exim -bmalware /path-to-virus-file

Посмотреть количество писем в очереди на отправку:

# exim -bpc

Посмотреть саму очередь:

# exim -bp

Узнать, чем занят Exim в настоящий момент:

# exiwhat
...
19244 daemon: -q1h, listening for SMTP on port 25 (IPv6 and IPv4) port 250 (IPv6 and IPv4)

Проверить маршрут отправки письма:

# exim -bt 1th@remotedomain.kiev.ua
1th@remotedomain.kiev.ua
router = dnslookup, transport = remote_smtp
host mx0.remotedomain.kiev.ua [77.***.***.40] MX=10

Сымитировать SMTP-активность с заданного адреса, с отображением задействованных фильтров и т.п.:

# exim -bh 77.***.***.40

Вывести все опции Exim из файлов конфигурации (активные/неактивные):

# exim -bP

Вывести только опцию smtp_enforce_sync:

# exim -bP smtp_enforce_sync

Посмотреть статистику работы сервера:

# eximstats /var/log/exim/main.log | less

Ссылки по теме

http://www.dovecot.org

http://www.exim.org

http://www.exim.org

http://www.exim.org

http://rtfm.co.ua

http://rtfm.co.ua

http://bradthemad.org

http://www.opennet.ru

Projects/Mailserver with Debian, Exim, spamassassin, greylistd, DKIM, SRS, SPF, DMARC, forwarding, LDAP, dovecot, LMTP, disk crypto