вторник, 19 июля 2016 г.

Почтовый сервер Postfix+Dovecot v2, MySQL, Postgrey, ClamAV, Roundcubemail на платформе CentOS версии 6.3 x64

Почтовый сервер Postfix+Dovecot v2, MySQL, Postgrey, ClamAV, Roundcubemail на платформе CentOS версии 6.3 x64

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

В процессе установки и настройки почтовика возникли некоторые "персональные грабли". Поэтому данная статья представляет собой зеркало первоисточника с некоторыми ремарками для самого себя.

Задачи устанавливаемых компонентов сервера:
Postfix -  отправка и получением писем от других почтовых серверов
Dovecot -  доставкой почты от Postfix к почтовым клиентам
MySQL - хранение почтовых даменов, имена почтовых учетных записей, паролей и т.д.
Postgrey - эффективный  спам фильтр
ClamAV и ClamSMTP - антивирус задача которого проверка почтовых сообщений
PostfixAdmin - веб интерфейс для администратора почтового сервера, облегчающий создание доменов и администрирование учетных записей.
RoundCube - веб интерфейс для пользователей почтового сервера
Предварительно необходимо зарегистрировать почтовый домен и получить белый ip у провайдера

1. Настраиваем разрешение имен в  /etc/resolv.conf
nameserver 127.0.0.1        //адрес обратной петли. 
Иногда вместо петли эффективнее указать ip нашего сервера. 
В данном случае для корректной работы Postfix был использован 
реальный ip сетевого интерфейса сервера.nameserver 192.168.1.2nameserver 83.83.1.2        //Первичный DNS провайдера
nameserver 111.222.333.444  //Вторичный DNS провайдера
После изменения resolv.conf необходимо перезапустить службу сети
# service network restart
Проверить разрешение имен можно пропинговав какой-либо интернет-ресурс по имени.
# ping yandex.ru

2. Установка MySQL и создание базы
# yum install mysql mysql-server mysql-devel -y
# chkconfig --level 35 mysqld on
# service mysqld start
Заходим в консоль MySQL для создания почтовой базы "mail":
# mysql -u root -p
mysql>  Enter password: *****
mysql>  CREATE DATABASE mail;
mysql>  GRANT ALL PRIVILEGES ON mail.* TO 'postfix'@'localhost' 
        IDENTIFIED BY 'password';
mysql>  quit
Либо выполняем эту операцию через phpMyAdmin

3. Установка и настройка Postfix
# yum install postfix pam  mod_ssl  openssl crypto-utils mc system-config-firewall-tui setuptool wget -y
На всякие пожарные, сохраним оригинальный конфиг файл:
# mv /etc/postfix/main.cf /etc/postfix/main.cf.original
Создадим свой:
soft_bounce = no
queue_directory = /var/spool/postfix
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
default_privs = nobody
inet_interfaces = all
myhostname = mx.point.chita.ru
mydomain = point.chita.ru
myorigin = $mydomain
mydestination = $myhostname,localhost.$myhostname,localhost
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
relay_domains =
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mail_spool_directory = /var/mail
smtpd_banner = $myhostname ESMTP
debug_peer_level = 2
debug_peer_list = 127.0.0.1
debugger_command = 
    PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
    xxgdb $daemon_directory/$process_name $process_id & sleep 5 
sendmail_path = /usr/sbin/sendmail
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/local/man
config_directory = /etc/postfix

Этот листинг содержит базовые настройки для запуска Postfix. В нем нам интересны такие настройки как debug_peer_level  и   debug_peer_list. Эти строчки отвечают за логирование SMTP сессий.
Первая debug_peer_level отвечает за уровень логирования, а вторая строчка указывает с каких хостов и сетей должны попадать логи.
Для примера, можно ввести адреса серверов популярных почтовых сервисов:
debug_peer_level = 2
debug_peer_list =  yandex.ru, mail.ru pochta.ru 10.10.10.23/32 10.10.10.0/24

Хосты и сети можно перечислять через пробелы и знака запятой.
Если будут проблемы, вас спасет это debug режим.
Примечание:  При составлении Postfix конфига, важно соблюдать отступы в два пробела в некоторых местах.
Откроем опять главный конфиг файл:
# vi /etc/postfix/main.cf
И добавим текст:
virtual_mailbox_domains = mysql:$config_directory/sql/vdomains.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = mysql:$config_directory/sql/vmailbox.cf
virtual_alias_maps = mysql:$config_directory/sql/valias.cf
virtual_minimum_uid = 1150
virtual_uid_maps = static:1150
virtual_gid_maps = static:12
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/private/dovecot-auth

