61 (17.02.2015 18:04:07 отредактировано AlfaStriker)

                              EXIM - Установка почтового сервера на CentOS 7
                                 
В этом посте написано о том, как установить почтовый сервер на CentOS 7. В новой версии операционной системы произошли некоторые изменения, поэтому старая инструкция по установке Exim потребовала маленькой корректировки, которые вы увидите в этом посте.
Основная часть настроек по настройке Exim не изменилась, но изменились настройки касающиеся самой операционной системы. Были упразднены старые пакеты по работе с брандмауэром, появился "systemd", вышла новая версия Dovecot.
На мой взгляд произошли следующие основные изменения:
1. Появился systemd - демон инициализации других демонов в Linux, пришедший на замену используемого ранее скрипта инициализации /sbin/init. Вследствие чего, за место привычного iptables имеем firewalld. Который настраивается по другому. А также управление демонами стало делаться через команду "systemctl" за место "service" и "chkconfig".
2. Так как СУБД MySQL приобрела корпорация Oracle, сообщество решило использовать в своих дистрибутивах форк по имени MariaDB. Практически все что когда-то делалось в MySQL работает и в MariaDB. Изменилась только установка, теперь она выглядит так: yum install mariadb mariadb-server
3. Версия Dovecot подскочила с 2.0.9 до 2.2, что повлияло на конфигурирование некоторых настроек.
4. В остальном все осталось по старому, хотя кто имеет кучу скриптов старой системы инициализации, им видимо придется переписывать наработанное добро на новый лад.
Обычно Exim сам по себе не может выполнять все функции почтового сервиса, его задача - это пересылка почтовых сообщений почтовым системам, а также прием писем от других почтовых серверов. Для полноценной работы на сервер выполняющий почтовые задачи ставят дополнительные пакеты, такие как: Dovecot, MySQL, CLamAV, Postgrey и т.д.

Если вы начинающий, лучше не возитесь с ручной установкой почтового сервера. Советую присмотреться  к проверенным готовым решениям например Zimbra или IRedMail.

У меня в вместе с Exim будут трудится в связке следующие программы:

  • Exim

  • Dovecot

  • MySQL

  • Clamav

  • Postfixadmin

  • Roundcube

Кратко напишу для чего какой пакет (программа) используются:
Exim - будет заниматься отправкой и получением писем от других почтовых серверов (MTA - Mail Transfer Agent / почтовый агент пересылки). Он же SMTP сервер.

Dovecot - занимается доставкой почты от Exim к почтовым клиентам (MDA - mail delivery agent / почтовый агент доставки)  и локальный агент доставки (LDA -Local Delivery Agent). Он же POP3/IMAP сервер.

MySQL -  в базе MySQL будут содержаться такие данные, как наш домен - company.ru, имена почтовых учетных записей, пароли и т.д.

PostfixAdmin - веб интерфейс для управления почтовым сервером, предназначен для системного администратора. IT-специалист в нем может легко производить такие операции как: заведение обслуживаемых почтовых доменов, почтовых учетный записей, смена паролей и т.д.

RoundCube - веб интерфейс для пользователей почтового сервера. С помощью него пользователь непрсредственно работает со своим почтовым ящиком. То есть он может: просматривать почтовые сообщения, отправлять письма и т.д.



Все что здесь написано должно работать на Fedora версий v15-19 и Red Hat 7.

Исходные данные:
Сервер: CPUx1/RAM2Gb/HDD250Gb/NICx2
Домен: point.ru
Имя хоста почтового сервера: mail.point.ru
IP адрес почтового сервера: 217.15.188.50
IP адрес DNS сервера провайдера: 10.22.32.51
Интернет подключение: IPoE (подключение к сети Интернет через Ethernet кабель со статическим публичным белым IP)

Краткое содержание:

1. Настройка сетевого адаптера
2. Подключим необходимые репозитории
3. Установка MySQL и создание базы "vexim"
4. Установка Postfixadmin
5. Установка и настройка Dovecot
6. Установка и настройка Exim
7. Отключаем Postfix
8. Отключаем SELINUX
9. Добавление сервисов в автозагрузку
10. Установка ClamAV
11. Выставляем права на почтовые каталоги очереди
12. Создаем почтовый каталог для писем пользователей
13. Настройка своего DNS сервера
14. Настройка имени хоста
15. Отключаем Firewalld и устанавливаем iptables
16. Настройка фаерволла iptables
17. Установка Fail2ban
18. Установка и настройка RoundCube Web Mail
19. Настройка Postfixadmin

1. Настройка сетевого адаптера
Проверяем какие есть у нас сетевые адаптеры в системе, вводим в консоли:

# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP                                                                                      qlen 1000
    link/ether 08:00:27:df:58:83 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fedf:5883/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP                                                                                      qlen 1000
    link/ether 08:00:27:ba:f0:55 brd ff:ff:ff:ff:ff:ff
    inet 10.168.50.2/24 brd 10.168.50.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feba:f055/64 scope link
       valid_lft forever preferred_lft forever

Здесь видно, что на компьютере три адаптера:
1. lo (loopback)
2. enp0s3
3. enp0s8

Первый адаптер - это специальный программный интерфейс обратной петли. Мы его использовать не будем.
Второй адаптер - это наш внешний физический интерфейс, мы должны прописать белый IP адрес в его настройки.
Третий адаптер - это внутренний интерфейс подключенный в локальную сеть,  соответственно у него будет адрес из диапазона локальной сети.

Теперь давайте найдем файлы настроек сетевых адаптеров, они хранятся в каталоге /etc/sysconfig/network-scripts/, для этого введем:

# ls /etc/sysconfig/network-scripts/

ifcfg-enp0s3  ifdown-post      ifup-bnep   ifup-routes
ifcfg-enp0s8  ifdown-ppp       ifup-eth    ifup-sit
ifcfg-lo      ifdown-routes    ifup-ippp   ifup-Team
ifdown        ifdown-sit       ifup-ipv6   ifup-TeamPort
ifdown-bnep   ifdown-Team      ifup-isdn   ifup-tunnel
ifdown-eth    ifdown-TeamPort  ifup-plip   ifup-wireless
ifdown-ippp   ifdown-tunnel    ifup-plusb  init.ipv6-global
ifdown-ipv6   ifup             ifup-post   network-functions
ifdown-isdn   ifup-aliases     ifup-ppp    network-functions-ipv6

Обычно файлы настроек сетевых адаптеров имеют имена:
1. ifcfg-enp0s3, ifcfg-enp0s8 ...
2. ifcfg-p2p1, ifcfg-p7p1 ...
3. ifcfg-eth0, ifcfg-eth1 ...

У нас первый вариант.

До настроек сетевых карт, обязательно отключите программу под названием NetworkManager. Это программа помогает пользователю облегчить настройки подключения к разным сетям. Но на сервере, из за этой работающей утилиты, могут возникнуть необъяснимые проблемы. Если у вас сервер, то желательно отключить NetworkManager.

