Назад | Перейти на главную страницу

Принудительное использование адреса отправителя при ретрансляции postfix через smtp

Я пытаюсь получить отчеты по электронной почте от наших экземпляров AWS EC2. Мы используем Exchange Online (часть Microsoft Online Services). Я создал учетную запись пользователя специально для SMTP-ретрансляция, и я настроил Postfix, чтобы он отвечал всем требованиям для ретрансляции сообщений через этот сервер. Однако SMTP-сервер Exchange Online будет отклонять сообщения, если только адрес От в точности не совпадает с адресом аутентификации (сообщение об ошибке 550 5.7.1 Client does not have permissions to send as this sender).

При тщательной настройке я могу настроить свои службы для отправки от имени этого пользователя. Но я не большой поклонник осторожности - я бы предпочел, чтобы проблема с postfix была принудительной. Есть ли способ сделать это?

Вот как это реально сделать в постфиксе.

Эта конфигурация изменяет адреса отправителей как для локального, так и для ретранслируемого почтового SMTP-трафика:

/etc/postfix/main.cf:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

Перезаписать адрес конверта из электронной почты, исходящей от самого сервера

/ etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

Перезаписать с адреса в электронной почте с ретрансляцией SMTP

/ etc / postfix / header_check:

/From:.*/ REPLACE From: newsender@address.com

Это очень полезно, например, если вы используете локальный релейный SMTP-сервер, который используется всеми вашими многофункциональными устройствами и несколькими приложениями.

Если вы используете SMTP-сервер Office 365, любая почта с адресом отправителя, отличным от адреса электронной почты от самого аутентифицированного пользователя, будет просто отклонена. Приведенная выше конфигурация предотвращает это.

Необязательный общий table определяет отображение адресов, которое применяется, когда почта доставляется (отправляется) с сервера.

Это противоположность канонический отображение, которое применяется при получении почты сервером.

(Примечание: адреса FROM и TO подходят для замены любой из общих и канонических таблиц.)

Использование канонической таблицы, когда почта получено сервером уже объяснено - это другие ответы.

Можно переписать FROM адреса, когда почта отправлено с сервера с помощью smtp_generic_maps.

В соответствии с документация по postfix :

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    user@localdomain.local      account@isp.example.com
    @localdomain.local          wholedomain@isp.example.com

Затем сделайте:

sudo postmap /etc/postfix/generic
sudo /etc/init.d/postfix reload

Ссылки:

Обновление: по совету друга-айтишника я использую postfix на всех своих серверах, а не создаю один облачный почтовый сервер. Вот мое решение:

/etc/postfix/main.cf

# output of hostname -f - mail from local users appears to come from here
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Local delivery - include all 127.0.0.1 aliases from /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Needed for address translation to work
myorigin = $mydomain

# Talking to MS Online
# :submission = port 587
relayhost = [smtp.mail.microsoftonline.com]:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =   # Yes, leave empty
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic

# Enable if you need debugging, but it does leak credentials to the log
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com

# Only listen on the local interfaces (not the public)
inet_interfaces = localhost

# I left out a bunch of CentOS defaults.  postconf -n is your friend.
# These are included
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

/etc/postfix/sasl_passwd

# Run postmap /etc/postfix/sasl_passwd after editing
# Also, chown root:root; chmod 600
smtp.mail.microsoftonline.com relayer@hosteddomain.com:YourP@ssw0rd

/etc/postfix/generic

# Run postmap /etc/postfix/generic
# I've seen local mail come from either source
# output of dnsdomainname
@compute-1.internal relayer@hosteddomain.com
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal relayer@hosteddomain.com

/etc/aliases

# Run newaliases after changing
# Lot of stuff here. Mostly, just make sure the graph points to root, such as
mailer-daemon:  postmaster
postmaster:     root

# And the important part - your email or distribution group
root:           awsadmins@hosteddomain.com

/etc/passwd

# Sometimes it helps to expand the name, so email comes from 'root at aws host 5'
#  rather than just 'root'
# Was
#root:x:0:0:root:/root:/bin/bash
# Is
root:x:0:0:root on aws host 5:/root:/bin/bash

То, что меня радует:

  • В root отправляется много писем, и одна строка в alias руководит тем, кто его получает.
  • Вся почта от локальных пользователей переводится на приходящую от relayer@hosteddomain.com, поэтому он проходит через SMTP-сервер MS Online.
  • У postfix гораздо лучшая документация, чем у sendmail.

То, что меня не устраивает:

  • Пользовательские изменения требуются для каждого хоста и выполняются в несколько шагов. Я написал сценарий на bash, чтобы помочь.
  • В passwd уловка с именем не всегда работает, и бывает сложно определить, с какого сервера приходит почта.
  • Каждое отправленное письмо помещает в журнал три предупреждения:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list (SMTP-сервер отправляет нуль AUTH список перед STARTTLS, но AUTH LOGIN после).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Есть несколько параметров конфигурации для сертификатов, но я не уверен, прерывается ли доставка почты при обновлении сертификата)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (То же, что # 2)

Спасибо сообществу serverfault за то, что высказали твердое мнение о почтовых серверах.

Ты можешь использовать smtpd_sender_login_maps для указания списка карт: адрес отправителя - пользователь.

Пример:

smtpd_sender_login_maps = 
    hash:/etc/postfix/login-map 

/ etc / postfix / login-map:

mail1@domain    userlogin
mail2@domain    userlogin, otheruser@example.com

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

я использую каноническое отображение чтобы переписать адрес отправителя, например переписать root @ app01 на no-reply@example.com.