В этом листинг важно выставить идентификаторы пользователя, под которым будет работать Postfix. Если пользователь создан, ID  можно взять с файла /etc/passwd, а ID группы хранится в  /etc/groups. Так как у нас нет пользователя vmail, создадим его:
# useradd -r -u 1150 -g mail -d /var/vmail -s /sbin/nologin -c Virtual vmail
Мы создали нового пользователя vmail c идентификатором ID - 1150, добавили его в группу mail (GID - 12). Пользователь имеет право на папку /var/vmail, при этом он больше ни где не используется. Авторизация в системе ему запрещена (nologin).
# mkdir -p -v /var/vmail
# chmod 770 -R /var/vmail
# chown vmail:mail /var/vmail
Для корректной работы создали каталог почтовых сообщений /var/vmail, куда будет попадать почтовая переписка.
Для обеспечения работы почтовика необходимо настроить iptables, либо если это позволяют условия безопасности на период отладки почтовика отключить firewall:
# setup
Firewall Configuration -> Firewall Enabled -> Убираем галочку
Здесь мы отключи встроенную цепочку правил фаерволла (RH-Input)
Отключаем SELINUX:
# vi /etc/selinux/config
Находим строчку:
SELINUX=enforcing
Приводим ее к виду:
SELINUX=disabled

Встроенная цепочка и SELINUX  иногда мешают нормальной работе программ.  Поэтому мы отключили их.
Теперь запретим нашему серверу быть открытым Релеем, допишем:
# vi /etc/postfix/main.cf
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
                               reject_unauth_destination,
Пишем все параметры smtpd_recipient_restrictions в одну строку, иначе получим ошибку.

Создадим дополнительные конфигурационные файлы, которые указаны в /etc/postfix/main.cf, эти файлы отвечают за обращение к базе данных MySQL:
# mkdir /etc/postfix/sql
# vi /etc/postfix/sql/vdomains.cf
user = postfix
password = password
hosts = localhost
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

# vi /etc/postfix/sql/vmailbox.cf
user = postfix
password = password
hosts = localhost
dbname = mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'

# vi /etc/postfix/sql/valias.cf
user = postfix
password = password
hosts = localhost
dbname     = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'

4. Установка и настройка Dovecot
# yum install dovecot dovecot-mysql -y
Чтобы Dovecot служил локальным транспортом, допишем следующие строчки в /etc/postfix/master.cf
# vi /etc/postfix/master.cf
dovecot    unix    -    n    n    -    -    pipe
      flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient)
Добавим в конец файла main.cf  в список значений параметра 'smtpd_recipient_restrictions = ' следующие значения:
# vi /etc/postfix/main.cf
    reject_non_fqdn_recipient, 
    reject_unverified_recipient, 
    reject_rbl_client cbl.abuseat.org, 
    reject_rbl_client dialups.mail-abuse.org, 
    permit

Опять таки пишем все параметры smtpd_recipient_restrictions в одну строку, иначе получим ошибку.
Здесь мы задали дополнительные проверки.
Они дополнят наши до этого внесенные настройки, получится так:
smtpd_recipient_restrictions = permit_mynetworks,
                               permit_sasl_authenticated,
                               reject_unauth_destination,
                               reject_non_fqdn_recipient,
                               reject_unverified_recipient,
                               reject_rbl_client cbl.abuseat.org,
                               reject_rbl_client dialups.mail-abuse.org,
                               permit

Сохраним оригинальный конфиг файл dovecot.conf
# mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
Создаем файл /etc/dovecot/dovecot.conf
# vi /etc/dovecot/dovecot.conf
Вставим туда следующие настройки:
# 2.0.9: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-220.7.1.el6.i686 i686 CentOS release 6.2 (Final) ext4
auth_debug = yes
auth_debug_passwords = yes
auth_mechanisms = plain login cram-md5
auth_verbose = yes
base_dir = /var/run/dovecot/
disable_plaintext_auth = no
log_path = /var/log/dovecot
ssl = no
first_valid_uid = 1150
last_valid_uid = 1150
log_timestamp = %Y-%m-%d %H:%M:%S
mail_debug = yes
mail_location = maildir:/var/vmail/%d/%u
passdb {
args = /etc/dovecot/dovecot-sql.conf
driver = sql
}
protocols = imap pop3
service auth {
unix_listener /var/spool/postfix/private/dovecot-auth {
user = postfix
group = postfix
mode = 0660
}
unix_listener auth-master {
user = vmail
group = mail
mode = 0660
}
unix_listener auth-userdb {
user = vmail
group = mail
mode = 0660
}
#user=root
}
service imap-login {
executable = /usr/libexec/dovecot/imap-login
inet_listener imap {
address = *
port = 143
}
}
service imap {
executable = /usr/libexec/dovecot/imap
}
service pop3-login {
executable = /usr/libexec/dovecot/pop3-login
inet_listener pop3 {
address = *
port = 110
}
}
service pop3 {
executable = /usr/libexec/dovecot/pop3
}
userdb {
args = /etc/dovecot/dovecot-sql.conf
driver = sql
} 
protocol lda {
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = 
 admin@point.chita.ru
}