Отключение NetworkManager:

# systemctl stop NetworkManager.service

# systemctl disable NetworkManager.service

Включаем сеть если она не включена:

# systemctl enable network.service

# systemctl start network.service

Файл /etc/sysconfig/network-scripts/ifcfg-enp0s3, дописываем или меняем сетевые реквизиты:

# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

HWADDR=08:00:27:DF:58:83
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s3
UUID=9825ca5b-d916-4514-b3ac-fdc7964c8362
ONBOOT=yes
IPADDR=217.15.188.50
NETMASK=255.255.255.0
GATEWAY=217.15.188.48


Жирным шрифтом помечены изменения которые были произведены мною.  Здесь дописаны такие основные параметры как:
- IP адрес компьютера
- указан признак статического адреса для хоста
- маска сети
- адрес шлюза
- адрес DNS сервера

В моих примерах, текстовые файлы создаются и редактируются с помощью редактора vi. Кратко опишу основные операции по работе с текстом:

  • После открытия файла через команду vi <имя файла>, требуется активировать режим редактирования (ввода), это нужно чтобы вносить текст в файл. Активирование режима ввода осуществляется с помощью нажатия клавиши "INS". Далее редактор перейдет с режима просмотра в состояние редактирования. Потом от вас потребуется вводить новые данные в файл.  В моих примерах от вас нужно будет копировать текст из инструкции в созданный файл. Для этого надо выделить текст мышкой и скопировать его путем нажатия комбинации "CTRL"+"C", в результате происходит копирования текста в буфер обмена, далее идет вставка текста в консоль, нажмите "INS" - переход в режим редактирования, и далее осуществляется вставка текста из буфера обмена нажатием комбинации "SHIFT"+"INS".

  • По окончанию ввода текста, нажмите кнопку "ESC". Тем самым вы вернетесь в режим просмотра.

  • Самое главное - это сохранение файла, чтобы ваш труд не пропал.  В текстовом редакторе vi данную операцию возможно осуществить двумя способами, первый вариант - нажмите и держите кнопку Shift, теперь когда кнопка Shift удержана, не отпуская ее нажмите по букве "z" - два раза. Обязательно проверьте "Caps Lock" - он должен быть выключен. Второй вариант - после выхода из режима редактирования "ESC",  введите ":w!" и нажмите "ENTER".

  • Поиск текста в редакторе vi делается путем нажатия в режиме просмотра кнопки "/", далее вводится текст который нужно найти и нажимается "ENTER".

  • Выход без сохранения текста - если вдруг вы неправильно ввели текст, можно выйти из редактора без сохранения введенных данных. Для этого нажмите "ESC" и введите ":q!", потом нажмите ENTER.

Перезапускаем демон отвечающий за сеть:

# systemctl restart network.service

В файл /etc/resolv.conf  вписываем IP адрес DNS сервера провайдера:

# vi /etc/resolv.conf

search point.ru
nameserver 10.22.32.51 //указываем DNS провайдера

Примечание: В новой версии CentOS 7, после отключения NetworkManager,  иногда нужно за место "nameserver <IP server>"  прописывать "DNS1=<IP server>"

Проверяем есть ли интернет на сервере, пингуем:

# ping google.ru

2. Подключим необходимые репозитории

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

3. Установка СУБД MySQL, создание базы данных VEXIM
Установим СУБД MySQL:

# yum install mariadb mariadb-server -y

# systemctl enable mariadb.service

# systemctl start mariadb.service

Создадим базу данных Vexim:

# mysql -p

mysql> CREATE DATABASE vexim;
mysql> GRANT ALL ON vexim.* to vexim@localhost identified by 'password';
mysql> quit

4. Установка Postfixadmin
Установим зависимости для Postfixadmin:

# yum -y install httpd php php-imap php-mbstring php-common php-pdo php-mysql php-cli wget mc bind-utils

 
Скачаем Postfixadmin и настроим его:

# cd /var/www/html

# wget http://ftp.jaist.ac.jp/pub/sourceforge/p/po/postfixadmin/postfixadmin/postfixadmin-2.92/postfixadmin-2.92.tar.gz

# tar -xvzf postfixadmin-2.92.tar.gz

# mv postfixadmin-2.92/ postfixadmin

# cd  postfixadmin

# chown -R apache.apache /var/www/html/postfixadmin/templates_c

# vi /var/www/html/postfixadmin/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';
$CONF['encrypt'] = 'dovecot:CRAM-MD5';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";

5. Установка и настройка Dovecot
Установим Dovecot:

# yum install dovecot dovecot-mysql -y

# mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-orig

Настроим Dovecot, создайте файл /etc/dovecot/dovecot.conf:

# vi /etc/dovecot/dovecot.conf

# 2.0.9: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-358.6.2.el6.i686 i686 CentOS release 6.4 (Final) 
auth_default_realm = point.ru
auth_mechanisms = plain login cram-md5
base_dir = /var/run/dovecot/
disable_plaintext_auth = no
dotlock_use_excl = yes
first_valid_gid = 6
first_valid_uid = 26
listen = *
mail_location = maildir:/var/vmail/%d/%u
mail_privileged_group = mail
passdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
protocols = imap pop3
service auth {
  unix_listener auth-client {
    group = exim
    mode = 0660
    user = exim
  }
  unix_listener auth-master {
    group = exim
    mode = 0600
    user = exim
  }
  user = root
}
ssl = no

userdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
verbose_proctitle = yes
protocol imap {
  imap_client_workarounds = delay-newmail   tb-extra-mailbox-sep
}
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 = admin@point.ru
}

Создадим файл /etc/dovecot/dovecot-mysql.conf для доступа Dovecot к MySQL базе.

# vi /etc/dovecot/dovecot-mysql.conf

#File: /etc/dovecot/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=vexim user=vexim password=password
default_pass_scheme = CRAM-MD5
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'

6. Установка и настройка Exim
Установим сам Exim:

# yum install exim exim-mysql cyrus-sasl -y
# mv /etc/exim/exim.conf /etc/exim/exim.conf-orig

Теперь настроим Exim, создадим конфиг файл /etc/exim/exim.conf

# vi  /etc/exim/exim.conf

#######################
#MAIN CONFIGURATION SETTINGS#
#######################
primary_hostname = mail.point.ru
hide mysql_servers = localhost/vexim/vexim/password

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:192.168.1.0/24  #add the hosts from which you allow relaying here

acl_not_smtp = acl_not_smtp
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

av_scanner = clamd:/var/run/clamav/clamd.socket

# spamd_address = 127.0.0.1 783

qualify_domain = point.ru
qualify_recipient = point.ru
allow_domain_literals = false
exim_user = exim
exim_group = exim
never_users = root
rfc1413_query_timeout = 0s

