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

Как обрабатывать внешний псевдоним с dspam как демон между postfix и dovecot с виртуальными доменами?

У меня следующая ситуация для входящей почты с Postfix 2.9.6, DSpam 3.10.1 и Dovecot 2.1.7:

Incoming Mail -> SMTP -> LMTP -> DSpam (as daemon) -> LMTP -> Dovecot

У меня есть виртуальные домены с виртуальными почтовыми ящиками. Пока все работает нормально.

Теперь возникает проблема с (виртуальными?) Псевдонимами, указывающими на внешний домен. Предположим, у меня есть следующие виртуальные домены:

virtualdomain1.com
virtualdomain2.com

для которого я обрабатываю почту. Сам сервер работает на

mydomain.com

Если я сейчас добавлю псевдоним, указывающий на внешний домен, например:

alias@virtualdomain1.com -> user@externaldomain.com

затем (насколько я могу следить за журналом) DSpam проверяет почту, передает ее Dovecot через LMTP, и Dovecot отклоняет почту, поскольку user@externaldomain.com неизвестен (что, конечно, правда).

Итак, как правильно настроить обработку псевдонимов для виртуальных доменов? Если возможно, я бы также хотел проверить входящую почту на предмет виртуальных псевдонимов.

Журнал входящего сообщения на alias@virtualdomain1.com:

postfix/smtpd[23910]: connect from xxx.anyhost.com[1.2.3.4]
postfix/smtpd[23910]: NOQUEUE: filter: RCPT from xxx.anyhost.com[1.2.3.4]: <alias@virtualdomain1.com>: Recipient address triggers FILTER lmtp:unix:/dspam/dspam.sock; from=<sender@anyhost.com> to=<alias@virtualdomain1.com> proto=ESMTP helo=<anyhost.com>
postfix/smtpd[23910]: D91D0771AF70: client=xxx.anyhost.com[1.2.3.4]
postfix/cleanup[23917]: D91D0771AF70: message-id=<550937C8.9050901@anyhost.com>
postfix/smtpd[23910]: disconnect from xxx.anyhost.com[1.2.3.4]
postfix/qmgr[23278]: D91D0771AF70: from=<sender@anyhost.com>, size=1030, nrcpt=1 (queue active)
dovecot: lmtp(23920): Debug: none: root=, index=, control=, inbox=, alt=
dovecot: lmtp(23920): Connect from local
dovecot: lmtp(23920): Debug: Loading modules from directory: /usr/lib/dovecot/modules
dovecot: lmtp(23920): Debug: Module loaded: /usr/lib/dovecot/modules/lib90_sieve_plugin.so
dovecot: auth-worker(23921): mysql(127.0.0.1): Connected to database postfixadmin
dspam[9421]: Got error 550 in response to RCPT TO: 550 5.1.1 <user@exampledomain.com> User doesn't exist: user@exampledomain.com#015
dovecot: auth-worker(23921): sql(user@exampledomain.com): unknown user
dovecot: lmtp(23920): Debug: auth input:
dovecot: lmtp(23920): Disconnect from local: Client quit (in RCPT TO)
postfix/lmtp[23918]: D91D0771AF70: to=<user@exampledomain.com>, orig_to=<alias@virtualdomain1.com>, relay=mail.mydomain.com[/dspam/dspam.sock], delay=0.98, delays=0.47/0.01/0/0.5, dsn=5.3.0, status=bounced (host mail.mydomain.com[/dspam/dspam.sock] said: 530 5.3.0 <user@exampledomain.com> Fatal: 550 5.1.1 <user@exampledomain.com> User doesn't exist: user@exampledomain.com (in reply to end of DATA command))
postfix/cleanup[23917]: 149CB771AF72: message-id=<20150318083110.149CB771AF72@mail.mydomain.com>
postfix/bounce[23923]: D91D0771AF70: sender non-delivery notification: 149CB771AF72
postfix/qmgr[23278]: 149CB771AF72: from=<>, size=3182, nrcpt=1 (queue active)
postfix/qmgr[23278]: D91D0771AF70: removed
postfix/smtp[23925]: 149CB771AF72: to=<sender@anyhost.com>, relay=mx.mydomain.com[1.2.3.5]:25, delay=3.9, delays=0.26/0.01/0.09/3.6, dsn=2.0.0, status=sent (250 OK id=1YY9Ne-0007eJ-Hp)
postfix/qmgr[23278]: 149CB771AF72: removed

Постфикс main.cf: smtpd_banner = $ myhostname ESMTP $ mail_name (Debian / GNU) biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

# BECAUSE we use Dovecot for authentication we also use its certificates
smtpd_tls_cert_file=/etc/dovecot/dovecot.pem
smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes

#Handing off local delivery to Dovecot's LMTP, and telling it where to store mail
virtual_transport = lmtp:unix:private/dovecot-lmtp

#Virtual domains, users, and aliases
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf
virtual_mailbox_maps =
    proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf,
    proxy:mysql:$config_directory/mysql_virtual_alias_domain_mailbox_maps.cf,
    proxy:mysql:$config_directory/mysql_virtual_alias_domain_catchall_maps.cf
virtual_alias_maps =
    proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf,
    proxy:mysql:$config_directory/mysql_virtual_alias_domain_maps.cf
virtual_mailbox_limit = proxy:mysql:$config_directory/mysql_virtual_mailbox_limit_maps.cf

myhostname = mail.me.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost, $myhostname
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 1000000000
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

#Enabling SMTP for authenticated users, and handing off authentication to Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unauth_destination,
        check_recipient_access pcre:/etc/postfix/dspam_filter_access,
        permit

Файл dspam_filter_access:

/./  FILTER lmtp:unix:/dspam/dspam.sock

И последнее замечание: если я прокомментирую эту строку

#check_recipient_access pcre:/etc/postfix/dspam_filter_access,

все работает нормально, но конечно без проверки на спам.

В ваших текущих настройках, описанных выше, ни dovecot, ни dspam не могут перенаправить вашу электронную почту в нужное место назначения. Специально для dovecot, он может принимать электронную почту только в зависимости от конфигурации домена.

Решение - изменить свой dspam настроить доставку электронной почты назад к постфиксу после сканирования вместо отправки в голубятню. При такой настройке после сканирования механизм маршрутизации postfix перенаправит вашу электронную почту.

  • на внешний почтовый сервер, если адрес получателя указывает на внешний домен
  • в dovecot, если адрес получателя совпадает с вашим виртуальным доменом

Другими словами

[ Outside ] --smtp--> [ Postfix ] --lmtp--> [ dspam ] --smtp--> [ postfix ] --> dovecot (if localdomain) or another mail server (if external domain)

Вы можете настроить его как настройку dspam в этот учебник. Сводка шагов

  1. Добавьте второй постфиксный прослушиватель smtpd в master.cf, например localhost: 10026
  2. Вместо использования dspam_filter_access для доставки электронной почты в dspam вы можете использовать параметр content_filter
  3. Измените конфигурацию Доставка {Host, Port, Proto} в DSPAM для постфикса второго smtpd
  4. Отключить сопоставление адресов (no_address_mappings) content_filter и еще одно ограничение во втором smtpd

Вы можете полностью обойти проверку DSPAM на наличие внешних псевдонимов.

Incoming Mail -> SMTP -> External address

Удалите строку check_recipient_access и вместо этого установите dspam как virtual_transport по умолчанию:

virtual_transport = lmtp:unix:/dspam/dspam.sock

Экономит ресурсы и пропускает сумасшедшие локальные скачки. Электронная почта, скорее всего, в любом случае будет проверена на спам на внешнем адресате ... ;-)