Теперь создаем файл /etc/dovecot/dovecot-sql.conf
# vi /etc/dovecot/dovecot-sql.conf
В файл пишем следующие строки:
driver = mysql
connect = host=localhost dbname=mail user=postfix password=password
default_pass_scheme = CRAM-MD5
user_query = SELECT '/var/vmail/%d/%n' as home, 
            'maildir:/var/vmail/%d/%n'as mail, 
             1150 AS uid, 12 AS gid, concat('dirsize:storage=', 
             quota) AS quota FROM mailbox 
             WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password, 
                 '/var/vmail/%d/%n' as userdb_home,
                 'maildir:/var/vmail/%d/%n' as userdb_mail, 
                 1150 as userdb_uid, 
                 12 asuserdb_gid FROM mailbox 
                 WHERE username = '%u' AND active = '1'

Внимание! Все аргументы пишем в одну строку.

5. Установка Postgrey
Подключим необходимый репозитарий:
Теперь установим Postgrey:
# yum install postgrey -y
После установки нам нужно дописать всего 1 строчку в главный конфигурационный файл main.cf, чтобы postfix подружился со спам фильтром postgrey. Открываем файл - /etc/postfix/main.cf и делаем соответствующие изменения:
# vi /etc/postfix/main.cf
smtpd_recipient_restrictions = permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    check_policy_service unix:/var/spool/postfix/postgrey/socket,
    reject_non_fqdn_recipient,
    reject_unverified_recipient,
    reject_rbl_client cbl.abuseat.org,
    reject_rbl_client dialups.mail-abuse.org,
    permit

И опять-таки все в одну строку. Здесь приведено в таком виде для удобства просмотра.
Примечание: строчка “check_policy_service unix …” должна быть обязательно прописана после строчки параметра
“reject_unauth_destination”, как на примере выше.
После рестарта postfix мы должны увидеть открытый socket и лог-файл работы postgrey в каталоге
/var/spool/postfix/postgrey/

6. Установка ClamAV
# yum remove rpmforge-release -y
# yum install clamav clamav-server clamsmtp –y
Обновляем базы:
freshclam -v
Устанавливаем автообновление баз:
freshclam -d
# mv /etc/clamsmtpd.conf /etc/clamsmtpd.conf.orig
# vi /etc/clamsmtpd.conf
OutAddress: 10026
        TimeOut: 180
        KeepAlives: 0
        XClient: on
        Listen: 127.0.0.1:10025
        ClamAddress: /var/run/clamav/clamd.sock
        Header: X-Virus-Scanned: ClamAV using ClamSMTP
        TempDirectory: /var/tmp
        Action: drop 
        Quarantine: on
        User: clam
Умолчательно владельцем приведенных ниже каталогов является clamsmtp.mail . Меняем владельца:
# chown clam:mail -R /var/run/clamd.clamsmtp/
# chown clam:clam -R /var/lib/clamd.clamsmtp
Добавляем в main.cf строчки:
# vi /etc/postfix/main.cf
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings
Добавляем в master.cf строчки:
# vi /etc/postfix/master.cf
scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes
Добавляем ниже приведенный конфиг в master.cf:
# vi /etc/postfix/master.cf
127.0.0.1:10026 inet n - n - 16 smtpd
  -o content_filter=
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks_style=host
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
   

7. Установка PostfixAdmin и Apache
Установим зависимости для Postfixadmin:
# yum -y install httpd php php-imap php-mbstring php-common php-pdo php-mysql php-cli
Если какие-либо из этих пакетов не были установлены, после установки необходимо перезапустить apache. Иначе PostfixAdmin их не увидит.
# service httpd restart
#######################
Измените в конфиге строки:
cat /etc/dovecot/dovecot.conf | grep cram-md5
с
auth_mechanisms = plain login cram-md5
на
auth_mechanisms = cram-md5
#######################
Скачаем Postfixadmin и настроим его:
# cd /var/www/html
# tar -xvzf postfixadmin-2.3.6.tar.gz
# mv postfixadmin-2.3.6/ postfixadmin
# cd  postfixadmin
# vi /var/www/html/postfixadmin/config.inc.php
В этом файле находим строчки которые внизу и меняем их значение на следующие:
$CONF['configured'] = true;
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'password';
$CONF['database_name'] = 'mail';
$CONF['encrypt'] = 'dovecot:CRAM-MD5';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";
$CONF['emailcheck_resolve_domain']='YES';

