Почтовый сервер Postfix на CentOS 6.4 x32

pligin

Команда форума
Администратор
Установка и настройка почтового сервера на основе Postfix в CentOS 6.4 x32 (CentOS 6.3 x32)

В данном посте описан процесс установки почтового сервера на основе MTA Postfix. В качестве платформы будет использована CentOS версии 6.3 x32.
Для полноценной работы понадобятся дополнительные пакеты, такие как: Dovecot v2, MySQL, Postgrey, ClamAV.

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

Плохим тоном считается, использования публичных почтовых служб. У клиентов такой компании, да и у партнеров может сложится плохое впечатление о фирме, если они увидят адрес известного почтового сервера (mail.ru, yandex.ru, gmail.com и т.д.)

Преимущества Postfix как агента передачи следующие:

  • Быстрый и безопасный
  • Модульная архитектура
  • Бесплатный
Минусы:

  • Сложная установка и настройка по сравнению с Windows решениями.
  • Требуется знать основы Linux
Давайте разберем зачем нам столько пакетов и зачем они используются:

  • Postfix — будет заниматься отправкой и получением писем от других почтовых серверов (MTA — Mail Transfer Agent / почтовый агент пересылки )
  • Dovecot — занимается доставкой почты от Postfix к почтовым клиентам (MDA — mail delivery agent / почтовый агент доставки)
  • MySQL — в базе MySQL будут содержаться такие данные как наш домен company.kz, имена почтовых учетных записей, пароли и т.д.
  • Postgrey — эффективный спам фильтр, который будет отсеивать спам не создавая большой вычислительной нагрузки на сервер.
  • ClamAV и ClamSMTP — это антивирус задача которого проверка почтовых сообщений на предмет вирусов
  • PostfixAdmin — веб интерфейс для администратора почтового сервера который позволяет управлять почтовым сервером, такие операции как заведение доменов, почтовых учетный записей, смена паролей производятся именно в нем.
  • RoundCube — веб интерфейс для пользователей почтового сервера, этот интерфейс позволяет работать с почтовым ящиком. Пользователь в нем просматривает почтовые сообщения, отправлять письма и т.д.
Если Вы хотите реальный почтовый сервер, Вам понадобится:

  • Белый статический IP адрес. Обычно эти IP адреса выдает провайдер.
  • Зарегистрированное доменное имя — company.ru. Можете воспользоватся любым регистратором, например www.reg.ru
  • Два DNS сервера которые будут отвечать за домен — company.ru. Бывает так, что после регистрации домена регистратор дает свои DNS сервера в пользование. Можно уговорить провайдера поддерживать Ваш домен, а можно настроить свои DNS сервера
  • PTR запись которая правильно резолвит Ваш почтовый хост (111.222.333.444 -> mail.company.ru). Обычно PTR запись прописывает провайдер, поэтому админ обращается к провайдеру с запросом занести PTR запись вида — IP адрес -> mail.company.ru


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

  1. Настройка сетевого адаптера
  2. Установка MySQL и создание базы
  3. Установка и настройка Postfix
  4. Установка и настройка Dovecot
  5. Установка Postgrey
  6. Установка ClamAV
  7. Установка PostfixAdmin и Apache
  8. Настройка DNS сервера
  9. Настройка PostfixAdmin
  10. Установка и настройка RoundCube Web Mail
  11. Настройка фаерволла iptables
  12. Установка Fail2Ban


Домен:
point.local
Имя хоста почтового сервера:
mx.point.local
IP адрес почтового сервера:
192.168.1.2

Если у вас другой домен и имя хоста, а также IP адрес сервера — поменяйте их на свои в конфигах!

Начнем нашу установку с настройки сетевого адаптера
1. Настройка сетевого адаптера
Наш сервер имеет всего один сетевой адаптер, после установки CentOS, настройки этого адаптера хранятся в файле «/etc/sysconfig/network-scripts/ifcfg-eth0».
По умолчанию этот файл содержит следующие настройки

cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="08:00:27:79:17:85"
NM_CONTROLLED="yes"
ONBOOT="no"

Следует дописать в этот файл дополнительные настройки, подправим содержимое этого файла, открываем его в текстовом редакторе vi:

vi /etc/sysconfig/network-scripts/ifcfg-eth0
Чтобы внести текст в файл, нажмите клавишу «INS» -это активирует режим редактирования, переведет вас с режима просмотра в режим редактирования. После чего вводите новые данные. Обычно после нажатия «INS», текст вставляется комбинацией «SHISFT»+»INS».
По окончанию ввода текста, нажмите кнопку «ESC» и потом нажмите одновременно кнопки «SHIFT+z+z» или введите «:w!» и потом нажмите «ENTER» — это делается для сохранения файла и выхода с редактора.
Поиск файла в редакторе vi делается путем нажатия кнопки «/», далее вводится текст который нужно найти.

