Сегодня хочу показать, как можно довольно быстро и легко поднять почтовый релей, который будет подменять адреса и домены отправителей и получателей.
В качестве примеров использования, можно придумать сотни вариантов, но сходу в голову пришли такие сценарии:
Если у вас есть внутренний почтовый сервер с внутренним доменом, и вы по какой-то причине не хотите или не можете на него повесить нормальный домен.
Если вы хотите отправлять письма от имени партнера, либо если было какое-нибудь объединение компаний и нужно, чтобы старый домен компании отправителя менялся на новый.
Например, у вас есть группа поддержки, и вы не хотите, чтобы определенные получатели видели индивидуальные ящики пользователей, а к примеру, чтобы получатель видел, что письма приходят с адреса support@yourdomain.com – можно подменить в каждом письме ящик участника, и всегда адреса пользователей будут меняться на support.
Вообще подобное можно сделать и при помощи сервера Exchange Edge, по ссылке кстати по подробнее написано про сценарии использования. Но для работы Edge требуется дополнительная лицензия, которая стоит денег, поэтому было решено попробовать сделать задуманное на чём-нибудь opensourceном. Выбор пал на Postfix.
Приступим. Я всё делал на Ubuntu Server 20.04. После установки системы обновляем её:
apt update
apt upgrade
Устанавливаем postfix и postfix-pcre. Последний нужен для того, чтобы была возможность править заголовки:
apt install postfix postfix-pcre
Идём в папку /etc/postfix и создаём там файл конфигурации – main.cf:
cd /etc/postfix/
nano main.cf
Следующего содержимого файла должно хватить:
compatibility_level = 2
#queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix#ваш внутренний домен
mydomain = yourlocaldomain.loc
#имя хоста, которое должно отображаться при ответах на helo и ehlo
myhostname = mail.externaldomain.com
mydestination = $myhostname,
$mydomain,
localhost#адреса для которых разрешен анонимный релей — 192.168.1.200 и 192.168.1.201 — соответсвенно адреса ваших почтовых серверов
mynetworks = 127.0.0.0/8, 192.168.1.200, 192.168.1.201
smtpd_banner = mail.externaldomain.com ESMTP
smtp_helo_name = mail.externaldomain.com#Правка заголовков, при помощи этого хозяйства можно скрыть информацию о предыдущих серверах и id писем, где может фигурировать домен, который нужно подменять.
smtp_header_checks = pcre:/etc/postfix/anon-headers.pcre#разрешаем пересылку для домена externaldomain.com
relay_domains = externaldomain.com#включаем работу правил транспорта
transport_maps = hash:/etc/postfix/transport#собственно включаеи rewrite
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
smtp_generic_maps = hash:/etc/postfix/genericlocal_recipient_maps =
unknown_local_recipient_reject_code = 550debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
inet_protocols = ipv4
Далее нужно создать файл при помощи которого будет осуществляться правка заголовков:
nano anon-headers.pcre
Содержимое примерно такое:
/^Received: from .*yourlocaldomain.loc/ IGNORE
/Message-Id:\s+<(.*?)@yourlocaldomain.loc>/ REPLACE Message-Id: <$1@externaldomain.com>
Далее создадим правило транспорта, чтобы почта пришедшая на наши домены пересылалась на нужные почтовые серверы:
nano transport
Содержимое:
externaldomain.com smtp:[192.168.1.200]
yourlocaldomain.loc smtp:[192.168.1.200]
Применяем:
postmap transport
Создаем файл перезаписи адресов:
nano generic
Пример его содержимого:
@yourlocaldomain.loc @externaldomain.com
@externaldomain.com @yourlocaldomain.loc
vasya.pupkin@yourlocaldomain.loc support@externaldomain.com
support@externaldomain.com vasya.pupkin@yourlocaldomain.loc
Тут видно, что меняются как внешний так и внутренний домен. Это нужно, что бы была возможность менять адреса не только при отправке почты, но и при приёме. Также для примера показана смена конкретного адреса.
Применяем:
postmap generic
Создаём еще один файл перезаписи адресов:
nano recipient_canonical
Содержимое:
@yourlocaldomain.loc @externaldomain.com
vasya.pupkin@yourlocaldomain.loc support@externaldomain.com
Применяем:
postmap recipient_canonical
Также может потребоваться добавить внешний домен в файл hosts:
nano /etc/hosts
В конец файла нужно добавить строчку:
192.168.1.200 externaldomain.com
Перезапускаем postfix:
/etc/init.d/postfix restart
Всё, теперь во всех письмах проходящих через ваш релей будет меняться адрес отправителя/получателя в соответсвии с вашими правилами. Остается только направить письма, для которых треубется осуществить замену адреса, через этот релей. Например в Exchange – можно добавить Send Connector, для определенных доменов, и в качестве Smart Host указать адрес только что настроенного сервера.
Следить за тем, что происходит можно в логах mail.log:
tail -f /var/log/mail.log
Также не лишним будет следить за здоровьем вашего нового релея, поможет в этом утилита pflogsumm:
apt install pflogsumm
И скрипт:
/usr/bin/df -h / 2>&1 > /home/administrator/statistics.txt
echo "" >> /home/administrator/statistics.txt
/usr/bin/mailq >> /home/administrator/statistics.txt
/usr/bin/cat /var/log/mail.log 2>&1 | /usr/sbin/pflogsumm 2>&1 >> /home/administrator/statistics.txt
cat /home/administrator/statistics.txt | mail -s "relay statistics" yourmail@yourlocaldomain.loc
Соответственно можно сохранить этот скрипт, добавить его в cron и будет приходить письмо о состоянии здоровья сервера.