Будте внимательны! Параметр $CONF['dovecotpw'] уже присутствует, но обратите внимание, необходимо изменить:
с
$CONF['dovecotpw'] = "/usr/sbin/dovecotpw";
на
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";
В противном случае получите ошибку:
can't encrypt password with dovecotpw, see error log for details
Ставим все службы в автозагрузку:
# chkconfig --level 35 mysqld on
# chkconfig --level 35 dovecot on
# chkconfig --level 35 postfix on
# chkconfig --level 35 httpd on
# chkconfig --level 35 postgrey on
# chkconfig --level 35 clamd on
# chkconfig --level 35 clamsmtpd on
# chkconfig --level 35 saslauthd on



8. Настройка DNS сервера
Для того чтобы протестировать почтовый сервер, установите пакет Bind. Установка Bind  позволить настроить DNS сервер. После установки Bind, станет доступна служба named - отвечающая за функции DNS сервера.
И так, первым делом еще раз проверяем наш файл /etc/resolv.conf:
search point.chita.ru
nameserver 127.0.0.1       
nameserver 192.168.1.2nameserver 83.83.1.2        //Первичный DNS провайдера
nameserver 111.222.333.444  //Вторичный DNS провайдера

Мы вписали в этот файл два DNS сервера. Первый адрес - это будет наш сервер DNS сервер, второй адрес - провайдерский DNS.
Если у вас есть купленное доменное  имя - "company.ru" и два DNS сервера хостера/провайдера, то данный пункт по настройке DNS сервера - можно пропустить!  Вписав в файл /etc/resolv.conf - IP адреса вашего провайдера. Провайдерские DNS в свою очередь обратятся к DNS серверам вашего хостера. Тем самым обеспечивая работу вашего домена.
После наших изменений в файле - /etc/resolv.conf, данные о зоне "point.local" будут браться из нашего DNS сервера с IP адресом 192.168.1.2. Другие запросы будут разрешатся через DNS сервер провайдера.
Наш почтовый сервер имеет следующий IP адрес 192.168.1.2, он еще у нас должен быть и DNS сервером. Теперь самое главное, установим пакет Bind:
# yum install bind -y
Впишем имя хоста:
# vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
#HOSTNAME=mx.point.chita.ru
HOSTNAME=servername.mydomain.chita.ru

# vi /etc/hosts
192.168.1.2 servername.mydomain.chita.ru mx.mydomain.chita.ru mx
останавливаем и убираем из автозагрузки Network Manager (NM):
# service NetworkManager stop
# chkconfig NetworkManager off
# yum remove dnsmasq -y
# service network restart

Сохраняем на всякие пожарные основной конфигурационный файл демона "named":
# mv /etc/named.conf /etc/named.conf.orig
Создаем чистый конфиг файл следующего содержания (проверить наличие симлмнка этого файла в /var/named/named.conf):
#mcedit /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 { any; };
        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; }; # меняем, даем обращатся всем
        allow-query-cache { localhost; 192.168.1.0/24; }; 
        # меняем, добавляем локальную сеть если она есть
        allow-recursion { localhost; 192.168.1.0/24;}; 
        # меняем, добавляем локальную сеть если она есть
        recursion yes;  # возможно излишне  
        forwarders { 111.222.333.444; 444.555.666.777; }; 
        # добавляем, ip dns провайдера
        dnssec-enable no;
        dnssec-validation no;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */

        bindkeys-file "/etc/named.iscdlv.key";
};

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

zone "." IN {
        type hint;
        file "named.ca";
};
// back view for 127.0.0.1
zone "0.0.127.in-addr.arpa" IN {
 type master;
 file "localhost.rev";
 allow-update { none; };
};

# Зона прямого просмотра "mydomain.chita.ru"
zone "mydomain.chita.ru" IN {
 type master;
 file "mydomain.chita.ru.zone";
 allow-update {192.168.1.2; };
 allow-transfer {192.168.1.50; }; //вторичный DNS
};

# Наша обратная зона просмотра "mydomain.chita"
zone "1.168.192.in-addr.arpa" IN {
 type master;
 file "mydomain.chita.ru.rev";
 allow-update {192.168.1.2; };
 allow-transfer {192.168.1.50; };
};

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