sender_unqualified_hosts = +relay_from_hosts
recipient_unqualified_hosts = +relay_from_hosts

ignore_bounce_errors_after = 45m
timeout_frozen_after = 15d
helo_accept_junk_hosts = 192.168.1.0/24
auto_thaw = 1h
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"
smtp_accept_max = 50
smtp_accept_max_per_connection = 25
smtp_connect_backlog = 30
smtp_accept_max_per_host = 20
split_spool_directory = true
remote_max_parallel = 15
return_size_limit = 70k
message_size_limit = 64M
helo_allow_chars = _
smtp_enforce_sync = true

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_timestamp = no

#######################################
# ACL CONFIGURATION 
# Specifies access control lists for incoming SMTP mail
#######################################
begin acl

acl_not_smtp:
        deny message = Sender rate overlimit - $sender_rate / $sender_rate_period
        ratelimit = 50 / 1h / strict
        accept

acl_check_rcpt:
  deny message          = "Lookup failed"
          condition = ${if eq{$host_lookup_failed}{1}}

  deny sender_domains = !+local_domains
          ratelimit = 5/1h/leaky/$authenticated_id
          message = Bite my shiny metal shaper!

  accept  hosts = :
  deny    message       = "incorrect symbol in address"
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  deny    message       = "incorrect symbol in address"
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  accept  local_parts   = postmaster
          domains       = +local_domains

  deny    message       = "HELO/EHLO required by SMTP RFC"
          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

  accept  authenticated = *

  deny    message       = "Your IP in HELO - access denied!"
          hosts         =  * : !+relay_from_hosts
          condition     = ${if eq{$sender_helo_name}\
    {$sender_host_address}{true}{false}}

  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!"

  deny    condition     = ${if match{$sender_helo_name}\
    {\N^\d+$\N}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "Incorrect HELO string"

# filter spammers from dynamic ips
  deny    message       = "your hostname is bad (adsl, poll, ppp & etc)."
          condition     = ${if match{$sender_host_name} \
                               {adsl|dialup|pool|peer|dhcp} \
                               {yes}{no}}

  warn
        set acl_m0 = 30s
  warn
        hosts = +relay_from_hosts:4.3.2.1/32:192.168.1.0/24 #disable waits for 'friendly' hosts
        set acl_m0 = 0s
  warn
        logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail \
from $sender_address to $local_part@$domain.
        delay = $acl_m0

                          
  accept  domains       = +local_domains
          endpass
          message       = "No such user"
          verify        = recipient

  accept  domains       = +relay_to_domains
          endpass
          message       = "i don't know how to relay to this address"
          verify        = recipient

  deny    message       = "you in blacklist - $dnslist_domain \n $dnslist_text"
          dnslists      = opm.blitzed.org : \
                          cbl.abuseat.org : \
                          bl.csma.biz 

  accept  hosts         = +relay_from_hosts

  deny    message       = "Homo hominus lupus est"

acl_check_data:

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

  # if needed - add spam filtering here

  # permit everything else
  accept

#########################
# ROUTERS CONFIGURATION                
# Specifies how addresses are handled 
#############################################
#     THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!   
# An address is passed to each router in turn until it is accepted.              
#############################################
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


##############################
#                      TRANSPORTS CONFIGURATION  
##############################
#                       ORDER DOES NOT MATTER       
#     Only one appropriate transport is called for each delivery.
#######################################
begin transports

remote_smtp:
  driver = smtp
#  interface = 4.3.2.1 #your public ip address, if it's the main server ip - you could skip this parameter. if it's an alias- it must be specified in clear


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


###########################
#                      RETRY CONFIGURATION       
###########################
begin retry

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

############################
#                      REWRITE CONFIGURATION    
############################
begin rewrite


################################
#                   AUTHENTICATION CONFIGURATION       
################################
begin authenticators

auth_plain:
     driver = dovecot
     public_name = PLAIN
     server_socket = /var/run/dovecot/auth-client
     server_set_id = $auth1

auth_login:
     driver = dovecot
     public_name = LOGIN
     server_socket = /var/run/dovecot/auth-client
     server_set_id = $auth1

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

В этом файле главное отредактировать четыре строки:
- primary_hostname = mail.point.ru - имя почтового хоста
- hide mysql_servers = localhost/vexim/vexim/password - доступ к базе MySQL в формате  localhost/имя_базы_MySQL/имя_пользователь_базы_MySQL/пароль_к_базе_MySQL
- qualify_domain = point.ru - обслуживаемый домен
- qualify_recipient = point.ru - обслуживаемый домен

7. Отключаем Postfix

# alternatives --config mta
# systemctl disable postfix
# systemctl stop postfix
# yum remove postfix -y

8. Отключаем SELINUX

# vi /etc/selinux/config

SELINUX=disabled

9. Добавление сервисов в автозагрузку
Ставим все службы в автозагрузку:

# systemctl enable dovecot.service

# systemctl enable exim.service

# systemctl enable httpd.service


10. Установка ClamAV
Установим Clamav:

# yum -y install clamav clamav-update

Подправим конфигурационный файл /etc/freshclam.conf

# vi /etc/freshclam.conf

Закоментируем 8 строчку со словом Example:

# Example

Обновим базы:

# freshclam -v

Включим автоматическое обновление баз:

# freshclam -d

11. Выставляем права на почтовые каталоги очереди
Важно правильно выставить права доступа на важные папки,
у многих начинающих возникают проблемы именно с этой частью настройки Exim.

# usermod -a -G exim clamav
# chmod -Rf g+w /var/spool/exim
# chmod -Rf g+s /var/spool/exim
# chown exim:exim -R /var/spool/exim
# chown clamav:clamav -R /var/run/clamav/

12. Создаем почтовый каталог для писем пользователей

# mkdir /var/vmail

# chown exim:exim -R /var/vmail

13. Настройка своего DNS сервера

Свой DNS сервер нужен если у вас нет аналогичных от хостера/регистратора/провайдера или в компании где вы работаете по информационной политике запрещено использование сторонних служб DNS.
Этот пункт настройки в основном можно пропускать, так как редки случаи настройки своего DNS сервера. Исключением является - проверка работоспособности почтового сервера у себя в локальной сети или в виртуальной машине.  Итак поехали настраивать свой небольшой сервер имен для гипотетического домена "point.ru".
Первым делом установим пакет Bind, именно он отвечает за функции DNS сервера:

# yum install bind -y

Открываем файл /etc/resolv.conf и приводим к виду:

search=point.ru
nameserver 217.15.188.50

Здесь мы убрали адрес DNS сервера провайдера и поставили IP адрес нашего почтового сервера. Чтобы обращение по DNS запросам шли непосредственно к нашей DNS службе.

Открывает /etc/sysconfig/network вписываем в него имя хоста нашего почтового сервера:

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=mail.point.ru

А теперь самое главное, редактируем главный файл отвечающий за работу DNS сервера/службы - /etc/named.conf
Открываем его в текстовом редакторе:

# vi /etc/named.conf

Вот оригинальный вид настроек:

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        listen-on port 53 { 127.0.0.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; };

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

Мы его меняем к следующему ввиду:

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        listen-on port 53 { 127.0.0.1; 217.15.188.50; }; # Наш внешний IP адрес почтового сервера
#      listen-on-v6 port 53 { ::1; };                         # комментируем, нам пока IPv6 не нужен, хотя...
        version "MS DNS server";                               # скрываем версию "named"
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        ###### Наши настройки #####
        allow-query { any; }; # меняем, даем обращаться всем к нашему DNS серверу
        allow-query-cache { localhost; 10.0.0.0/24; }; # меняем, добавляем локальную сеть если она есть
        allow-recursion { localhost; 10.0.0.0/24;}; # меняем, добавляем локальную сеть если она есть
        forwarders { 10.22.32.51; 8.8.8.8; }; # добавляем IP адреса DNS серверов провайдера и публичный Google DNS
        ## Наши настройки закончены ##


        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
#      recursion yes; # комментируем

        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

### Rate Limit ###
rate-limit {
    responses-per-second 15;
    window 5;
};
########Наша прямая зона##########
# Зона прямого просмотра "point.ru"
zone "point.ru" {
     type master;
     file "point.ru.fwd";
     allow-update {none;};
     allow-transfer {217.15.188.55; }; //вторичный DNS - желательно чтобы он был
};

##### Наша обратная зона просмотра "point.ru"######
zone "188.15.217.in-addr.arpa" {
     type master;
     file "point.ru.rev";
    allow-update {none;};
    allow-transfer {217.15.188.55; }; //вторичный DNS - желательно чтобы он был
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

Теперь надо создать файлы прямой (forward) и обратной (reverse) зоны для домена "point.ru".
Создаем файл отвечающий за прямую зону /var/named/point.ru.fwd и вписываем:

# vi /var/named/point.ru.fwd

$ORIGIN point.ru.

$TTL 3D

@       SOA                     mail.point.ru.     root.point.ru. (12 4h 1h 1w 1h)
@       IN      NS              mail.point.ru.
@       IN      MX      10    mail.point.ru.

mail.point.ru.         IN      A    217.15.188.50
www                     IN      A    217.15.188.50
mail                    IN      A    217.15.188.50

Создаем файл обратного просмотра зоны - point.ru (reverse zone)

# vi /var/named/point.ru.rev

Здесь  за место 188.15.217 - надо указать свою под сеть в обратном порядке.
А также при добавлении PTR записи требуется ставить последнею цифру IP адреса,
у нас эта цифра 50, так как IP адрес почтового сервере оканчивается на 50 (217.15.188.50) 

$ORIGIN 188.15.217.in-addr.arpa.

$TTL 3D
@    SOA         mail.point.ru.    root.point.ru. (12 4h 1h 1w 1h)
@    IN          NS      mail.point.ru.
50   IN          PTR     mail.point.ru.

Поставим службу named в автозагрузку и запустим ее:

# systemctl enable named.service

# systemctl start named.service

14. Настройка имени хоста

Открываем файл /etc/resolv.conf и приводим к виду:

search point.ru
nameserver 10.22.32.51    //DNS провайдера

Впишем имя хоста в /etc/sysconfig/network

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=mail.point.ru

А также впишем имя хоста в /etc/hosts

217.15.188.50 mail.point.ru mail

Еще раз проверяем файл /etc/resolv.conf

search point.ru
nameserver 10.22.32.51

Здесь IP адрес:
10.22.32.51 - провайдерский DNS сервер

Проверка работы DNS:

# nslookup mail.point.ru

# nslookup 217.15.188.50

# nslookup -type=MX point.ru

# hostname -f

mail.point.ru

# reboot


15. Отключаем Firewalld и устанавливаем iptables

# systemctl stop firewalld

# systemctl disable firewalld

# yum install iptables-services  -y

# systemctl enable iptables

Здесь мы не стали запускать iptables. Запустим его когда настроем фаервол.

16. Настройка фаерволла iptables
Создаем файл с правилами фаерволла:

# vi /etc/sysconfig/firewall.sh
+ открыть спойлер

#!/bin/bash

#Очистка всех цепочек
iptables -F
iptables -F -t nat
iptables -F -t mangle

iptables -X
iptables -X -t nat
iptables -X -t mangle

#Политика по умолчанию - запретить все, что не разрешено
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Разрешаем обращение к lo интерфейсу
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A OUTPUT -o lo -p all -j ACCEPT

#Пропускать уже инициированные, а также их дочерние пакеты на вход
iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

#Пропускать новые, инициированные, а также их дочерние на выход
iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#Разрешаем пинги с внeшнего интерфейса
iptables -A INPUT -i eth0 -p ICMP -j ACCEPT
iptables -A OUTPUT -o eth0 -p ICMP -j ACCEPT

#Разрешаем доступ по SSH на 1234 порт сервера
iptables -A INPUT -p tcp --dport 1234 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1234 -j ACCEPT

#Разрешаем WWW на 80 порт (для Roundcube и Postfixadmin)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

#Разрешаем почтовый доступ по портам 143 (IMAP), 110(POP3) и 25 (SMTP).
iptables -A INPUT -p tcp -m multiport --dports 25,110,143 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 25,110,143 -j ACCEPT

#Разрешаем ходить DNS запросам по UDP протоколу
iptables -A OUTPUT  -p udp -m udp  --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT   -p udp -m udp  --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#Разрешаем ходить DNS запросам по TCP протоколу
iptables -A OUTPUT  -p tcp -m tcp  --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT   -p tcp -m tcp  --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Лимитируем запросы по DNS порту
iptables -A INPUT -p udp --dport 53 -m hashlimit --hashlimit-name DNS --hashlimit-above 20/second \
        --hashlimit-mode srcip --hashlimit-burst 100 --hashlimit-srcmask 28 -j DROP

Даем права на запуск файла (исполняемый файл):

# chmod +x /etc/sysconfig/firewall.sh

Вставляем автозапуск скрипта во время загрузки ОС:

# vi /etc/rc.d/rc.local

/etc/sysconfig/firewall.sh

Если вы запустили iptables, отключите его на время до следующей перезагрузки:

# systemctl stop iptables

Можно сразу поменять порт SSH с 22 на 1234 в целях безопасности, открываем файл /etc/ssh/sshd_config

# vi /etc/ssh/sshd_config

Находим строку под номером 17

#Port 22

Меняем ее на:

Port 1234

Теперь если захотите зайти по SSH на сервер, не забудьте ввести новый порт 1234 в Putty.

Запускаем скрипт c командами iptables и замещаем им текущие правила фаерволла:

# /etc/sysconfig/firewall.sh
# /sbin/iptables-save > /etc/sysconfig/iptables

Запустим iptables:

# systemctl start iptables

17. Установка Fail2ban
На сервер часто ломятся разные роботы (боты), подбирая пароли и логины. Логи почтовой системы от этих ботов растут, и самое главное в конце концов не исключено что, бот подберет правильную пару логин/пароль. Утилита Fail2Ban помогает утихомирить ботов, блокируя через iptables ip адреса хостов ботов.

# yum install fail2ban -y

Откройте файл - /etc/fail2ban/jail.conf

# vi /etc/fail2ban/jail.conf

И  добавьте в конец файла следующий текст:

[roundcube-banhammer]
enabled = true
filter = roundcube.banhammer
action = iptables-multiport[name=roundcube, port="http,https", protocol=tcp]
logpath = /var/log/maillog
findtime = 3600
maxretry = 5
bantime = 3600

[dovecot-banhammer]
enabled = true
filter = dovecot.banhammer
action = iptables-multiport[name=dovecot, port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/maillog
maxretry = 5
findtime = 300
bantime = 3600
ignoreip = 127.0.0.1 192.168.1.2

[exim-banhammer]
enabled = true
filter = exim.banhammer
action = iptables-multiport[name=Exim, port="smtp,smtps", protocol=tcp]
#sendmail[name=exim-spam, dest=admin@company.ru, sender=fail2ban@localhost]
logpath = /var/log/exim/main.log
maxretry = 2
bantime = 18000
ignoreip = 127.0.0.1 192.168.1.2

Здесь IP адрес:
192.168.1.2 - за место этого IP адреса указываем Ваш внешний белый адрес который не будет проверятся fail2ban. Если их два, указываем их через пробел.

Создаем файл - /etc/fail2ban/filter.d/roundcube.banhammer.conf:

# vi /etc/fail2ban/filter.d/roundcube.banhammer.conf

[Definition]
failregex = roundcube: (.*) Error: Login failed for (.*) from <HOST>\.
ignoreregex =

Создаем файл - /etc/fail2ban/filter.d/dovecot.banhammer.conf:

# vi /etc/fail2ban/filter.d/dovecot.banhammer.conf

[Definition]
failregex = (?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed).*rip=(?P<host>\S*),.*
ignoreregex =

Создаем файл - /etc/fail2ban/filter.d/exim.banhammer.conf

# vi /etc/fail2ban/filter.d/exim.banhammer.conf

[Definition]
failregex = [\] .*(?:rejected by local_scan|Unrouteable address|Dnsbl blocked|Sender verify failed|relay not permitted|Unknown user)

Ставим fail2ban в автозагрузку:

# systemctl enable fail2ban

Стартуем демона fail2ban:

# systemctl start fail2ban

18. Установка и настройка RoundCube Web Mail
На данном этапе у нас есть удобный веб интерфейс для администратора почтового сервера, но нет веб интерфейса для пользователей. Этот досадное недоразумение решается установкой RoundCube.
Устанавливаем зависимости для установки Roundcube:

# yum install -y php php-xml php-mcrypt php-intl php-sqlite php-pgsql php-mysql php-pear php-common php-gd php-devel php php-mbstring php-cli php-snmp php-pear-Net-SMTP

# pear channel-update pear.php.net

# pear install Auth_SASL Net_SMTP2-0.1.0 Net_IDNA2-0.1.1 Mail_MIME Mail_mimeDecode Net_IDNA2-0.1.1 Net_Socket2-0.1.0 Auth_SASL2-0.1.0

Создаем базу для Roundcube:

# mysql -u root -p

mysql> CREATE DATABASE IF NOT EXISTS `roundcubemail`;
mysql> GRANT ALL PRIVILEGES ON `roundcubemail` . * TO 'roundcube'@'localhost' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
mysql> quit

Качаем сам Roundcube:

# cd /var/www/html

# wget http://ftp.jaist.ac.jp/pub/sourceforge/r/project/ro/roundcubemail/roundcubemail/1.1.0/roundcubemail-1.1.0.tar.gz

# tar xvfz roundcubemail-1.1.0.tar.gz

# mv roundcubemail-1.1.0 roundcube

# chown apache:apache -R /var/www/html/roundcube/temp

# chown apache:apache -R /var/www/html/roundcube/logs

# cd /var/www/html/roundcube/SQL/

# mysql -u root -p roundcubemail < mysql.initial.sql

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

# cd /var/www/html/roundcube/config/

# cp config.inc.php.sample config.inc.php

Открываем главный файл Roundcube:

# vi config.inc.php

Меняем в нем строчки:

$config['db_dsnw'] = 'mysql://roundcube:password@localhost/roundcubemail';
$rcmail_config['default_host'] = 'localhost';
$config['product_name'] = 'Company Webmail';
$config['skin'] = 'larry';

Открываем второй главный файл Roundcube и меняем значение строк:

# vi /var/www/html/roundcube/config/defaults.inc.php

$rcmail_config['imap_auth_type'] = cram-md5;
$rcmail_config['default_host'] = '127.0.0.1';
$rcmail_config['login_autocomplete'] = 2;
$config['htmleditor'] = 1;
$rcmail_config['username_domain'] = 'point.ru';
$rcmail_config['db_dsnw'] = 'mysql://roundcube:password@localhost/roundcubemail';

Здесь обязательно надо указать имя базы MySQL и пароль доступа к ней в строке:

$rcmail_config['db_dsnw'] = 'mysql://roundcube:password@localhost/roundcubemail';

Здесь:
     roundcube - имя пользователя базы roundcubemail
     password - пароль доступа к базе
     roundcubemail - сама база веб Интерфейса RoundCube


Cоздаем файл roundcube.conf который будет отвечать за вход по адресу http://hostname/webmail:

# vi /etc/httpd/conf.d/roundcube.conf

Вписываем следующее:

Alias /webmail /var/www/html/roundcube
<Directory /var/www/html/roundcube>
AddType application/x-httpd-php .php .php3 .php4 .phtml
# forcing open_base dir do not affect anything
php_admin_value open_basedir /
# AddDefaultCharset UTF-8
AddType text/x-component .htc
<IfModule mod_php4.c>
php_flag display_errors Off
php_flag log_errors On
php_value error_log logs/errors
php_value upload_max_filesize 5M
php_value post_max_size 6M
php_value memory_limit 64M
</IfModule>
<IfModule mod_php5.c>
php_flag display_errors Off
php_flag log_errors On
php_value error_log logs/errors
php_value upload_max_filesize 5M
php_value post_max_size 6M
php_value memory_limit 64M
</IfModule>
<FilesMatch "(\.inc|\~)$">
Order allow,deny
Deny from all
</FilesMatch>
Order deny,allow
Allow from all
</Directory>

# systemctl restart httpd

# chown apache:apache -R /var/www/html/roundcube/temp

# chown apache:apache -R /var/www/html/roundcube/logs

Ставим свой часовой пояс:

# vi /etc/php.ini

date.timezone = Asia/Almaty

или

date.timezone = Europe/Moscow

# systemctl restart httpd



Если все прошло успешно, меняем значение строки в файле "/var/www/html/roundcube/config/defaults.inc.php" на значение "true":

$config['enable_installer'] = true;

Пытаемся зайти с Веб интерфейса, в браузере вводим адрес:

http://point.ru/webmail

или

http://point.ru/roundcube

Будет выведено окошко, где надо указать:
- логин
- пароль
- сервер
Вводим например:
- логин: user@point.ru
- пароль: 123456
- сервер: point.ru

Примечание: У веб интерфейса RoundCube есть репозиторий с большим выбором плагинов которые расширяют возможности:

Например, можно добавить возможность закачки всех вложений единым архивом и т.д.

19. Настройка Postfixadmin
Здесь мы настроим веб интерфейс для управления почтовым сервером. Этот интерфейс управляет почтовым сервером, его имя Postfixadmin. В нем администратор может делать следующие операции: добавлять обслуживаемый домен для почты,  открывать или удалять почтовые учетные записи, настраивать функцию автоответчика и т.д. Мы в этом интерфейсе сделаем следующее: Добавим один обслуживаемый домен point.ru, добавим одну учетную запись linux@point.ru. Обычно администраторы выполняют эти две стандартные операции при работе с Postfixadmin, мы это и сделаем, чтобы показать основы работы в веб интерфейсе.
Мы до этого установили этот интерфейс, теперь надо зайти в него, для этогозапустите браузер и введите адрес: http://127.0.0.1/postfixadmin/setup.php
За место IP адреса 127.0.0.1 ставят IP адрес вашей внешней или внутренней сетевой карты.
Далее после входа на страницу настройки, появится окошко "Change setup password". В нем вы должны ввести ваш придуманный пароль, этот пароль будет использоваться для добавления учетной записи администратора, через которую будет осуществляться вход в Postfixadmin. Пароль вводится два раза. Запомните его, он нам пригодится в дальнейшем.
Во втором окошке появится HASH нашего пароля (шифрованный пароль). Скопируйте эту "белеберду" в буфер обмена.
После того как вы скопировали "hash" в буфер обмена, его нужно вставить в файл:
/var/www/html/postfixadmin/config.inc.php
Откройте этот файл и найдите в нем строчку:

$CONF['setup_password'] = 'changeme';

За место "changeme" ставим наш hash который скопировали в буфер. Получится так:

$CONF['setup_password'] = '6c5af4c72af213f0acac5f21d8f95ca1:e59172283d2bb72a5992af8ddc15332cde62f003';

И еще поставьте NO здесь:

$CONF['emailcheck_resolve_domain']='NO';

Сохраните файл.
Зайдите еще раз на страничку: http://127.0.0.1/postfixadmin/setup.php

Создайте учетку Админа, например "administrator@point.ru", определите его пароль.

Нажмите на кнопке "Add Admin", появится надпись:

Admin has been added!
(administrator@point.ru)

Запомните адрес админа и пароль.
Теперь уже заходим на страничку http://127.0.0.1/postfixadmin/

Вводим почтовый адрес админа и пароль.
Добавляем домен "point.ru":  Domain List - > New Domain -> point.ru

Aliases - Ставим 0
Mailboxes - Ставим 0
Галочка - Add default mail aliases

После появится надпись:
Domain has been added!
(point.ru)
Создадим первый почтовый ящик, я создал "linux@point.ru".

Меню - Virtual List -> Add MailBox ->
Username - linux
Password - 12345678 (sample)


Теперь пришло время тестировать наш почтовый сервер.
Найдите в локальной сети свободный компьютер, настройте сетевые настройки так чтобы он видел почтовый сервер.
Сетевой адрес должен быть в под сети сервера. Не забудьте указать ДНС сервер,  у меня он имеет IP адрес почтового сервера.
Откройте почтовый клиент Outlook, укажите адрес вашего сервера и логин/пароль учетной записи linux@point.ru

SMTP/POP3 server:                        point.ru
Учетная запись (Account name):   linux@point.ru
Пароль (password):                      12345678

Отправьте себе тестовое письмо!

62

да по team viewer?

63 (06.02.2015 16:09:12 отредактировано AlfaStriker)

Да, через личные сообщения отправь ID и пароль.

64

472 619 337
4567

65 (06.02.2015 16:31:47 отредактировано AlfaStriker)

Берик, ты подправь настройки файла /etc/my.cnf на:

[mysqld]
bind-address=0.0.0.0

66

Вообщем заново все настроил. в Postfixadmin заходит но в оутлуке ошибка та же. bind адрес поправил ниче не поменялся.
логи

+ открыть спойлер

2015-02-06 17:44:37 exim 4.80.1 daemon started: pid=1220, -q1h, listening for SMTP on port 25 (IPv6 and IPv4)
2015-02-06 17:53:43 H=localhost (rlufe.kz) [::1] I=[::1]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <roma@rlufe.kz>: failed to expand ACL string "${lookup{$sender$
2015-02-06 17:53:43 SMTP protocol synchronization error (next input sent too soon: pipelining was advertised): rejected "To: roma@rlufe.kz" H=localhost (rlufe.kz) [::$
2015-02-06 17:54:43 exim 4.80.1 daemon started: pid=1236, -q1h, listening for SMTP on port 25 (IPv6 and IPv4)
2015-02-06 17:55:09 H=localhost (rlufe.kz) [::1] I=[::1]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <beka_8-8_beka@mail.ru>: failed to expand ACL string "${lookup$
2015-02-06 17:55:09 SMTP protocol synchronization error (next input sent too soon: pipelining was advertised): rejected "To: beka_8-8_beka@mail.ru" H=localhost (rlufe$
2015-02-06 17:56:27 H=localhost (rlufe.kz) [::1] I=[::1]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <beka_8-8_beka@mail.ru>: failed to expand ACL string "${lookup$
2015-02-06 17:56:27 SMTP protocol synchronization error (next input sent too soon: pipelining was advertised): rejected "To: beka_8-8_beka@mail.ru" H=localhost (rlufe$
2015-02-06 17:58:52 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 17:58:52 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<roma@rlufe.kz> temporarily rejected RCPT <roma@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 17:58:53 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25
2015-02-06 18:00:57 SMTP protocol synchronization error (input sent without waiting for greeting): rejected connection from H=[2.134.186.130] I=[185.5.248.110]:25 inp$
2015-02-06 18:00:57 SMTP protocol synchronization error (input sent without waiting for greeting): rejected connection from H=[2.134.186.130] I=[185.5.248.110]:25 inp$
2015-02-06 18:01:24 auth_login authenticator failed for (qwer) [2.134.186.130] I=[185.5.248.110]:25: 535 Incorrect authentication data (set_id=beka@rlufe.kz)
2015-02-06 18:01:24 auth_login authenticator failed for (qwer) [2.134.186.130] I=[185.5.248.110]:25: 535 Incorrect authentication data (set_id=beka@rlufe.kz)
2015-02-06 18:01:26 auth_login authenticator failed for (qwer) [2.134.186.130] I=[185.5.248.110]:25: 535 Incorrect authentication data (set_id=beka@rlufe.kz)
2015-02-06 18:01:26 auth_login authenticator failed for (qwer) [2.134.186.130] I=[185.5.248.110]:25: 535 Incorrect authentication data (set_id=beka@rlufe.kz)
2015-02-06 18:02:01 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 18:02:01 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <beka@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 18:02:01 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25
2015-02-06 18:02:21 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 18:02:21 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <beka@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 18:02:21 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25
2015-02-06 18:02:41 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 18:02:41 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <beka@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 18:02:41 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25
2015-02-06 18:03:12 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 18:03:12 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <beka@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 18:03:12 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25
2015-02-06 18:03:27 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 18:03:27 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <beka@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 18:03:27 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25
2015-02-06 18:03:41 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 18:03:41 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<roma@rlufe.kz> temporarily rejected RCPT <roma@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 18:03:41 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25
2015-02-06 18:04:18 no IP address found for host 2.134.186.130.megaline.telecom.kz (during SMTP connection from (qwer) [2.134.186.130] I=[185.5.248.110]:25)
2015-02-06 18:04:18 H=(qwer) [2.134.186.130] I=[185.5.248.110]:25 F=<roma@rlufe.kz> temporarily rejected RCPT <roma@rlufe.kz>: failed to expand ACL string "${lookup{$$
2015-02-06 18:04:18 unexpected disconnection while reading SMTP command from (qwer) [2.134.186.130] I=[185.5.248.110]:25

из этого как я понял ACL глючит да? H=localhost (rlufe.kz) [::1] I=[::1]:25 F=<beka@rlufe.kz> temporarily rejected RCPT <roma@rlufe.kz>: failed to expand ACL string "${lookup{$sender$
2015-02-06 17:53:43 SMTP protocol synchronization error (next input sent too soon: pipelining was advertised): rejected "To: roma@rlufe.kz" H=localhost (rlufe.kz) [::$

67

Берик, а почему ставишь на CentOS 6?
Сейчас актуальна новая CentOS 7.
Смысла ставить на CentOS 6 - нет.

68

Вообщем спасибо AlfaStriker-у. но у меня все таки не получился )). И в конце концов поставил почтовый сервер Zimbra. По мне он лучше exim и postfix - a

69 (11.02.2015 04:01:37 отредактировано sotariz)

Доброго времени суток!
Спасибо за отличную статью! Подскажите/пните в нужном направлении:
1.

AlfaStriker пишет:

5. Установка ClamAV
Установим Clamav:
    # yum -y install clamav
    # freshclam -v
    # freshclam -d

установилось, обновилось, последняя команда вывода не дала
далее такое
chkconfig clamav on
ошибка чтения информации о сервисе clamav: Нет такого файла или каталога
2.
в остальном все получилось, но я не могу войти в RoundCube у меня настроена связка nginx + apache, проблема явнов конфигах
может кто-то выложить общий конфиг для этой связки?
мои конфиги
nginx:

server {
    listen 80;
    server_name mail.mysite.com wwww.mail.mysite.com;
    access_log  /var/log/httpd/mail.mysite.com.log combined;
    error_log /var/log/httpd/mail.mysite.com-error.log;

    location ~ /.ht {
        deny all;
    }

    location ~* .(jpg|swf|jpeg|gif|png|css|js|ico)$ {
    root /var/www/html/roundcubemail;
    }

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

##################
#server {
#       listen          80;
#       root            /var/www/html/roundcubemail;
#       index           index.php index.html index.htm;
#       server_name     mail.mysite.com www.mail.mysite.com;
#       access_log      /var/log/httpd/mail.mysite.com.log combined;
#       error_log       /var/log/httpd/mail.mysite.com-error.log;
#
#       location / {
#       root            /var/www/html/roundcubemail;
#       try_files       $uri $uri/ @rewrite;
#       }
#
#       location @rewrite {
#               rewrite ^/(.*)$ /index.php?q=$1;
#       }
#
#       location ~ \.php$ {
#               fastcgi_pass    unix:/var/run/php-fcgi.sock;
#               fastcgi_index   index.php;
#               fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
#               include         fastcgi_params;
#       }
#
#       location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|htm|html|swf|mp3|xml|xml)$ {
#               root    /var/www/html/roundcubemail;
#       }
#}
################## 

httpd

<VirtualHost 127.0.0.1:81>
ServerName mail.mysite.com
ServerAlias www.mysite.com
ServerAdmin webmaster@mail.mysite.com
DocumentRoot /var/www/html/roundcubemail
AddDefaultCharset utf-8
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
Options ExecCGI FollowSymLinks Includes IncludesNOEXEC Indexes MultiViews SymLinksIfOwnerMatch

<Directory /var/www/html/roundcubemail>
AddType application/x-httpd-php .php .php3 .php4 .phtml
# forcing open_base dir do not affect anything
php_admin_value open_basedir /
# AddDefaultCharset UTF-8
AddType text/x-component .htc
<IfModule mod_php4.c>
php_flag display_errors Off
php_flag log_errors On
php_value error_log logs/errors
php_value upload_max_filesize 5M
php_value post_max_size 6M
php_value memory_limit 64M
</IfModule>
<IfModule mod_php5.c>
php_flag display_errors Off
php_flag log_errors On
php_value error_log logs/errors
php_value upload_max_filesize 5M
php_value post_max_size 6M
php_value memory_limit 64M
</IfModule>
<FilesMatch "(\.inc|\~)$">
Order allow,deny
Deny from all
</FilesMatch>
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

после попытки логина на вебморде получаю от nginx 504 Gateway Time-out, увеличив тайм-аут получил сообщение "Неудачное соединение с IMAP сервером"
в логе

2015/02/11 02:31:24 [error] 6553#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: mail.mysite.com, request: "POST / HTTP/1.1", upstream: "http://127.0.0.1:81/", host: "mail.mysite.com", referrer: "http://mail.mysite.com/"

70 (13.02.2015 19:06:47 отредактировано AlfaStriker)

Там ошибки есть, новый Roundcube требует зависимости php-pear-*** и пользоаателя clamav не стало.
А также я не успел вчера тестовое письмо отправить и получить.
Сегодня вечером постараюсь доделать инструкцию.
А так в остальном она почти похожа на первое сообщение из ветки.
---------------
Статус - пока не работает)
--------------
13.02.2014
Теперь работает
Если есть замечания, пишите.

71

Чет я недогоняю...
Roundcube Webmail Installer, Test config
Connecting to ххх.ххх.ххх.ххх...
IMAP connect:  NOT OK(Login failed for sotariz@mysite.com from 127.0.0.1(X-Real-IP: yyy.yyy.yyy.yyy,X-Forwarded-For: yyy.yyy.yyy.yyy). Could not connect to xxx.xxx.xxx.xxx:143: Connection refused)

 Консоль:
iptables -L -nv --line-numbers
Chain INPUT (policy DROP 60 packets, 5587 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       24  6673 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2      595 61920 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  !eth0  *       0.0.0.0/0            0.0.0.0/0           state NEW
4        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
5        0     0 ACCEPT     all  --  !eth0  *       0.0.0.0/0            0.0.0.0/0           state NEW
6        1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
7        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:81
8        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443
9        1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:465
11       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:110
12       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:995
13       1    60 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:143
14       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:993
15      16   920 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
16       0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:25828
17       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 137,138,139,445
18       0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  eth0   eth1    0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     all  --  eth0   tun0    0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  eth1   eth0    0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     all  --  tun0   eth0    0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           udp dpts:33434:33523
6        0     0 REJECT     all  --  eth0   eth1    0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
7        0     0 REJECT     all  --  eth0   tun0    0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable

nmap -p 143 localhost

Starting Nmap 5.51 ( http://nmap.org ) at 2015-02-14 10:50 EET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00012s latency).
PORT    STATE  SERVICE
143/tcp closed imap

это ж как так то?

72 (14.02.2015 12:43:22 отредактировано AlfaStriker)

Видиио не запущен Dovecot. Веб интерфейс Roundcube обращается к Dovecot по протоколу Imap(143 порт).
Сегодня еще раз проверю, может есть ошибка. Или можно посмореть твои конфиги и логи удаленно через TeamViewer. Через личку можешь выслать если что, правда я с ngnix не разу не работал.

73

таки небыл запущен Dovecot, теперь еще есть загвоздка))
при проверке отправки почты

 Консоль:
/var/log/exim/reject.log
2015-02-14 11:40:52 H=(mail.mysite.com) [xxx.xxx.xxx.xxx] I=[192.168.10.139]:25 F=<admin@mysite.com> temporarily rejected RCPT <sotariz@mysite.com>: failed to expand ACL string "${lookup{$sender_host_name}nwildlsearch{black.list}{yes}}": failed to open black.list for linear search: No such file or directory

 Консоль:
/var/log/exim/main.log
2015-02-14 11:45:21 no IP address found for host host-xxx-xxx-xxx-xxx.net.ua (during SMTP connection from (mail.mysite.com) [xxx.xxx.xxx.xxx] I=[192.168.10.139]:25)
2015-02-14 11:45:21 H=(mail.mysite.com) [xxx.xxx.xxx.xxx] I=[192.168.10.139]:25 F=<admin@mysite.com> temporarily rejected RCPT <sotariz@mysite.com>: failed to expand ACL string "${lookup{$sender_host_name}nwildlsearch{black.list}{yes}}": failed to open black.list for linear search: No such file or directory

А сама морда говорит:
Trying to send email...
SMTP send:  NOT OK(Failed to add recipient 'sotariz@mysite.com')

74 (14.02.2015 13:16:26 отредактировано AlfaStriker)

Ну так конфиг Exim надо брать с текущей третей страницы, а не с первой.
В первой был файл black.list, в котором были перечислены динамические адреса сетей, которые я убрал в текущем конфиге для облегчения.

Открой файл /etc/exim/exim.conf и удали строчки:

  deny message          = "You blacklisted"
  condition = ${lookup{$sender_host_name}nwildlsearch{black.list}{yes}}

75 (14.02.2015 14:17:08 отредактировано sotariz)

я брал все с первой т.к. на текущей стр сказанно "для CentOS 7", а у меня 6.6 проморгал вписать путь к blacklist

 Консоль:
Feb 14 13:09:36 myhost dovecot: imap-login: Login: user=<sotariz@mysite.com>, method=CRAM-MD5, rip=xxx.xxx.xxx.xxx, lip=192.168.10.139, mpid=3158
Feb 14 13:09:36 myhost dovecot: imap(sotariz@mysite.com): Disconnected: Logged out bytes=29/399

морда говорит
Неудачная попытка входа

76 (14.02.2015 14:27:53 отредактировано AlfaStriker)

Эти строчки из файла логов /var/log/exim/exim.log ?
Посмотри этот файл, там должно быть написано, почему не работает Exim.

77

блин, не точно составил пост...

 Консоль:
/var/log/maillog
Feb 14 13:35:23 myhost dovecot: imap-login: Login: user=<sotariz@mysite.com>, method=CRAM-MD5, rip=xxx.xxx.xxx.xxx, lip=192.168.10.139, mpid=3424
Feb 14 13:35:23 myhost dovecot: imap(sotariz@mysite.com): Disconnected: Logged out bytes=29/399

это при попытке логина на веб морде

78

Посмотри файлы логов:

/var/log/exim_mainlog
/var/log/exim_rejectlog
/var/log/exim_paniclog

И еще:

/var/log/messages

79

AlfaStriker пишет:

Посмотри файлы логов:

у меня логи только в /var/log/exim/

 Консоль:
ll /var/log/exim/
итого 24
-rw-r----- 1 exim exim 11497 Фев 14 13:35 main.log
-rw-r----- 1 exim exim   657 Фев 14 13:06 panic.log
-rw-r----- 1 exim exim  6564 Фев 14 13:06 reject.log

и все чисто... ругань только в /var/log/maillog

80 (14.02.2015 15:15:42 отредактировано AlfaStriker)

Что-то не вижу прямой ругани.
Посмотри еще логи в папке Apache, там должны быть ошибки Roundcube.
У тебя мелкая ошибка, ее надо найти и исправить.
------------
Или давай я посмотрю удаленно, быстро исправлю тебе ее возможно.

81

Со всем разобрался, все заработало. Начал крутить Fail2Ban - не завелся, покопался и нашел что следует его обновить из другого репозитория. Обновил, заработало. Но он не указывает дату при отсылке письма, как поправить?
Шаблон по умолчанию:

 Консоль:

Date: `date -u +"%%a, %%d %%h %%Y %%T +0000"`

Выполняем это в консоли и получаем %бяку%, что не мудрено
 Консоль:

# date -u +"%%a, %%d %%h %%Y %%T +0000"
%a, %d %h %Y %T +0000

А если исправить на
 Консоль:

Date: `date -u +"%a, %d %h %Y %T +0000"`

то fail2ban отказывается запускаться
Что делать?)

82

Если честно, как работает Фай2бан не проверял. И помочь пока не могу)