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

Использование нескольких «myhostname» в постфиксе

Позволяет ли postfix динамически изменять "myhostname"? Я много прошился, но ничего качественного не нашел. Моя установка - это несколько доменов postfix, несколько ip (настроено в master.cf) и несколько dkim sig, но директива myhostname в master.cf не включена.

Такие вещи:

192.168.1.12:smtp inet n - n - - smtpd -o myhostname=mail.mail2.com -o smtpd_banner=mail.mail2.com -o smtp_helo_name=mail.mail2.com

В любом случае, с баннером и вертолетом все в порядке, но имя моего хоста все еще включено в main.cf

Postfix легко настраивается. настолько, что rtfming кажется лишь немного более выгодным, чем просмотр источник (только пошутил).

На самом деле существует множество способов динамического переопределения статической конфигурации. Как минимум требуется некоторое понимание рабочего процесса Postfix. это в обзор.

Также полезно понимать:

  • разные демоны Postfix ссылаются на разные части main.cf статическая конфигурация.
  • большинство встроенных служб Postfix можно настраивать;
  • специальные индивидуальные услуги (Милтерс и т. д.) могут быть включены в рабочий процесс;
  • если все остальное терпит неудачу, несколько экземпляров Postfix может быть развернут; каждый относится к отдельным main.cf и master.cf статические конфигурации


Согласно OP, wrt условно отправляет почту некоторым внешним получателям:

Представляющие интерес методы - это те, которые зависят от:

  • в smptd порт прослушивания
  • доменное имя отправителя

Очевидно, именно в этом отношении и по причинам, которые, надеюсь, скоро станут ясны, Wietse Venema внес несколько * ключевых изменений в Postfix 2.7 делать с фильтрация содержимого Итак, чтобы подвести итог:

префикс Postfix 2.7:

если не указано иное, по умолчанию местом назначения nexthop является $ myhostname (т.е. localhost).


Постфикс 2.7:

если не указано иное, по умолчанию местом назначения nexthop является домен получателя.

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


Это различие является проблемой, потому что все еще есть люди, застрявшие на установках Postfix до 2.7 .. то есть: для некоторых пользователей Red Hat, полагающихся на официальные rpms, то, например, пользователи все еще используют CentOS 5x => Postfix 2.3 и для CentOS 6x => Postfix 2.6 (но я могу ошибаться, Дёр и т. д.)


Постфикс 2.7:

Все стало проще! Ниже приведены несколько методов.

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

  • порт 10026 => custom1_smtp
  • порт 10027 => custom2_smtp

Это стало возможным благодаря динамическому определению служба настраиваемых фильтров и переопределение content_filter директива в smtpd служба. фильтр фиктивный. на самом деле мы не собираемся писать и развертывать нашу собственную службу настраиваемых фильтров. вместо этого мы просто захватываем постфикс smtp экземпляр службы с единственной целью - получить доступ и динамически переопределить myhostname директиву до того, как электронное письмо будет окончательно отправлено на всеобщее обозрение.

Это может произойти только в Postfix 2.7 (и, возможно, в последующих версиях выше), потому что указанное по умолчанию назначение следующего транспорта определено как домен получателя. В версиях ниже Postfix 2.7 он определяется как $myhostname и поэтому электронное письмо возвращается в Postfix, заставляя его работать.


Второй способ по книге и использует sender_dependent_default_transport_maps условно перенаправить нашу исходящую электронную почту на еще пару настраиваемых транспортов; и зависит от доменного имени отправителя:

  • parrots.tld => custom3_smtp:
  • penguins.tld => custom4_smtp:

В sender_dependent_default_transport_maps вести себя как sender_dependent_relayhost_maps но вместо маршрутизации исходящей почты из указанного домена отправителя в указанный конечный домен, sender_dependent_default_transport_maps используются для внутренней маршрутизации исходящей почты от указанного отправителя (домена) к указанному (заказной) транспорт определено в master.cf.


Мы добавляем следующую директиву в /etc/postfix/main.cf:

sender_dependent_default_transport_maps = hash:/etc/postfix/sender_transports


Затем создайте файл сопоставления /etc/postfix/sender_transports:

@parrots.tld    custom3_smtp:
@penguins.tld   custom4_smtp:

& построить базу данных, используя postmap:

postmap hash:/etc/postfix/sender_transports


Затем мы определяем все наши настраиваемые транспорты в /etc/postfix/master.cf:

custom4_smtp      unix  -       -       n       -       -        smtp
             -o myhostname=mailer.external.penguins.tld
             -o smtp_bind_address=m.n.o.p
             -o smtp_helo_name=penguins.tld


custom3_smtp      unix  -       -       n       -       -        smtp
             -o myhostname=mailer.external.parrots.tld
             -o smtp_bind_address=i.j.k.l
             -o smtp_helo_name=parrots.tld


custom2_smtp      unix  -       -       n       -       -        smtp
             -o myhostname=mailer.external.cats.tld
             -o smtp_bind_address=e.f.g.h
             -o smtp_helo_name=cats.tld


custom1_smtp      unix  -       -       n       -       -        smtp
             -o myhostname=mailer.external.dogs.tld
             -o smtp_bind_address=a.b.c.d
             -o smtp_helo_name=dogs.tld



# our main internal entry for the dogs site; all outgoing dogs traffic is
# sent to this (non-standard) port and routed to our custom1_smtp transport
10026             inet  n      -        n       -       -        smtpd
             -o myhostname=mailer.internal.dogs.tld
             -o content_filter=custom1_smtp:  


# our main internal entry for the cats site; all outgoing cats traffic is
# sent to this (non-standard) port and routed to our custom2_smtp transport
10027             inet  n      -        n       -       -        smtpd
             -o myhostname=mailer.internal.cats.tld
             -o content_filter=custom2_smtp:  


# default smtpd entry;  outgoing traffic sent to this port (25) will get routed 
# subject to the conditions in our sender_dependent_default_transport_maps file
smtp              inet  n      -        n       -       -        smtpd
             -o myhostname=mailer.internal.tld


# hoorah.
#


до Postfix 2.7:

Обычно пикси Postfix предлагают установить несколько экземпляров Postfix.

Но здесь пригодится понимание рабочего процесса Postfix ... потому что, разработав настраиваемая цепочка служб Postfix, это также возможно с помощью всего лишь одного экземпляра Postfix. ничего в main.cf нужно изменить. статическая конфигурация динамически переопределяется из пользовательских цепочек служб, которые мы определяем в master.cf.

Каждая служба читает свое собственное подмножество всех директив, находящихся в main.cf config. так что по мере продвижения по нашей цепочке настраиваемых служб мы можем переопределить любые настройки, которые могут быть разрешены в каждой соответствующей службе Postfix в цепочке.

(Кроме того, обратите внимание, что мы могли бы даже написать нашу собственную замену для любого из демонов Postfix по умолчанию. Что довольно круто).


В /etc/postfix/master.cf:

# each Postfix service reads it's own subset of directives from main.cf config.
# many settings can be dynamically overridden as we move thro the service chain..
# here we override the $myhostname setting depending upon which port we send our 
# outgoing smtp email to.

# custom2  cats service chain 
custom2_cleanup   unix  n       -       -       -       0        cleanup             -o queue_service_name=custom2_qmgr
custom2_qmgr      fifo  n       -       n       300     1        qmgr                -o rewrite_service_name=custom2_rewrite
custom2_rewrite   unix  -       -       n       -       -        trivial-rewrite     -o default_transport=custom2_smtp:
custom2_smtp      unix  -       -       n       -       -        smtp
             -o myhostname=mailer.external.cats.tld
             -o smtp_bind_address=e.f.g.h
             -o smtp_helo_name=cats.tld


# custom1 dogs service chain 
custom1_cleanup   unix  n       -       -       -       0        cleanup             -o queue_service_name=custom1_qmgr
custom1_qmgr      fifo  n       -       n       300     1        qmgr                -o rewrite_service_name=custom1_rewrite
custom1_rewrite   unix  -       -       n       -       -        trivial-rewrite     -o default_transport=custom1_smtp:
custom1_smtp      unix  -       -       n       -       -        smtp
             -o myhostname=mailer.external.dogs.tld
             -o smtp_bind_address=a.b.c.d
             -o smtp_helo_name=dogs.tld


# our main internal entry for the dogs site; all outgoing dogs traffic is
# sent to this (non-standard) port and routed to our custom1 service chain
10026             inet  n      -        n       -       -        smtpd
             -o myhostname=mailer.internal.dogs.tld
             -o cleanup_service_name=custom1_cleanup
           # NB: attempting to override the content_filter directive 
           # *will not work* in postfix < 2.7 since an unspecified nexthop 
           # destination defaults to localhost and causes the email to loop
           # -o content_filter=custom1_smtp:  


# our main internal entry for the cats site; all outgoing cats traffic is
# sent to this (non-standard) port and routed to our custom2 service chain
10027             inet  n      -        n       -       -        smtpd
             -o myhostname=mailer.internal.cats.tld
             -o cleanup_service_name=custom2_cleanup

# yeehar! acu ;)
#


ПРИМЕЧАНИЕ 1: предостережение:
а такие директивы, как cleanup_service_nameи rewrite_service_name являются задокументировано в параметры конфигурации, они не задокументированы как параметры настраиваемых опций для любого из Postfix. демоны?!

По крайней мере, это кажется недокументированный подход и, следовательно, вполне может быть осужден или даже возможно считаться злом в официальных кругах. ~ я бы не знал, потому что я никогда не мог сформулировать достаточно убедительный вопрос, чтобы когда-либо выдержать postfix-users@postfix.org официальные списки рассылки!


ЗАМЕТКА 2:
есть люди, пытающиеся сделать это другими творческими способами, такими как установка ФИЛЬТРА header_checks, чтобы преодолеть значение по умолчанию localhost следующий пункт назначения путем динамического создания полного transport:recipient-domain-destination:

В /etc/postfix/master.cf:

custom2_smtp      unix  -       -       n       -       -        smtp
             -o myhostname=mailer.external.cats.tld
             -o smtp_bind_address=e.f.g.h
             -o smtp_helo_name=cats.tld

custom2_cleanup   unix  n       -       -       -       0        cleanup 
             -o header_checks=regexp:/etc/postfix/custom2_header_checks

#conditional processing contingent upon entry via some non-standard port
10027             inet  n      -        n       -       -        smtpd
             -o myhostname=mailer.internal.cats.tld
             -o cleanup_service_name=custom2_cleanup


Затем в /etc/postfix/custom2_header_checks, вытащите домен получателя из полей заголовка с помощью регулярного выражения и передайте его в директиву фильтра следующим образом:

/^To:.*@(.*)$/      FILTER    custom2_smtp:$1

Хотя это может показаться хорошей идеей и частично работает, тем не менее, это ужасный прием; потенциально небезопасен и, по крайней мере, не работает, если / когда исходящее письмо содержит несколько получателей. да!


ЗАМЕТКА 3:
если ничего из вышеперечисленного не имеет никакого смысла, то вам, вероятно, нужно сделать еще немного rtfming;)

А если серьезно, я знаю, что здесь довольно много всего ... по разным причинам, не зависящим от меня, бизнес застрял на Postfix 2.3, и мне пришлось потратить более 5 минут на сортировку их требований; до такой степени, что моя почасовая ставка уменьшилась до сборщик коста-риканских ананасов (только я не выгоды от их стоимости жизни). поэтому я попытался изложить все это, пока это свежо в моей голове, и в терминах, которые не просто повторяют официальную документацию; надеюсь, это может помочь следующей бедной душе, которая пойдет по этому пути;)

После долгих испытаний я должен сделать вывод, что вы не можете этого сделать. МОЖНО динамически изменять myhostname, это просто не влияет на заголовок Received.

В тесте с использованием баннера $ myhostname я вижу, что он меняется, когда я использую

-o myhostname=test.test.test

но полученный заголовок - нет.

Я пробовал использовать в main.cf

mydomain=test.test.test
myhostname=$mydomain

Это влияет как на заголовок Received, так и на баннер. Но пытаясь переопределить $ mydomain

-o mydomain=test.test.test

снова влияет только на баннер.

Таким образом, кажется, что переменная, используемая в заголовке Received, заполняется из $ myhostname перед переопределение $ myhostname из аргументов командной строки.