Файлы 4-х описанных в named.conf зон:
Прямая зона named.ca - оставил без изменения, т.е. таким, какой он есть в составе дистрибутива ОС.
Обратная зона localhost.rev :
$TTL    86400
@        IN SOA    servername.mydomain.chita.ru.       root.mydomain.chita.ru. (
 42        ; serial (d. adams)
 3H        ; refresh
 15M        ; retry
 1W        ; expiry
 1D )        ; minimum

 IN NS        servername.mydomain.chita.ru.
 IN PTR        localhost.mydomain.chita.ru.

Прямая зона mydomain.chita.ru.zone
# vi /var/named/mydomain.chita.ru.zone
$TTL    86400
@ IN    SOA    servername.mydomain.chita.ru. root.mydomain.chita.ru. (
2013120101 ; Serial
28800      ; Refresh
14400      ; Retry
3600000    ; Expire
86400      ; Ncache
)
@    IN     NS     servername.mydomain.chita.ru.
@    IN     MX    10     mail.mydomain.chita.ru.

mx.mydomain.chita.ru.    IN    A    192.168.1.100
A    192.168.1.100  
main        A     192.168.1.100
mail    IN    A    192.168.1.100
www    IN    A    192.168.1.100
papa        A     192.168.1.21

Обратная зона mydomain.chita.ru.rev
# vi /var/named/mydomain.chita.ru.rev
$TTL 86400
@      IN SOA    servername.mydomain.chita.ru.    root.mydomain.chita.ru. (
2013101102 ; Serial
28800      ; Refresh
14400      ; Retry
3600000    ; Expire
86400      ; Minimum
)
@    IN      NS    servername.mydomain.chita.ru.
@    IN      PTR    mx.mydomain.chita.ru.
100.1.168.192 IN    PTR     servername.mydomain.chita.ru.

0/24    NS        servername.mydomain.chita.ru.
100    IN    PTR    servername.mydomain.chita.ru.
21    IN    PTR    papa.mydomain.chita.ru.
0     IN    PTR     mydomain.chita.ru.

Перестартуем сервер имен и вносим его в автозапуск:
# service named start
# chkconfig --level 35 named on
Проверка работы DNS:
[root@servername /]# nslookup mx.mydomain.chita.ru
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   mx.mydomain.chita.ru
Address: 192.168.1.100
[root@servername /]# nslookup 192.168.1.100
Server:         127.0.0.1
Address:        127.0.0.1#53

100.1.168.192.in-addr.arpa      name = servername.mydomain.chita.ru.
[root@servername cron.daily]# nslookup -type=MX mydomain.chita.ru
Server:         127.0.0.1
Address:        127.0.0.1#53

maidomain.chita.ru mail exchanger = 10 mail.mydomain.chita.ru.

[root@servername cron.daily]# hostname -f
servername
[root@servername cron.daily]#

Внимание! На моем сервере сервис named периодически (раз в несколько дней) "сваливается". Он не умирает, у него нормальный статус:
[root@servername /]# service named status
version: 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6
CPUs found: 4
..........................
server is up and running
named (pid  22049) выполняется...
[root@servername /]#
Но при попытке разрешения имен получаю следующее:
[root@servername /]# nslookup mx.mydomain.chita.ru
Server:         8.8.8.1              
Address:        8.8.8.1#53          

** server can't find mx.mydomain.chita.ru: NXDOMAIN

[root@main /]# nslookup 192.168.1.100
Server:         8.8.8.1
Address:        8.8.8.1#53

** server can't find 100.1.168.192.in-addr.arpa.: NXDOMAIN
Где 8.8.81 - DNS-сервер моего провайдера.
Перестартую сервер имен:
[root@servername /]# service named restart
Останавливается named:                                     [  OK  ]
Запускается named:                                         [  OK  ]
И после рестарта он начинает нормально разрешать имена и прямой и обратной зоны как на листингах приведенных выше.
Ввиду нехватки времени причину такого "поведения" не установил. Внес в ежесуточный cron-daily задачу по рестарту named.

9. Настройка PostfixAdmin
Веб интерфейс PostfixAdmin позволит управлять вашим почтовым сервером. Добавление новых обслуживаемых доменов и почтовых ящиков производится в нем.
Настроим его загрузив веб страницу PostfixAdmin, для этого запустите браузер и введите веб адресhttp://127.0.0.1/postfixadmin/setup.php
В окошке Change setup password введите свой пароль. Запомните его, он нам пригодится в дальнейшем.
Во втором окошке появится HASH нашего пароля (шифрованный пароль). Скопируйте эту "белеберду" в буфер.
После того как вы скопировали "hash" в буфер обмена, его нужно вставить в файл:
/var/www/html/postfixadmin/config.inc.php
Откройте этот файл и найдите в нем строчку:
$CONF['setup_password'] = 'changeme';
Вместо "changeme" ставим наш hash который скопировали в буфер. Получится так:
$CONF['setup_password'] = 
           '6c5af4c72af213f0acac5f21d8f95ca1:e59172283d2bb72a5992af8ddc15332cde62f003';
