Postfix как граничный почтовый сервер | NetConfig | NetConfig

Postfix как граничный почтовый сервер

chemaВсем привет, задача проста – организовать резервный канал для приема/отправки почты в связке с 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-адреса в доменное имя нашего почтового сервера.

Пробуем, дебажим , концепция не нова, но пока сам не сделаешь в резюме написать будет нечего.

Всем добра и корректной работы почтовых сервисов!


Для правильной работы со схемами необходима версия Packet Tracer 5.3.2


Fatal error: Uncaught Error: Call to undefined function wp_related_posts() in /home/netconfi/public_html/wp-content/themes/theme/single.php:56 Stack trace: #0 /home/netconfi/public_html/wp-includes/template-loader.php(106): include() #1 /home/netconfi/public_html/wp-blog-header.php(19): require_once('/home/netconfi/...') #2 /home/netconfi/public_html/index.php(17): require('/home/netconfi/...') #3 {main} thrown in /home/netconfi/public_html/wp-content/themes/theme/single.php on line 56
WordPress › Error

There has been a critical error on your website.

Learn more about debugging in WordPress.