Установка выполняется на:
# 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 = [email protected]
}
Создаём файл с описанием подключения к 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` = '[email protected]' AND `active`='1'; +-----+-----+ | uid | gid | +-----+-----+ | 93 | 93 | +-----+-----+ 1 row in set (0.00 sec)
Хеш пароля:
mysql> SELECT `username` as `user`, `password` FROM `mailbox` WHERE `username` = '[email protected]' AND `active`='1'; +---------------------+------------------------------------+ | user | password | +---------------------+------------------------------------+ | [email protected] | $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 будут вида [email protected]
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 = [email protected]
# список хостов, которым не делаем проверку корректности 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 цифры в пароле):
Редактируем файл /var/www/vhosts/postfixadmin.domain.org.ua/config.inc.php, добавляем:
$CONF['setup_password'] = '35e58ee76c4ac888d0573cdfeedea346:9edaacb88681bdcc64cd0ed5cbd229695b60442b';
Где строка символов (хеш пароля) — та же, что и на странице.
Создаём аккаунт «root«:
Теперь переходим в саму панель управления http://postfixadmin.domain.org.ua/login.php:
Добавляем новый домен:
Создаём ящик:
Т.к. мы не снимали галочку «Отправить приветственное письмо» — 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 [email protected] to [email protected]. 2014-07-12 11:54:51 1X5t51-0002q7-4d <= [email protected] H=localhost (venti.domain.org.ua) [127.0.0.1] I=[127.0.0.1]:25 P=esmtp S=531 from <[email protected]> for [email protected] 2014-07-12 11:54:51 1X5t51-0002q7-4d => root <[email protected]> R=dovecot_user T=dovecot_delivery 2014-07-12 11:54:51 1X5t51-0002q7-4d Completed
Проверяем каталог:
# ls -l /var/vmail/domain.org.ua/[email protected]/new/
# cat /var/vmail/domain.org.ua/[email protected]/new/1405155291.M318313P10925.venti.domain.org.ua,S=646,W=664 Return-path: <[email protected]> Envelope-to: [email protected] 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 <[email protected]>) id 1X5t51-0002q7-4d for [email protected]; Sat, 12 Jul 2014 11:54:51 +0300 To: [email protected] From: [email protected] 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=<[email protected]>, 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=<[email protected]> rejected RCPT <[email protected]>: 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 [email protected] +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:[email protected] 250 OK rcpt to:[email protected] 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/[email protected]/cur/1405158157.M75523P11478.venti.domain.org.ua,S=352,W=362:2,Sb Return-path: <[email protected]> Envelope-to: [email protected] 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 <[email protected]>) id 1X5tp3-0002z2-NK for [email protected]; Sat, 12 Jul 2014 12:42:36 +0300 Hello, username!
Позже надо будет добавить Greylisting, Spamassassin и поддержку шифрования по TLS.
Exim debugging
Несколько команд для проверки работы Exim.
Проверить отправку можно так:
# exim -v [email protected] ... From: [email protected] To: [email protected] Subject: Testing Exim This is a test message. LOG: MAIN <= [email protected] 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 <[email protected]> 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 [email protected] [email protected] 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
Ссылки по теме











