Вы здесь

Перезапись адресов отправителей и получателей при помощи Postfix


Перезапись адресов отправителей и получателей при помощи Postfix

Сегодня хочу показать, как можно довольно быстро и легко поднять почтовый релей, который будет подменять адреса и домены отправителей и получателей.

В качестве примеров использования, можно придумать сотни вариантов, но сходу в голову пришли такие сценарии:

Если у вас есть внутренний почтовый сервер с внутренним доменом, и вы по какой-то причине не хотите или не можете на него повесить нормальный домен.

Если вы хотите отправлять письма от имени партнера, либо если было какое-нибудь объединение компаний и нужно, чтобы старый домен компании отправителя менялся на новый.

Например, у вас есть группа поддержки, и вы не хотите, чтобы определенные получатели видели индивидуальные ящики пользователей, а к примеру, чтобы получатель видел, что письма приходят с адреса [email protected] – можно подменить в каждом письме ящик участника, и всегда адреса пользователей будут меняться на 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/generic


local_recipient_maps =
unknown_local_recipient_reject_code = 550

debugger_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: <[email protected]>

Далее создадим правило транспорта, чтобы почта пришедшая на наши домены пересылалась на нужные почтовые серверы:

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
[email protected]        [email protected]
[email protected]     [email protected]

Тут видно, что меняются как внешний так и внутренний домен. Это нужно, что бы была возможность менять адреса не только при отправке почты, но и при приёме. Также для примера показана смена конкретного адреса.
Применяем:

postmap generic

Создаём еще один файл перезаписи адресов:

nano recipient_canonical

Содержимое:

@yourlocaldomain.loc @externaldomain.com
[email protected] [email protected]

Применяем:

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" [email protected]

Соответственно можно сохранить этот скрипт, добавить его в cron и будет приходить письмо о состоянии здоровья сервера.

1 2

Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.


Если вам помогла статья, вы можете >>отблагодарить автора<<