Всем привет, задача проста – организовать резервный канал для приема/отправки почты в связке с Exchange 2010 на случай неприятностей с основным.
Как водится – мы просим средств на закупку оборудования дабы поднимать роль пограничного сервера средствами Microsoft Exchange , но увы и ах – крутись как хочешь.
Выход – использовать текущие мощности и логическую топологию, организовав резервный почтовый сервер в виртуальной среде. Все параметры будут описаны , дабы более точно изложить ход моих мыслей.
Что нам пригодится:
- Cisco-router как устройство смотрящее в интернет
- Hyper-v server как платформа для виртуального Postfix
- Текущая структура AD+Exchange (с легкими поправками)
- Панель управления нашим доменом (A,MX,SPF)
- Оформить заявку на предмет создания ptr-записи
1. Настройка порт-форвардинга
Для начала необходимо реализовать форвард портов на маршрутизаторе, дабы необходимые сервисы были видны из интернета и могли правильно функционировать.
C учетом настроенной маршрутизации и преобразования сетевых адресов выполняем:
ip nat inside source static tcp ip_server_postfix 25 ext_ip 25 extendable |
(для smtp )
ip nat inside source static tcp ip_server_exchange 443 ext_ip 443 extendable |
(для owa)
Собственно говоря, процедуру организации вышеизложенного реально сконфигурировать на любом маломальском оборудовании. Также стоить помнить, что шлюзом для postfix служит этот же маршрутизатор, равно как и для Exchange (в случае аварии на основном канале).
2. Установка и настройка postfix
В качестве платформы выбираем Gentoo linux – так уж повелось J, предварительно сконфигурировав настройки сети. Не забываем об установке необходимых флагов для получения требуемого функционала:
emerge -pv postfix |
berkdb |
Add support for sys-libs/db (Berkeley DB for MySQL) |
global |
cdb |
Add support for the CDB database engine from the author of qmail |
global |
doc |
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
global |
dovecot-sasl |
Enable net-mail/dovecot protocol version 1 (server only) SASL implementation |
local |
eai |
Add support for SMTPUTF8 |
local |
hardened |
Activate default security enhancements for toolchain (gcc, glibc, binutils) |
global |
ldap |
Add LDAP support (Lightweight Directory Access Protocol) |
global |
ldap-bind |
Add support for binding to LDAP backend using dev-libs/cyrus-sasl |
local |
libressl |
Use dev-libs/libressl as SSL provider (might need ssl USE flag), packages should not depend on this USE flag |
global |
lmdb |
Add support for using dev-db/lmdb for lookup tables |
local |
mbox |
Add support for mbox (/var/spool/mail) style mail spools |
global |
memcached |
Add support for using net-misc/memcached for lookup tables |
local |
mysql |
Add mySQL Database support |
global |
nis |
Support for NIS/YP services |
global |
pam |
Add support for PAM (Pluggable Authentication Modules) – DANGEROUS to arbitrarily flip |
global |
postgres |
Add support for the postgresql database |
global |
sasl |
Add support for the Simple Authentication and Security Layer |
global |
selinux |
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
global |
sqlite |
Add support for sqlite – embedded sql database |
global |
ssl |
Add support for Secure Socket Layer connections |
global |
Добавляем необходимые USE-флаги либо как глобальный параметр :
nano /etc/portage/make.conf |
с правкой параметра USE=” libressl sasl dlz berkdb caps ipv6 ssl threads “ (Пример)
Либо конкретно указать для пакета поддерживаемый функционал :
nano /etc/portage/package.use/postfix |
и добавляем строку типа mail-mta/postfix berkdb eai pam sasl ssl (Пример)
Затем инсталируем :
emerge -av postfix |
и приступаем к редактированию :
nano /etc/postfix/main.cf (Главного конфигурационного файла) |
# COMPATIBILITY
compatibility_level = 2 #Обратная совместимость с конфигурацией Postfix 3
# SOFT BOUNCE
soft_bounce = yes # Пытаться повторно отправить проблемное сообщение
# LOCAL PATHNAME INFORMATION #Стандартные директории для размещения компонентов почтового сервиса
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
# QUEUE AND PROCESS OWNERSHIP
mail_owner = postfix #Определяет владельца почтовой очереди
# INTERNET HOST AND DOMAIN NAMES
myhostname = mx.test.com #Имя сервера
mydomain = test.com #Принадлежность к домену
# SENDING MAIL
myorigin = $mydomain #Служит для добавления суффикса домена при локальной отправке
# RECEIVING MAIL
inet_interfaces = all #Слушать все интерфейсы для приема почты
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost
#Принимать почту для этих доменов
# REJECTING MAIL FOR UNKNOWN LOCAL USERS
local_recipient_maps =
#Указывает где искать локальных пользователей для отправки (оставляем пустым)
#unknown_local_recipient_reject_code = 550
# TRUST AND RELAY CONTROL
mynetworks_style = subnet #По умолчанию – разрешение доступа по сетевому признаку
mynetworks = 192.168.0.2, 192.168.0.50, 192.168.0.70, 127.0.0.0/8, #Список доверенных адресов и подсетей
relay_domains = $mydestination #В какие почтовые домены пересылать почту
# INTERNET OR INTRANET(не используем дополнительных хостов для пересылки)
#The relayhost parameter specifies the default host to send mail to when no entry is matched in the optional transport table
#relayhost = $mydomain
#relayhost = [gateway.my.domain]
#relayhost = [mailserver.isp.tld]
#relayhost = uucphost
#relayhost = [an.ip.add.ress]
# REJECTING UNKNOWN RELAY USERS
#relay_recipient_maps = hash:/etc/postfix/relay_recipients
# INPUT RATE CONTROL
#in_flow_delay = 1s
# ADDRESS REWRITING
# username->Firstname.Lastname mapping.
# TRANSPORT MAP
transport_maps = hash:/etc/postfix/transport #Расположение транспортных соответствий
# ALIAS DATABASE
#Рассположение базы локальных алиасов
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
# ADDRESS EXTENSIONS (e.g., user+foo)
#recipient_delimiter = +
# DELIVERY TO MAILBOX
#home_mailbox = Mailbox
#home_mailbox = Maildir/
mail_spool_directory = /var/mail #Каталог хранения локальной почты
#mail_spool_directory = /var/spool/mail
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a “$EXTENSION”
# Cyrus IMAP over LMTP. Specify “lmtpunix cmd=”lmtpd”
# listen=”/var/imap/socket/lmtp” prefork=0” in cyrus.conf.
#mailbox_transport = lmtp:unix:/var/imap/socket/lmtp
# Cyrus IMAP via command line. Uncomment the “cyrus…pipe” and
# subsequent line in master.cf.
#mailbox_transport = cyrus
#fallback_transport = lmtp:unix:/file/name
#fallback_transport = cyrus
#fallback_transport =
#luser_relay = [email protected]
#luser_relay = [email protected]
#luser_relay = admin+$local
# JUNK MAIL CONTROLS
#header_checks = regexp:/etc/postfix/header_checks #Параметры встроенных ограничений заголовка письма
# FAST ETRN SERVICE
#fast_flush_domains = $relay_domains
# SHOW SOFTWARE VERSION OR NOT
smtpd_banner = $myhostname ESMTP $mail_name (Gentoo Postfix-gateway) # Первая часть приветствия
biff = no #Отключаем уведомления о входящих сообщениях
# PARALLEL DELIVERY TO THE SAME DESTINATION
local_destination_concurrency_limit = 2
#Лимит на количество параллельных процессов отправления локальным получателям
default_destination_concurrency_limit = 10
#Лимит на количество параллельных процессов отправления по умолчанию
# DEBUGGING CONTROL
debug_peer_level = 2 #Указываем уровень журналирования и дебага
#debug_peer_list = 127.0.0.1
#debug_peer_list = some.domain
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
# INSTALL-TIME CONFIGURATION INFORMATION
#Параметры этого блока оставляем без изменений
#The full pathname of the Postfix sendmail command
sendmail_path = /usr/sbin/sendmail
#This is the Sendmail-compatible command to build alias databases
newaliases_path = /usr/bin/newaliases
# Is the Sendmail-compatible mail queue listing command
mailq_path = /usr/bin/mailq
#This is the Sendmail-compatible command to build alias databases.
setgid_group = postdrop
# html_directory: The location of the Postfix HTML documentation.
html_directory = no
# manpage_directory: The location of the Postfix on-line manual pages.
manpage_directory = /usr/share/man
# sample_directory: The location of the Postfix sample configuration files.
sample_directory = /etc/postfix
# readme_directory: The location of the Postfix README files.
readme_directory = /usr/share/doc/postfix-3.0.2/
inet_protocols = ipv4 #Явно используем ipv4
meta_directory = /etc/postfix #Стандартное расположение файлов
shlib_directory = /usr/lib/postfix/${mail_version} #Стандартное расположение для плагинов
message_size_limit = 314572800 #Разрешенный размер сообщений
strict_rfc821_envelopes = yes
# Запрет некорректного синтаксиса в командах MAIL FROM или RCPT TO
disable_vrfy_command = yes
# Запрещаем проверку отправителем существование адреса получателя на этапе передачи заголовка
smtpd_delay_reject = yes
Разрешаем дополнительные проверки пока отправитель передает RCPT TO: и MAIL FROM: заголовки
smtpd_helo_required = yes #Требуем от отправителя представиться
smtpd_reject_unlisted_recipient = yes #Отклонение писем с несуществующим адресом получателя
Нижеперечисленные параметры описаны в пункте 2.1
smtpd_client_restrictions =
permit_mynetworks,
reject_unknown_client_hostname,
# check_client_access regexp:/etc/postfix/client_access,
check_client_access regexp:/etc/postfix/dul_checks,
reject_rbl_client bl.spamcop.net,
reject_rbl_client list.dsbl.org,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client relays.ordb.org,
reject_rbl_client relays.ordb.org,
permit
#smtpd_helo_restrictions:
#check_helo_access,
#check_helo_mx_access,
#check_helo_ns_access,
#reject_invalid_hostname,
#reject_non_fqdn_hostname,
#reject_unknown_hostname,
#+ generic
#+ smtpd_client_restrictions
#smtpd_etrn_restrictions:
#check_etrn_access
#+ generic
#+ smtpd_client_restrictions
#+ smtpd_helo_restrictions
# smtpd_etrn_restrictions:
#check_etrn_access
#+ generic
#+ smtpd_client_restrictions
#+ smtpd_helo_restrictions
smtpd_sender_restrictions =
check_sender_access hash:/etc/postfix/whitelist,
permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_pipelining,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_sasl_authenticated,
reject_unauth_destination,
permit
smtpd_data_restrictions =
reject_unauth_pipelining,
permit
2.1 Параметры проверки сообщения smtpd_*_restrictions
Семь кругов ада (не считая антивируса и спамфильтра ) на этапе разборки сообщения по составляющим весьма и весьма способны защитить наш сервер от злоумышленных рассылок и прочих не благонадежных проявлений (mail*)
smtpd_client_restrictions | Проверка ip-address или доменного имени компьютера отправителя || сервер отправителя |
Smtpd_helo_restrictions | Проверка имени компьютера и (если возможно) его IP-address по имени, переданному в команде HELO/EHLO |
smtpd_etrn_restriction | Совокупность первых двух проверок |
smtpd_sender_restrictions | Проверка адреса отправителя MAIL FROM: |
smtpd_recipient_restrictions | Обработка поля получателя RCPT TO: |
smtpd_data_restrictions | Обработка поля DATA |
smtpd_end_of_data_restrictions | Обработка команды END-OF-DATA |
На каждом этапе может находиться цепочка проверок , которая относится непосредственно к родительскому разделу, кроме того существует возможность организовать структуру общих правил (generic) см. всю структуру в конце раздела.
Следует помнить, что сообщение проверяется правилами сверху-вниз, при срабатывании с отрицательным результатом – сообщение будет отброшено, равно как и в обратном случае : при положительной итоге – сообщение проверяется следующим правилом.
И раз уже тема была затронута – схема проверки :
общие правила (generic):
check_policy_service
defer
defer_if_permit
defer_if_reject
permit
reject
warn_if_reject
smtpd_client_restrictions:
check_ccert_access
check_client_access
permit_inet_interfaces
permit_mynetworks
permit_sasl_authenticated
permit_tls_all_clientcerts
permit_tls_clientcerts
reject_rbl_client
reject_rhsbl_client
reject_unknown_client
smtpd_helo_restrictions:
check_helo_access
check_helo_mx_access
check_helo_ns_access
reject_invalid_hostname
reject_non_fqdn_hostname
reject_unknown_hostname
+ generic
+ smtpd_client_restrictions
smtpd_etrn_restrictions:
check_etrn_access
+ generic
+ smtpd_client_restrictions
+ smtpd_helo_restrictions
smtpd_sender_restrictions:
check_sender_access
check_sender_mx_access
check_sender_ns_access
reject_authenticated_sender_login_mismatch
reject_non_fqdn_sender
reject_rhsbl_sender
reject_sender_login_mismatch
reject_unauthenticated_sender_login_mismatch
reject_unknown_sender_domain
reject_unlisted_sender
reject_unverified_sender
+ generic
+ smtpd_client_restrictions
+ smtpd_helo_restrictions
+ smtpd_etrn_restrictions
smtpd_recipient_restrictions:
check_recipient_access
check_recipient_mx_access
check_recipient_ns_access
permit_auth_destination
permit_mx_backup
reject_non_fqdn_recipient
reject_rhsbl_recipient
reject_unauth_destination
reject_unknown_recipient_domain
reject_unlisted_recipient
reject_unverified_recipient
+ generic
+ smtpd_client_restrictions
+ smtpd_helo_restrictions
+ smtpd_etrn_restrictions
+ smtpd_sender_restrictions
smtpd_data_restrictions
reject_multi_recipient_bounce
reject_unauth_pipelining
+ generic
+ smtpd_client_restrictions
+ smtpd_helo_restrictions
+ smtpd_etrn_restrictions
+ smtpd_sender_restrictions
+ smtpd_recipient_restrictions
smtpd_end_of_data_restrictions
+ generic
+ smtpd_client_restrictions
+ smtpd_helo_restrictions
+ smtpd_etrn_restrictions
+ smtpd_sender_restrictions
+ smtpd_recipient_restrictions
+ smtpd_data_restrictions
2.2 Результаты проверки и механизм реагирования smtpd_*_restrictions
За исключением правил check_.*_access все остальные правила возвращают по результату проверки коды OK, DUNNO или REJECT.
OK – он и есть ок J (Проверка прошла успешно и в данном ограничении больше проверок осуществляться не будет, сообщение переходит на проверку ниже по списку ).
DUNNO – при таком результате проверка переходит к следующей проверке в текущей цепочке . В случае когда все результаты = DUNNO – проверка в текущей цепочке правил считается успешной.
REJECT – сообщение отбрасывается , отправителю высылается соответствующее сообщение с кодом ошибки , в зависимости от сработанного правила.
Правила формата reject_.* возвращают REJECT или DUNNO.
Правила формата permit_.* возвращают OK или DUNNO.
Правила формата check_.*_access могут возвращать кроме OK , DUNNO и REJECT еще и цифровые коды формата 4XX , 5XX , DEFER_IF_REJECT , FILTER, HOLD, REDIRECT, DISCARD , DEFER_IF_PERMIT и пр, но это уже совсем другая почтовая история.
2.3 Подготовка файлов, связанных с main.cf
Создаем любимым редактором файл для транспортной связки почтового домена и сервера (exchange), обслуживающего этот домен:
vim /etc/postfix/transport |
test.com smtp:[192.168.0.26]
и конвертируем для корректной работы :
postmap /etc/postfix/transport |
Тоже самое делаем при изменении файла конфигурации алиасов :
postmap /etc/mail/aliases |
3 Настройка записей в dns-зоне
По всем правилам системы разрешения имен и почтовых сервесов нам необходимо в панели управления нашим (реальным) доменом указать что появился еще один почтовый сервер.
Естественно, сколько операторов – столько и разновидностей административных панелей.
Итак, нам потребуется :
А – Запись (Сопоставление ip-адреса к имени домена).
MX – Запись (Указываем что в нашем домене есть почтовый сервер , привязываем к А – записи и указываем приоритет ).
TXT + SPF Записи, которые в связке указывают на серверы, которым можно отправлять почту от имени домена.
Так же следует обратиться в службу тех.поддержки провайдера с просьбой добавления PTR-записи (обратная зона DNS), тем самым обеспечить правильное преобразование ip-адреса в доменное имя нашего почтового сервера.
Пробуем, дебажим , концепция не нова, но пока сам не сделаешь в резюме написать будет нечего.
Всем добра и корректной работы почтовых сервисов!