DEVICE="eth0"
HWADDR="08:00:27:79:17:85"
NM_CONTROLLED="no"
ONBOOT="yes"
GATEWAY=192.168.1.250
IPADDR=192.168.1.2
NETMASK=255.255.255.0
BROADCAST=192.168.1.255

Здесь мы дописали IP адрес нашего сервера/компьютера, его подсеть и шлюз в Интернет.

Перезапустим сетевую службу:

service network restart
Вписываем наш домен и адреса DNS серверов:

vi /etc/resolv.conf
search point.local
nameserver 127.0.0.1 // адрес обратной петли, это ускорит работу DNS
nameserver 192.168.1.2 //Первичный DNS
nameserver 111.222.333.444 //Вторичный DNS

Здесь IP адреса:
192.168.1.2 — это IP адрес нашего почтового сервера, он также будет выступать в роли DNS сервера
111.222.333.444 — адрес DNS сервера провайдера
Перезапустим сетевую службу, чтобы внесенные нами изменения вступили в силу:

service network restart
Проверьте, ваш сервер должен иметь выход Интернет:

ping google.ru
2. Установка MySQL и создание базы

yum install mysql mysql-server mysql-devel -y
Ставим демон (службу) в автозагрузку:

chkconfig mysqld on
Запускаем демон СУБД MySQL:

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

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
Создадим свой:

vi /etc/postfix/main.cf
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.local
mydomain = point.local
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. Так как у нас нет данного пользователя, создадим его:

useradd -r -u 1150 -g mail -d /var/vmail -s /sbin/nologin -c Virtual vmail
Тут мы создали нового пользователя vmail c идентификатором ID — 1150, добавили его в группу mail. Созданный пользователь имеет право на папку /var/vmail, при этом он больше ни где не используется. При входе в систему его не будет, то есть ему запрещено входить в систему как обычный пользователь (nologin).

mkdir -p -v /var/vmail
chmod 770 -R /var/vmail
chown vmail:mail /var/vmail
Для корректной работы создали каталог почтовых сообщений /var/vmail, куда будет попадать почтовая переписка.

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,
reject_non_fqdn_recipient,
reject_invalid_hostname,
reject_unknown_recipient_domain,
reject_unknown_client,
reject_unlisted_recipient,
reject_unverified_recipient,
reject_unauth_pipelining,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dialups.mail-abuse.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client sbl-xbl.spamhaus.org,
permit

Здесь правило reject_unauth_destination — должно запрещать открытый релей через ваш сервер.
Создадим дополнительные конфигурационные файлы, которые указаны в /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 следующие строчки:

vi /etc/postfix/main.cf
Чтобы лучше отбивался спам, добавим также следующие ограничения:

smtpd_client_restrictions =
reject_unauth_pipelining,
permit_sasl_authenticated,
permit_mynetworks,
reject_unknown_client_hostname,
permit
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_hostname,
reject_invalid_helo_hostname,
reject_unknown_hostname,
reject_non_fqdn_helo_hostname,
reject_unknown_helo_hostname,
permit
smtpd_sender_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_sender,
reject_authenticated_sender_login_mismatch,
reject_unauthenticated_sender_login_mismatch,
reject_unknown_sender_domain,
permit_sasl_authenticated,
reject_sender_login_mismatch
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.6 (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
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.local
}

Теперь создайте файл /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
Подключим необходимый репозитарий:

rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
Теперь установим 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_invalid_hostname,
reject_unknown_recipient_domain,
reject_unknown_client,
reject_unlisted_recipient,
reject_unverified_recipient,
reject_unauth_pipelining,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dialups.mail-abuse.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client sbl-xbl.spamhaus.org,
permit
smtpd_client_restrictions =
reject_unauth_pipelining,
permit_sasl_authenticated,
permit_mynetworks,
reject_unknown_client_hostname,
permit
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_hostname,
reject_invalid_helo_hostname,
reject_unknown_hostname,
reject_non_fqdn_helo_hostname,
reject_unknown_helo_hostname,
permit
smtpd_sender_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_sender,
reject_authenticated_sender_login_mismatch,
reject_unauthenticated_sender_login_mismatch,
reject_unknown_sender_domain,
permit_sasl_authenticated,
reject_sender_login_mismatch
permit

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

6. Установка ClamAV

yum remove rpmforge-release -y
rpm -Uvhhttp://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
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

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
Скачаем Postfixadmin и настроим его:

cd /var/www/html
wgethttp://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.91/postfixadmin-2.91.tar.gz/download -O postfixadmin-2.91.tar.gz
tar -xvzf postfixadmin-2.91.tar.gz
mv postfixadmin-2.91/ postfixadmin
cd postfixadmin
chown -R apache.apache /var/www/html/postfixadmin/templates_c
Открываем файл /var/www/html/postfixadmin/config.inc.php

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';

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

chkconfig mysqld on
chkconfig dovecot on
chkconfig postfix on
chkconfig httpd on
chkconfig postgrey on
chkconfig clamd on
chkconfig clamsmtpd on
chkconfig saslauthd on
8. Настройка DNS сервера
Для того чтобы протестировать почтовый сервер, установите пакет Bind. Установка Bind позволить настроить DNS сервер. После установки Bind, станет доступна служба named — отвечающая за функции DNS сервера.
И так, первым делом проверяем наш файл /etc/resolv.conf:

search point.local
nameserver 127.0.0.1
nameserver 192.168.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.local

vi /etc/hosts
192.168.1.2 mx.point.local mx

Удаляем Network Manager (NM):

service NetworkManager stop
chkconfig NetworkManager off
yum remove dnsmasq -y
service network restart
vi /etc/resolv.conf
search point.local
nameserver 127.0.0.1
nameserver 192.168.1.2
nameserver 111.222.333.444

Здесь IP адреса:
192.168.1.2 — наш DNS сервер
111.222.333.444 — IP адрес DNS сервера провайдера
Сохраняем на всякие пожарные основной конфигурационный файл демона «named»:

mv /etc/named.conf /etc/named.conf.orig
Создаем чистый конфиг файл с настройками внизу:

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; 192.168.1.2; }; # ставим внешний IP интерфейса
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; 10.0.0.0/24; }; # меняем, добавляем локальную сеть если она есть
allow-recursion { localhost; 10.0.0.0/24;}; # меняем, добавляем локальную сеть если она есть
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";
};

# Зона прямого просмотра "point.local"
zone "point.local" {
type master;
file "point.local.fwd";
allow-update {none;};
allow-transfer {192.168.1.10; }; //вторичный DNS
};

# Наша обратная зона просмотра "point.local"
zone "1.168.192.in-addr.arpa" {
type master;
file "point.local.rev";
allow-update {none;};
allow-transfer {192.168.1.10; };
};

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

Даем права на файл:

chown root:named /etc/named.conf
Создаем файл прямого просмотра зоны — point.local (forward zone)

vi /var/named/point.local.fwd
$ORIGIN point.local.

$TTL 3D

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

mx.point.local. IN A 192.168.1.2
www IN A 192.168.1.2
mail IN A 192.168.1.2

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

vi /var/named/point.local.rev
Здесь за место 1.168.192 — надо указать свою под сеть в обратном порядке.
А также в при добавлении PTR записи требуется ставить последнею цифру IP адреса,
у нас эта цифра 2, так как IP адрес почтового сервере оканчивается на 2 (192.168.1.2)

$ORIGIN 1.168.192.in-addr.arpa.

$TTL 3D
@ SOA mx.point.local. root.point.local. (12 4h 1h 1w 1h)
@ IN NS mx.point.local.
2 IN PTR mx.point.local.

service named start
chkconfig named on
Проверка работы DNS:

nslookup mx.point.local
nslookup 192.168.1.2
nslookup -type=MX point.local
hostname -f
mx.point.local

reboot
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@point.local», определите его пароль.

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

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

Запомните адрес админа и пароль.
Теперь уже заходим на страничку 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!
(point.local)

Создадим первый почтовый ящик, я создал «linux@point.local».
Меню Virtual List -> Add MailBox ->
Username — linux
Password — 123 (sample)

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

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

Примечание: Не забудьте настроить SMTP авторизацию.

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

rpm -Uvhhttp://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install php php-xml php-mcrypt php-intl php-sqlite php-pgsql
cd /var/www/html
wgethttp://sourceforge.net/projects/roundcubemail/files/roundcubemail/1.0.3/roundcubemail-1.0.3.tar.gz/download-O roundcubemail-1.0.3.tar.gz
tar xvfz roundcubemail-1.0.3.tar.gz
mv roundcubemail-1.0.3 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 roundcubemai
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/Almaty

или

date.timezone = Europe/Moscow

