Установка и настройка почтового сервера на основе Postfix в CentOS 6.6 x32
В данном посте описан процесс установки почтового сервера на основе MTA Postfix. В качестве платформы будет использована CentOS версии 6.6 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
Более детальная информация по этой части предоставлена пользователем Cruiser78 в сообщении с темой: Как не надо настраивать свой почтовый сервер
Скажем спасибо Cruiser78 за ценную информацию которую он всегда любезно предоставляет.
Краткое содержание:
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
Альтернативный почтовый сервер на Exim:
http://linuxforum.ru/viewtopic.php?id=21934
Аналогичная установка на CentOS 7:
Установка и настройка почтового сервера Postfix на CentOS 6.5 x32
Домен:
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
Подключим необходимый репозитарий:
Теперь установим 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
# 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
# wget http://sourceforge.net/projects/postfix … z/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:
# yum install php php-xml php-mcrypt php-intl php-sqlite php-pgsql
# cd /var/www/html
# wget http://sourceforge.net/projects/roundcu … z/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 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/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 есть репозиторий с большим выбором плагинов которые расширяют возможности:
Например, можно добавить возможность закачки всех вложений единым архивом и т.д.
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.kz OnlyFromMyUsers
company2.kz OnlyFromMyUsers
Сохраняем файл.
И вводим следующие команды:
# postmap /etc/postfix/access_sender
# service postfix reload
Очень полезная инфа по работе правил Postfix:
Установка и настройка почтового сервера Postfix на CentOS 6.6(CentOS7)