И еще поставьте YES здесь:
$CONF['emailcheck_resolve_domain']='YES';
Сохраните файл.
Зайдите еще раз на страничку: http://127.0.0.1/postfixadmin/setup.php
Создайте учетку Админа, например " administrator@mydomain.chita.ru", определите его пароль.
Нажмите на кнопке "Add Admin", появится надпись:
Admin has been added!
(
 administrator@mydomain.chita.ru)
В моем случае postfixadmin очень долго тупил и когда я уже решил, что где-то ошибка, он наконец выдал сообщение указанное выше.
Запомните адрес админа и пароль.
Теперь уже заходим на страничку http://127.0.0.1/postfixadmin/
Вводим почтовый адрес админа и пароль.

Добавляем домен "point.local":  Domain List - > New Domain -> point.local
Aliases - Ставим 0
Mailboxes - Ставим 0
Add default mail aliases - Галочка
После появится надпись:
Domain has been added!
(mydomain.chita.ru)
Создадим первый почтовый ящик, я создал " galia@mydomain.chita.ru".
Меню Virtual List -> Add MailBox ->
Username - galia
Password - 123 (sample)

Ну все!
Теперь пришло время тестировать наш почтовый сервер.

Найдите в локальной сети свободный компьютер, настройте сетевые настройки так чтобы он видел почтовый сервер.
Сетевой адрес должен быть в под сети сервера. Не забудьте указать ДНС сервер,  у меня он имеет IP адрес почтового сервера.
Откройте почтовый клиент Outlook, укажите адрес вашего сервера и логин/пароль учетной записиgalia@mydomain.chita.ru
SMTP/POP3 server:                        mx.mydomain.chita.ru
Учетная запись (Account name):   galia@mydomain.chita.ru
Пароль (password):                      123
Примечание: Не забудьте настроить SMTP авторизацию.

Отправьте себе тестовое письмо!
В моем случае отправка и получение писем через почтовые web-клиенты прошла удачно. Письма с mail.ru на mydomain.chita.ru и обратно ходили без замечаний. А вот с почтовым клиентом The Bat! дело не заладилось.
Отправку писем настроил так:
Включил "Аутентификация SMTP"  и указал в качестве имени пользователя его полный почтовый адрес - galia@mydomain.chita.ru и соответственно пароль.  Почта уходит. Пробовал дополнительно поставить галочку "Требовать безопасную MD5 аутентивикацию" - почта так же уходит успешно и успешно принимается адресатом.
Без включенной аутентификации SMTP почта не уходи - The Bat выдает сообщение об ошибке аутентификации.
А вот прием почты не заработал.
Какие бы параметры POP, IMAP и режимы аутентификации я не выставлял - результат один:
FETCH: - Сервер сообщает об ошибке ERR: Authentication failed
На сервере в лога /'var/log/dovecot вижу следующее:
2014-02-16 14:18:15auth: Info: mysql: Connected to localhost (mail)
2014-02-16 14:18:15auth: Debug: sql(galia,192.168.1.2): query: SELECT username as user, password, '/var/vmail//galia' as userdb_home, 'maildir:/var/vmail//galia' as userdb_mail, 1150 as userdb_uid, 12 asuserdb_gid FROM mailbox WHERE username = 'galia' AND active = '1'
2014-02-16 14:18:15auth: Info: sql(galia,192.168.1.2): unknown user
2014-02-16 14:18:17auth: Debug: client out: FAIL        1       user=galia
2014-02-16 14:18:20pop3-login: Info: Disconnected (auth failed, 1 attempts): user=<pavlov>, method=PLAIN, rip=192.168.1.2, lip=192.168.1.100