Далее идем по адресу http://127.0.0.1/roundcube/installer/ и устанавливаем по умолчанию, не меняя никаких настроек, кроме двух полей, где нужно указать название базы данных и пароль. В нашем случае название базы будет «roundcubemail», а пароль указанный ранее ‘password’. В процессе настройки надо обязательно согласится на создание схемы базы Roundcube (Create Database Scheme или Initialize Database). В противном случае будет ошибка, и вы не сможете войти на страничку RoundCube.
По окончании установки веб интерфейса, Вам будет предложено скачать и сохранить один конфигурационный файл:

  • config.inc.php
Этот файл требуется переместить в папку:

/var/www/html/roundcube/config/

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

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

$rcmail_config['imap_auth_type'] = cram-md5;
А также ставим IP адрес своего почтового хоста чтобы каждый раз не вводить его, логично было бы указать адрес — 127.0.0.1:

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

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

$rcmail_config['login_autocomplete'] = 2;

Также следует включить опцию ‘htmleditor’ в ‘always’.

$config['htmleditor'] = 0;

Если у вас всего один домен, и вы не хотите вводит доменную часть почтового адреса при входе в веб интерфейс, установите заранее свой домен здесь:

$rcmail_config['username_domain'] = 'company.kz';

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

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

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

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

Если все прошло успешно, удаляем директорию установщика в целях безопасности.

# rm -R -f /var/www/html/roundcube/installer

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

http://point.local/webmail

или

http://point.local/roundcube

Будет выведено окошко, где надо указать:

  • логин
  • пароль
  • сервер
    Вводим например:
  • логин: user@point.local
  • пароль: 123456
  • сервер: point.local
Примечание: У веб интерфейса RoundCube есть репозиторий с большим выбором плагинов которые расширяют возможности:>http://trac.roundcube.net/wiki/Plugin_Repository

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

11. Настройка фаерволла 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
Откройте файл — /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

[postfix-banhammer]
enabled = true
filter = postfix.banhammer
action = iptables-multiport[name=postfix, port="smtp,smtps", protocol=tcp]
# sendmail[name=Postfix, dest=you@mail.com]
logpath = /var/log/maillog
bantime = 3600
maxretry = 5
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]
[INCLUDES]
before = common.conf
failregex = roundcube: (.*) Error: Login failed for (.*) from <HOST>\.
roundcube:^\s*(\[(\s[+-][0-9]{4})?\])?(%(__hostname)s roundcube: IMAP Error)?: (FAILED login|Login failed) for .*? from <HOST>(\. .* in .*?/rcube_imap\.php on line \d+ \(\S+ \S+\))?$

ignoreregex =

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

vi /etc/fail2ban/filter.d/dovecot.banhammer.conf
[Definition]
failregex = dovecot: auth-worker\(default\): sql\(.*,<HOST>\): unknown user
dovecot: (pop3|imap)-login: Aborted login \(.*\): .*, \[<HOST>\]
dovecot: (pop3|imap)-login: Disconnected \(auth failed, .*\): .*, \[<HOST>\]
dovecot: auth\(default\): passdb\(.*,<HOST>\)\: Attempted login with password having illegal chars
dovecot: (pop3|imap)-login: Disconnected \(auth failed, .*\): .*, \[<HOST>\]
dovecot: (pop3|imap)-login: Aborted login: .*, \[<HOST>\]
(?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed).*rip=(?P<host>\S*),.*
dovecot.*auth-worker\(default\): sql\(.*,<HOST>\): Password mismatch
dovecot: auth: sql.*,<HOST>.*: Password mismatch
dovecot: auth: sql.*,<HOST>.*: unknown user
ignoreregex =

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

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

[Definition]
failregex = \[<HOST>\]: SASL (PLAIN|LOGIN) authentication failed
reject: RCPT from (.*)\[<HOST>\]: 550 5.1.1
reject: RCPT from (.*)\[<HOST>\]: 450 4.7.1
reject: RCPT from (.*)\[<HOST>\]: 554 5.7.1
(?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed:) [ A-Za-z0-9+/]*={0,2})?\s*$
Connection rate limit exceeded: .* from (.*)\[<HOST>\] for service smtp
ignoreregex =

chkconfig fail2ban on
service fail2ban start
Чтобы проверить срабатывания правил fail2ban, необходимо чтобы почтовый сервер поработал некоторое время, например 1 день. Далее введите команды:

fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix.banhammer.conf
fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/dovecot.banhammer.conf
В ответ получите вывод, где должна быть строчка с количеством совпадений:

Failregex: 6958 total

Заключение
Почтовый сервер установлен и настроен, теперь за электронную переписку отвечает связка программ из мира Open Source. Решение бесплатное, гибкое и довольно быстрое. В компании где я работаю, Postfix трудится уже продолжительное время. Управлять таким почтовым сервером легко, даже Windows админ справится с такой задачей, так как мы настроили Веб интерфейс под названием PostfixAdmin. В нем можно быстро создавать почтовые домены, пользователей, настраивать пересылку и автоответчик. И это еще не все его достоинства.
Для обычных пользователей, доступен Веб интерфейс, через который они могут проверять почту, если под рукой не оказалось почтового клиента.

В данном посте в целях более лучшего понимания и упрощения, было решено оставить только самое важное.
Это дает базовый функционал, который в принципе многих удовлетворит.
Если у вас возникнуть вопросы, можете их задавать на специализированном форуме Postfix: www.postfix.ru

Альтернативный почтовый сервер на Exim:
http://linuxforum.ru/viewtopic.php?id=21934

Кому интересно, вот мой конфиг /etc/postfix.main.cf — выдернул с рабочего сервера. Конечно конфиг простой, но мне этого пока хватает:

############## Начало файла main.cf ###############
soft_bounce = no
queue_directory = /var/spool/postfix
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
default_privs = nobody
inet_interfaces = all
myhostname = mail.company.kz
mydomain = company.kz
myorigin = $mydomain
mydestination = $myhostname,localhost.$myhostname,localhost
local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
relay_domains =
always_bcc = backup9@company.kz # Ящик для бекапов писем, сюда попадают все письма.
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
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
##################Checks####################
header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
mailbox_command = /usr/lib/dovecot/deliver -d В«$USERВ»
###################TLS######################
smtpd_use_tls = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache
smtpd_tls_key_file = /etc/postfix/certs/key.pem
smtpd_tls_cert_file = /etc/postfix/certs/cert.pem
tls_random_source = dev:/dev/urandom
###################TLS######################
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
smtpd_restriction_classes = OnlyFromMyUsers
OnlyFromMyUsers = permit_mynetworks,
permit_sasl_authenticated,
reject
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_authenticated_sender_login_mismatch,
check_helo_access hash:/etc/postfix/helo_checks,
check_helo_access pcre:/etc/postfix/helo_checks.pcre,
check_recipient_access pcre:/etc/postfix/recipient_checks.pcre,
reject_unauth_destination,
check_policy_service unix:/var/spool/postfix/postgrey/socket,
permit_tls_clientcerts,
reject_non_fqdn_recipient,
reject_unauthenticated_sender_login_mismatch,
reject_invalid_hostname,
reject_unknown_recipient_domain,
reject_unknown_client,
reject_unlisted_recipient,
reject_unverified_recipient,
reject_unauth_pipelining,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dialups.mail-abuse.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client sbl-xbl.spamhaus.org,
permit
smtpd_client_restrictions =
reject_unauth_pipelining,
permit_sasl_authenticated,
permit_mynetworks,
check_sender_access hash:/etc/postfix/whitelist,
check_sender_access hash:/etc/postfix/blacklist,
reject_unknown_client_hostname,
permit
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_client_access hash:/etc/postfix/whitelist,
check_sender_access hash:/etc/postfix/whitelist,
check_client_access hash:/etc/postfix/blacklist,
check_sender_access hash:/etc/postfix/blacklist,
reject_invalid_hostname,
reject_invalid_helo_hostname,
reject_unknown_hostname,
reject_non_fqdn_helo_hostname,
permit
smtpd_sender_restrictions =
check_sender_access hash:/etc/postfix/access_sender,
reject_authenticated_sender_login_mismatch,
reject_unauthenticated_sender_login_mismatch,
permit_sasl_authenticated,
check_sender_access hash:/etc/postfix/whitelist,
check_sender_access hash:/etc/postfix/blacklist,
reject_sender_login_mismatch
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_discard_ehlo_keywords = etrn, silent-discard
smtpd_forbidden_commands = CONNECT GET POST
broken_sasl_auth_clients = yes
address_verify_sender = $double_bounce_sender
#################LIMITS###########################
message_size_limit = 51200000
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 15
smtpd_error_sleep_time = 20
anvil_rate_time_unit = 60s
smtpd_client_connection_count_limit = 6
smtpd_client_connection_rate_limit = 6
smtpd_client_message_rate_limit = 6
smtpd_client_recipient_rate_limit = 20
################LIMITS############################
############## Конец файла #########################
Создаем файл и перечисляем свои домены от которых будет отправляться почта:

vi /etc/postfix/access_sender
company1.ru OnlyFromMyUsers
company2.ru OnlyFromMyUsers

Сохраняем файл.
И вводим следующие команды:

postmap /etc/postfix/access_sender
service postfix reload

Источник http://yvision.kz/
 
Верх