Postifix: используйте myorigin=$myhostname для локальной электронной почты и myorigin=$mydomain для доверенных сетей

Postifix: используйте myorigin=$myhostname для локальной электронной почты и myorigin=$mydomain для доверенных сетей

У меня есть экземпляр Postfix, настроенный на перезапись адресов, что позволяет канонизировать заголовок from.

Текущие (требуемые?) конфигурации

Вот соответствующие конфигурации:

# Basic conf
myhostname = hostname.example.test
mydomain = example.test
mynetworks = 127.0.0.0/8,1.2.3.4/32
myorigin = $mydomain
mydestination =

# Rewrite options
append_at_myorigin = yes
local_header_rewrite_clients = permit_mynetworks
sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps = hash:/etc/postfix/sender_canonical
recipient_canonical_classes = envelope_recipient, header_recipient
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical

# restrictions (redacted for readability)
smtpd_sender_restrictions = permit_mynetworks, reject_non_fqdn_sender, permit

Желаемый результат

Я хочу добиться этого:

  1. при получении электронного письма с адреса 127.0.0.1 From: rootоно перезаписывается как (т.е. root@$hostname)From: [email protected]
  2. при получении электронного письма от 1.2.3.4, From: rootоно переписывается как (т.е. root@$mydomain)From: [email protected]
  3. при получении электронного письма от кого-либо другого, электронное письмо From: rootотклоняется (поскольку reject_non_fqdn_senderустановлено ограничение)

Проблема

Переменная $myoriginдолжна быть разной в зависимости от адреса получения, но я не могу найти способ сделать это. До сих пор я пробовал много решений, но безуспешно.

Неудачная попытка...

Я пробовал создать две главные службы smtp — 127.0.0.1:smtpс myorigin = $myhostnameи 192.168.1.2:smtpс myorigin = $mydomain— но поскольку опция myorigin связана с процессом trivial-rewrites, она игнорируется.

Отображение для canonical/, virtualпо-видимому, непригодно, поскольку оно происходит после выполнения тривиальных перезаписей.

Сопоставление для aliasesкажется бесполезным, поскольку они используются после того, как сообщение определено для отправки в $mydestination, но это сообщения в другом месте.

решение1

Благодарябеспокойствообратная связь Я нашел решение.

Схема решения

В соответствии сОфициальные документы PostfixЧто касается переписывания, то основное дерево процесса выглядит следующим образом:

smtp   --+--> cleanup --> rewrite --> [queue]
pickup --/

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

192.168.1.2:smtp  --+--> cleanup --> rewrite ------------+--> [queue]
127.0.0.1:smtp  --+--> cleanup_local --> rewrite_local --/
pickup -----------/

Конфигурация

Это main.cfконфигурация, которая представляет внешние IP-конфигурации:

#  configure the global desiderata

# Basic conf (for display purpose, use your own configuration)
# myhostname = hostname.example.test
# mydomain = example.test
# mydestination =
# mynetworks = 127.0.0.0/8,1.2.3.4/32

# Rewrite options
myorigin = $mydomain
append_at_myorigin = yes
local_header_rewrite_clients = permit_mynetworks
sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps = hash:/etc/postfix/sender_canonical
recipient_canonical_classes = envelope_recipient, header_recipient
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical

# restrictions (redacted for readability)
smtpd_sender_restrictions = permit_mynetworks, reject_non_fqdn_sender, permit

Это master.cfконфигурация с настроенным конвейером:

# add this for local smtp service
127.0.0.1:smtp      inet  n       -       n       -       -       smtpd
  -o myorigin=$myhostname
  -o cleanup_service_name=cleanup_local
  -o inet_interfaces=loopback-only
  -o local_header_rewrite_clients=permit_inet_interfaces

# edit pickup sevice with this two options
pickup    unix  n       -       n       60      1       pickup
  -o myorigin=$myhostname
  -o cleanup_service_name=cleanup_local

# add this for local email cleanup
cleanup_local   unix  n       -       n       -       0       cleanup
  -o myorigin=$myhostname
  -o rewrite_service_name=rewrite_local

# add this for local email basic rewrite
rewrite_local   unix  -       -       n       -       -       trivial-rewrite
  -o myorigin=$myhostname
  -o local_header_rewrite_clients=permit_inet_interfaces

# Then for each public IP assigned to the machine, add smtp service like this
192.168.3.85:smtp      inet  n       -       n       -       -       smtpd
# and remove default service smtp inet [..cut..] smtpd

Связанный контент