Из лога видно, что dovecot ищет почтовый ящик по следующему пути: '/var/vmail//galia' . Однако, вследствие того что у нас мультидоменный сервер, ящик находится здесь:  '/var/vmail/mydomain.chita.ru/galia'. То есть сервер не получает имя домена и его пустое значение заключено между двумя слэшами перед именем пользователя.
И вот здесь я вижу что прсто протупил: в клиенте The Bat! в настройках отправки почты указал полное доменное имя пользователя, а в получении почты только непосредственно имя: galia. После того как заменил его на полное доменное galia@mydomain.chita.ru получение почты прошло удачно. Тип аутентификации указывал MD5 CRAM :
2014-02-16 14:45:59pop3( galia@mydomain.chita.ru): Debug: maildir++: root=/var/vmail/mydomain.chita.ru/galia, index=, control=, inbox=/var/vmail/mydomain.chita.ru/galia
2014-02-16 14:45:59pop3( galia@mydomain.chita.ru): Info: Disconnected: Logged out top=0/0, retr=0/0, del=0/56, size=3895050
Проверка почтовой пересылки завершена.

10. Установка и настройка RoundCube Web Mail
На данном этапе у нас есть удобный веб интерфейс для администратора почтового сервера, но нет веб интерфейса для пользователей. Этот досадное недоразумение решается установкой RoundCube:
# yum install php php-xml php-mcrypt php-intl php-sqlite php-pgsql
# cd /var/www/html
# tar xvfz roundcubemail-0.9.4.tar.gz
# mv roundcubemail-0.9.4 roundcube
Cоздаем файл roundcube.conf:
# 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>

Далее создаем базу данных и пользователя:
# mysqladmin -p create roundcubemail
# mysql -p
mysql> GRANT ALL ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password';
mysql> quit
# service httpd restart
# 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/Yakutsk

