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

Postfix не передает почту в Amavis при получении от Z-push

Я как бы вслепую смотрю, как заставить ActiveSync правильно работать с моим почтовым сервером, так что, может быть, у кого-нибудь есть идея?

Дело в том, что на почтовом сервере размещены четыре домена, и я хочу, чтобы все отправленные письма имели подпись DKIM.

Я заставил его работать при отправке через SMTP, но он не подписывает, когда клиент использует ActiveSync для отправки электронной почты.

В любом случае вот схема того, как это работает для SMTP:

Большая часть волшебства в том, как Postfix описывает, как идентифицировать почту, отправленную от аутентифицированного пользователя, которая принадлежит одному из моих размещенных доменов, по сравнению с почтой откуда-то из Интернета, исходит из этой строки в /etc/postfix/main.cf:

smtpd_sender_restrictions = 
    check_sender_access regexp:/etc/postfix/tag_as_originating.re, 
    permit_mynetworks, 
    permit_sasl_authenticated, 
    check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, 
    check_sender_access regexp:/etc/postfix/tag_as_foreign.re

content_filter = amavis:[127.0.0.1]:10024

Содержание /etc/postfix/tag_as_foreign.re:

/^/ FILTER amavis:[127.0.0.1]:10024

Amavis отправил результат обратно в Postfix, используя порт 10025, который обрабатывается /etc/postfix/master.cf с этой конфигурацией:

127.0.0.1:10025 inet n - n - - smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks, reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o receive_override_options=no_unknown_recipient_checks, no_header_body_checks
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes

Содержание /etc/postfix/tag_as_originating.re:

/^/ FILTER amavis:[127.0.0.1]:10026

Результат отправляется обратно в Postfix через порт 10027 и обрабатывается этим кодом в /etc/postfix/master.cf:

127.0.0.1:10027 inet n - n - - smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks, reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o receive_override_options=no_unknown_recipient_checks, no_header_body_checks
    -o smtp_send_xforward_command=yes
    -o milter_default_action=accept
    -o milter_macro_daemon_name=ORIGINATING
    -o disable_dns_lookups=yes

Наконец, вот соответствующие строки в master.cf о том, как почта попадает в Postfix в первую очередь:

smtp      inet  n       -       y       -       -       smtpd

pickup    unix  n       -       y       60      1       pickup

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated, reject

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated, reject

Я использую Z-push для обработки соединений через ActiveSync, но моя проблема заключается в следующем:

Я заметил в mail.log, что, хотя в конфигурационных файлах z-push указано, что он должен передавать входящие письма в postfix через SMTP, он по-прежнему настаивает на помещении входящих писем непосредственно в каталог maildrop, который, в свою очередь, обрабатывается демоном захвата Postfix.

Оттуда почта либо пересылается прямо на адрес получателя, даже без подписи DKIM от Amavis.

Возникает вопрос: как я могу заставить Postfix передавать почту от демона перехвата в Amavis, чтобы он мог получить подпись DKIM, прежде чем быть перенаправленным по назначению?

Это так просто, как просто вставить строку под pickup в master.cf с текстом:

-o content_filter = amavis:[127.0.0.1]:10026

... или противоречит уже существующим настройкам? :-)

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

Вот объяснение того, что происходит.

Z-push написан на PHP, и что я смог найти в Интернете, так это то, что настройки почты PHP управляются через php.ini.

В php-ini-file вам сообщат, что единственная доступная опция при отправке почты - через sendmail и поэтому все полученные письма, полученные от Z-push, всегда будут отправляться в папку maildrop, которую затем обрабатывает демон Postfix pickup.

Настройки SMTP работают, только если они установлены на хосте Windows.

Это немного глупо, если вы спросите меня, но в любом случае мне нужно выбрать другой маршрут, если я хочу подписывать письма с подписью DKIM, полученной по протоколу ActiveSync (также известному как Z-push).

Мне нужно было как подозревать добавить content_filter к строке, следующей за pickup линия в /etc/postfix/master.cf, но мне также нужно было немного подправить мой файл конфигурации Amavis.

Файл /etc/postfix/master.cf в основном такой же, как и раньше, за исключением того, что когда вы идете к линии приема, теперь говорится:

amavis unix - - y - 2 smtp 
   -o smtp_data_done_timeout=1200
   -o smtp_send_xforward_command=yes
   -o smtp_bind_address=

pickup    unix  n       -       y       60      1       pickup
   -o content_filter=amavis:[127.0.0.1]:10026

Я добавил раздел amavis, так как обнаружил, что если он закомментирован, то Amavis никогда не вызывается. Просто для полноты всего. :-)

В /etc/amavis/conf.d/50-user следующая конфигурация показывает, как Amavis различает входящую почту из любого места на мои почтовые учетные записи и почту, отправленную из одной из моих учетных записей куда угодно:

$inet_socket_port = [10024,10026];

$forward_method = 'smtp:[127.0.0.1]:10025';
$notify_method = 'smtp:[127.0.0.1]:10027';

$interface_policy{'10026'} = 'ORIGINATING';
$policy_bank{'ORIGINATING'} = {
    originating => 1,
    smtpd_discard_ehlo_keywords => ['8BITMIME'],
    forward_method => 'smtp:[127.0.0.1]:10027',
};

# IP-Addresses for internal networks => load policy MYNETS
# - requires -o smtp_send_xforward_command=yes in postfix master.cf
@mynetworks = qw(0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 
                 [::1] [FE80::]/10 [FEC0::]/10);

# Allow SMTP access from IPs in @inet_acl to amvisd SMTP Port
@inet_acl = qw( 127.0.0.1 [::1] 192.168.0.0/16 );

# DKIM
$enable_dkim_verification = 1; 
$enable_dkim_signing = 1; # load DKIM signing code
$signed_header_fields{'received'} = 0;  # turn off signing of Received
@dkim_signature_options_bysender_maps = (
{ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );

Я упомянул настройку, которая заключалась в том, что раньше у меня были следующие строки /etc/amavis/conf.d/50-user:

$forward_method = 'smtp:[127.0.0.1]:*';
$notify_method = 'smtp:[127.0.0.1]:*';

$policy_bank{'ORIGINATING'} = {
    originating => 1,
    smtpd_discard_ehlo_keywords => ['8BITMIME'],
};

Путь * работает так: все, что Amavis получает на порт (например, «10025»), будет возвращено на порт на один выше (например, «10026»).

Мне нужно было быть немного более явный - во избежание путаницы.

Я надеюсь, что это поможет, если кто-то еще ругает свой экран, пытаясь заставить DKIM работать с Postfix и Amavis. :-)