Развернуть простейший relay на Postfix ничуть не сложнее, чем установить сам Postfix. Настройка тоже не представляется чем-то сверхсложным, ведь речь идет об узле, главной задачей которого будет только перенаправление входящей почты.Задачи фильтрации спама и вирусов я планирую рассмотреть в последующих статьях серии.
Хочется задать вопросы или поделиться знаниями? Приходи в наш закрытый Telegram-чат.
Содержание
Простейший relay на Postfix
Главная задача этой статьи – рассказать о первом этапе настройки почтового релэя – когда нужно осуществлять только пересылку входящей почты на внутренний сервер и обратно, проверяя при этом факт существования пользователя в организации.
В качестве бэкэнда будет выступать Exchange Server 2016 в связке с Active Directory, как наиболее распространенный и совершенный корпоративный почтовый сервис, но, к удивительному сожалению, не имеющий собственного продвинутого антиспама.
Подготовка
Начинать развертывание любого почтового сервера (даже релэя), нужно с покупки домена и создания необходимых DNS-записей. Конечно если почта в вашей организации уже есть, этот этап вы уверенно пропускаете. А всем остальным я советую создать у вашего регистратора записи A, MX и TXT, а также PTR – у провайдера интернет (или поставщика выделенных серверов, которые идут вместе с публичными адресами).
Если нужна помощь – обращайтесь в комментариях.
Настройка Exchange
По умолчанию Exchange не имеет соединителей отправки, то есть отправить почту в интернет не сможет (но локальным получателем вполне). Обычно админы создают соединитель с областью, обозначенной знаком * (означает все существующие домены), а значит вся исходящая почта наружу идет именно через этот соединитель.
Итого, чтобы заставить всю почту идти наружу через наш релэй, в большинстве случаев надо всего лишь прописать промежуточный узел для этого соединителя:
Через powershell это сделать ещё проще (адрес 172.16.0.64, как вы догадались, принадлежит релэю Postfix):
1 |
Get-SendConnector | Set-SendConnector -SmartHosts 172.16.0.64 |
Этот шаг лучше выполнить уже после полной настройки Postfix (чтобы не было простоя сервиса), но мне важно показать как работает релэй с уже настроенным Exchange, поэтому я сделаю это сейчас (мне можно, я ведь делаю это на лабе).
Установка Postfix
Postfix доступен из стандартных репозиториев как на Debian, так и на CentOS, оттуда и советую его ставить.
Конфигурация по умолчанию нам не подходит, а потому нужно будет кое-что подкрутить и об этом вы сможете прочитать в статье Установка Postfix на Debian.
Забегая вперед скажу, что нам понадобится ещё один пакет, установим его командой:
1 |
apt-get install postfix-ldap |
На этом все, можно двигаться дальше.
Базовая настройка
Мой домен, купленный специально для этого цикла статей – bq-srv.ru, на его примере и разберем конфигурацию. Если вы пропустили раздел Подготовка выше, то продублирую ещё раз основную мысль. Основная и обязательная часть настройки Postfix – это указание следующих параметров:
- mydomain – публичное имя вашего почтового сервиса;
- myhostname – имя хоста;
- mydestination – список DNS-имен, которые обслуживает данный почтовый сервер (для которых он будет принимать почту).
Поскольку мы говорим о почтовом релее, для него также важны следующие опции:
- relay_domains – список доменов, для которых сервер пересылает почту;
- mynetworks – список доверенных сетей или хостов, которые обычно имеют более высокие привилегии. Например по умолчанию в ограниченияхsmtpd_relay_restrictions указан ключ permit_mynetworks, а это значит, что всем хостам в mynetworks разрешена пересылка сообщений через сервер;
- transport_maps – транспортная карта, по которой сервер будет определять почту для каких доменов (или получателей) куда отправлять.
Итак, резюмируя сказанное, нужно добавить (или изменить существующие) в конфиг следующие параметры:
1 2 3 4 5 6 7 8 9 |
mydomain = bq-srv.ru myhostname = mail.bq-srv.ru mydestination = $myhostname, $mydomain, localhost mynetworks = 127.0.0.0/8 172.16.0.20 relay_domains = bq-srv.ru transport_maps = hash:/etc/postfix/conf.d/transport |
172.16.0.20 – адрес сервера Exchange.
Файл /etc/postfix/conf.d/transport имеет содержимое:
1 |
bq-srv.ru smtp:exch01.sc.local:25 |
После его создания и заполнения не забудьте выполнить команду и перечитать конфиг Postfix:
1 2 |
postmap /etc/postfix/conf.d/transport postfix reload |
А теперь проверим как все работает.
Итак, с любого внешнего почтового сервиса попробуем отправить почту на несуществующий ящик Exchange (здесь и далее логи немного сокращены для наглядности):
1 2 3 4 5 6 7 |
postfix/smtpd[17010]: connect from mail-lj1-f169.google.com[209.85.208.169] postfix/smtpd[17010]: 9DF627F4C7: client=mail-lj1-f169.google.com[209.85.208.169] postfix/cleanup[17015]: 9DF627F4C7: message-id=<CAD+gEGdxACYyHzcOisNPHiv9Abb2mfU+ezed5bYaWkwyM6nVFQ@mail.gmail.com> postfix/qmgr[14673]: 9DF627F4C7: from=<vasilyev.egor.sergeevich@gmail.com>, size=2818, nrcpt=1 (queue active) postfix/smtpd[17010]: disconnect from mail-lj1-f169.google.com[209.85.208.169] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7 postfix/smtp[17014]: 9DF627F4C7: to=<tratata@bq-srv.ru>, relay=exch01.sc.local[172.16.0.20]:25, delay=0.38, delays=0.26/0/0.01/0.12, dsn=2.6.0, status=sent (250 2.6.0 <CAD+gEGdxACYyHzcOisNPHiv9Abb2mfU+ezed5bYaWkwyM6nVFQ@mail.gmail.com> [InternalId=69432441307145, Hostname=EXCH01.sc.local] 4089 bytes in 0.105, 37,819 KB/sec Queued mail for delivery) postfix/qmgr[14673]: 9DF627F4C7: removed |
Как видно, Postfix успешно принимает почту на адрес tratata@bq-srv.ru и отправляет на Exchange. Но такого ящика в организации не существует и эксч отправляет отчет о недоставке через Postfix:
1 2 3 4 5 6 7 |
postfix/smtpd[17010]: connect from exch01.sc.local[172.16.0.20] postfix/smtpd[17010]: 43B177F4C7: client=exch01.sc.local[172.16.0.20] postfix/cleanup[17015]: 43B177F4C7: message-id=<8d8b6fb9-8873-4bfc-bada-ea695fe7b701@EXCH01.sc.local> postfix/qmgr[14673]: 43B177F4C7: from=<>, size=14143, nrcpt=1 (queue active) postfix/smtpd[17010]: disconnect from exch01.sc.local[172.16.0.20] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7 postfix/smtp[17016]: 43B177F4C7: to=<vasilyev.egor.sergeevich@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.131.26]:25, delay=0.22, delays=0.01/0/0.05/0.16, dsn=2.0.0, status=sent (250 2.0.0 OK 1532005579 88-v6si2264128lfy.267 - gsmtp) postfix/qmgr[14673]: 43B177F4C7: removed |
А отправителю приходит сообщение:
1 2 3 4 |
Не удалось выполнить доставку следующим получателям или группам: tratata@bq-srv.ru Не удалось найти введенный электронный адрес. Проверьте адрес получателя и попробуйте отправить сообщение еще раз. Если проблема возникнет снова, обратитесь к своему администратору электронной почты. |
Можно сделать вывод, что наш релэй выполняет двойную работу – перенаправляет почту сначала на эксч, а потом от него. Кроме того, лишняя нагрузка ложится ещё и на сам Exchange. В принципе все можно оставить как есть, ведь работает, но лучше все же прикрутить проверку получателей.
Расширенная настройка
Необходимо добавить дополнительный источник почтовых алиасов, чтобы Postfix знал где их искать. Для этого допишите после запятой путь к конфигурации подключения к AD с ключом ldap:
1 2 3 |
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/conf.d/ldap-aliases.cf local_recipient_maps = $alias_maps |
Создайте файл ldap-aliases.cf и пропишите настройки для подключения:
1 2 3 4 5 6 7 8 9 10 |
server_host = ldap://dc01.sc.local:389 search_base = DC=sc,DC=local version = 3 bind = yes bind_dn = CN=emailrelay,OU=1.3 Service Accounts,OU=1 Users,DC=sc,DC=local bind_pw = Password! query_filter = (&(|(objectclass=User)(objectclass=Group))(proxyAddresses=smtp:%s)) leaf_result_attribute = proxyAddresses |
Небольшие пояснения:
- server_host – КД для подключения, можно указать несколько;
- search_base – OU, с которого идет поиск вниз по иерархии;
- bind_dn – полное имя (distinguishedName) и пароль к нему в поле bind_pw;
- query_filter – фильтр для поиска ldap. В моем случае поиск идет только среди объектов пользователь и группа по полю proxyAddresses, которое может иметь враз несколько алиасов разных типов, например (нам нужны только типы smtp:, а ключ %s соответствует искомому адресу):
На этом все, перезапускаем Postfix:
1 |
systemctl restart postfix |
И снова отправляем почту на несуществующий ящик:
1 2 3 |
postfix/smtpd[18741]: connect from mail-lj1-f178.google.com[209.85.208.178] postfix/smtpd[18741]: NOQUEUE: reject: RCPT from mail-lj1-f178.google.com[209.85.208.178]: 550 5.1.1 <tratata@bq-srv.ru>: Recipient address rejected: User unknown in local recipient table; from=<vasilyev.egor.sergeevich@gmail.com> to=<tratata@bq-srv.ru> proto=ESMTP helo=<mail-lj1-f178.google.com> postfix/smtpd[18741]: disconnect from mail-lj1-f178.google.com[209.85.208.178] ehlo=2 starttls=1 mail=1 rcpt=0/1 data=0/1 quit=1 commands=5/7 |
Ответ теперь совсем другой – Recipient address rejected: User unknown in local recipient table – и он означает, что Postfix сначала обратился к AD и, не обнаружив там пользователя, вернул ошибку. Письмо до Exchange не дошло. Это и нужно.
Владельцу сообщения вернулся ответ, в этот раз от Postfix:
1 2 |
Ответ удаленного сервера: 550 5.1.1 <tratata@bq-srv.ru>: Recipient address rejected: User unknown in local recipient table |
Базовая настройка на этом завершена, но это только первый этап. Об остальных моментах я планирую рассказать в следующих статьях.