Далее  идем по адресу http://127.0.0.1/roundcube/installer/ и  устанавливаем по умолчанию, не меняя никаких настроек, кроме двух полей,  где нужно указать название базы данных и пароль. В нашем случае  название базы будет "roundcubemail", а пароль указанный ранее 'password'.
А также следует включить опцию 'htmleditor' в 'always'.
Первым шагом установщик проверяет окружение на предмет удовлетворения зависимостей. В моем случае неудовлетворенными оказались следующие:
........................
OpenSSL:  OK
Mcrypt:  NOT AVAILABLE(Could be loaded. Please add in php.ini;
               See http://www.php.net/manual/en/book.mcrypt.php)
SQLite (v2):  NOT AVAILABLE(See http://www.php.net/manual/en/ref.pdo-sqlite.php)
SQL Server (SQLSRV):  NOT AVAILABLE
(See http://www.php.net/manual/en/ref.pdo-sqlsrv.php)
SQL Server (DBLIB):  NOT AVAILABLE

Библиотека Mcrypt позволяет выполнить высокоуровневое шифрование. Устанавливаем php-mcrypt из репозитория rpmforge:
#yum install php-mcrypt
Перезагружаем веб-сервер apache:
service httpd restart
Возвращаемя на страницу инсталляции Roundcube Webmail (http://localhost/roundcubemail/installer), обновляем и видим все то же сообщение.
Проверяем наличие загруженной библиотеки mcrypt с помощью
php -r 'phpinfo();' |grep mcrypt
Вывод даёт нам понять, что у нас не все в порядке:
PHP Warning:
PHP Startup: Unable to load dynamic library
‘/usr/lib64/php/modules/module.so’ — /usr/lib64/php/modules/module.so:
cannot open shared object file: No such file or directory in Unknown on line 0
/etc/php.d/mcrypt.ini,
Задаемся вопросом причем здесь  module.so? Проверяем, какие файлы нам проставил пакет php-mcrypt :
# rpm -ql php-mcrypt
/etc/php.d/mcrypt.ini
/usr/lib64/php/modules/mcrypt.so
Значит отредактируем неверную запись в файле /etc/php.d/mcrypt.ini. Действительно, там написано неверно:
# cat /etc/php.d/mcrypt.ini
; Enable mcrypt extension module
extension=module.so
Правим неверную запись на верную:
$ cat /etc/php.d/mcrypt.ini
; Enable mcrypt extension module
extension=mcrypt.so
Перезагружаем апач:
service httpd restart
Заново проверяем наличие загруженной библиотеки mcrypt:
[root@servername]# php -r 'phpinfo();' | grep mcrypt
PHP Warning:  Module 'gd' already loaded in Unknown on line 0
PHP Warning:  Module 'sqlite3' already loaded in Unknown on line 0
/etc/php.d/mcrypt.ini,
Registered Stream Filters => zlib.*, bzip2.*, convert.iconv.*,
string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*,
consumed, dechunk, mcrypt.*, mdecrypt.*
mcrypt
mcrypt support => enabled
mcrypt_filter support => enabled
mcrypt.algorithms_dir => no value => no value
mcrypt.modes_dir => no value => no value
[root@main log]#

Опять таки проверяем ситуацию на странице инсталляции Roundcube Webmail:

..................
OpenSSL:  OK
Mcrypt:  OK
Intl:  OK
Exif:  OK
Сообщения об ошибке sqlite решил проигнорировать, потому что, во-первых, подключена уже 3-я версия sqlite и возможно roundcube просто тупо не знает об этом и ищет вторую:
#cat /etc/php.ini | grep sqlite
extension=sqlite3.so
во-вторых, мы будем работать с mysql, а не sqlite.
По окончании установки веб интерфейса, Вам будет предложено скачать и сохранить два конфигурационных файла:
1. db.inc.php
2. main.inc.php
Эти два файла требуется переместить в папку:
/var/www/html/roundcube/config/

Далее открываем файл /var/www/html/roundcube/config/main.inc.php и в нем меняем алгоритм по умолчанию на:
# vi /var/www/html/roundcube/config/main.inc.php

$rcmail_config['imap_auth_type'] = cram-md5;
А также ставим IP адрес своего почтового хоста здесь:
$rcmail_config['default_host'] = '192.168.1.100';
Если пароль к базе Roundcube был введен с ошибкой, его можно сменить в файле
# vi /var/www/html/roundcube/config/db.inc.php
$rcmail_config['db_dsnw'] = 'mysql://roundcube:password@localhost/roundcubemail';
Здесь:
roundcube - имя пользователя базы roundcubemail
password - пароль доступа к базе
roundcubemail - сама база веб Интерфейса RoundCube
Это так же был мой случай. В веб-интерфейсе инсталляции RoundCube получил следующее сообщение:
Test IMAP config
Connecting to localhost...
IMAP connect: 
NOT OK(Login failed for roundcube from 192.168.1.100. AUTHENTICATE CRAM-MD5:
A0001 NO [UNAVAILABLE] Temporary authentication failure.)
Кнопка инициализации отсутствует.
Соответственно поправил пароль в файле  /var/www/html/roundcube/config/db.inc.php как описано выше.
Появилась кнопка инициализации! Жмем 'Inizialize Database' :
Check DB config
DSN (write):  OK
DB Schema:  OK
DB Write:  OK
DB Time:  OK
Test SMTP config
Server: PHP mail()
Port: 25
Trying to send email...
SMTP send:  OK
TTest IMAP config
Connecting to localhost...
IMAP connect: 
NOT OK(Login failed for roundcube from 192.168.1.100. AUTHENTICATE CRAM-MD5:
A0001 NO [AUTHENTICATIONFAILED] Authentication failed.)

Аутентификация IMAP не прошла, но регистрация в интерфейсе roundcube и пересылка почты проходят.
Если все прошло успешно, удаляем директорию установщика в целях безопасности.
# rm -R -f /var/www/html/roundcube/installer
Пытаемся зайти с Веб интерфейса, в браузере вводим адрес:
http://mydomain.chita.ru/roundcube
Будет выведено окошко, где надо указать:
- логин
- пароль
- сервер
Вводим например:
- логин: user@mydomain.chita.ru
- пароль: 123456
- сервер: point.local
Логин вводим как полное даменное имя даже если у нас заведен всего один домен.

11. Настройка фаерволла iptables
Создаем файл с правилами фаерволла. Я этот шаг пропустил так как мой 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

12. Установка Fail2Ban
На сервер часто ломятся разные роботы (боты), подбирая пароли и логины. Логи почтовой системы от этих ботов растут, и самое главное в конце концов не исключено что, бот подберет правильную пару логин/пароль. Утилита Fail2Ban помогает утихомирить ботов, блокируя через iptables ip адреса хостов ботов.
# yum install fail2ban -y
# vi /etc/fail2ban/jail.conf
Добавляем в конец файла:
[postfix-banhammer]
enabled  = true
filter   = postfix
action   = iptables-multiport-tcp[name=PFIX, port="smtp", protocol=tcp]
logpath  = /var/log/maillog
maxretry = 3
bantime  = 7200

[dovecot-banhammer]
enabled  = true
filter   = dovecot
action   = iptables-multiport-tcp[name=DCOT, port="pop3,imap", protocol=tcp]
logpath  = /var/log/maillog
findtime = 300
maxretry = 10
bantime  = 1800

[sasl-banhammer]
enabled  = true
filter   = sasl
action   = iptables-multiport-tcp[name=SASL, port="smtp", protocol=tcp]
logpath  = /var/log/maillog
findtime = 300
maxretry = 10
bantime  = 1800
# chkconfig fail2ban on
# service fail2ban start

Почтовый сервер готов. Все настройки завершены.

Комментариев нет: