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

Postfix: пересылка электронной почты на нелокальный адрес - расширено от пользователя unknown

У меня проблемы с postfix, особенно при создании локального виртуального псевдонима для пересылки электронной почты на внешние адреса (на других серверах).

Моя цель -: Пересылать все письма, отправленные на fwd@xyz.com к final-address@external-server.com (виртуальный пользователь на другом сервере, например в Gmail и т. д.).

Я пытался установить это с помощью virtual_alias_maps Это был результат:

This is the mail system at host my-server.xyz.com.

I'm sorry to have to inform you that your message could not
be delivered (...)

<final-address@external-server.com> (expanded from <fwd@xyz.com>): user unknown
Reporting-MTA: dns; my-server.xyz.com

Он знает, что письмо должно быть отправлено на final-address@external-server.com однако он говорит, что не может найти этого пользователя? Это ищет final-address@external-server.com на собственных виртуальных пользователях? Зачем?

У меня несколько записей в virtual_alias_maps которые пересылают электронную почту внутри, например site@xyz.com перенаправлен / имеет псевдоним person.surname@xyz.com и это работает. тем не мение когда пункт назначения - внешний адрес, я получаю ошибку выше.

Часть моей main.cf:

smtpd_recipient_restrictions = 
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_invalid_hostname,
    reject_non_fqdn_sender,
    reject_unknown_client_hostname,
    reject_unknown_sender_domain,
    reject_unknown_recipient_domain,
    reject_unknown_address,
    reject_non_fqdn_recipient,
    reject_unauth_destination,
    reject_unauth_pipelining

smtpd_client_restrictions = 
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_invalid_hostname,
    check_client_access regexp:/etc/postfix/checks/client_restrictions,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client cbl.abuseat.org

smtpd_sender_restrictions = 
    permit_mynetworks,
    reject_unknown_address,
    reject_unknown_sender_domain,
    reject_non_fqdn_sender,
    #reject_sender_login_mismatch
    reject_authenticated_sender_login_mismatch

smtpd_helo_restrictions = 
    permit_sasl_authenticated,
    permit_mynetworks,
    check_helo_access hash:/etc/postfix/checks/helo_access,
    reject_non_fqdn_helo_hostname,
    reject_invalid_helo_hostname,
    reject_unknown_helo_hostname,
    permit

smtpd_sender_login_maps = mysql:/etc/postfix/virtual/mysql-sender-login-maps.cf

# Virtual Maps 
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/virtual/mysql-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/virtual/mysql-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/virtual/mysql-alias-maps.cf

virtual_alias_maps работает на этом SQL:

query = SELECT destination FROM `VirtualAlias` WHERE source='%s' AND active = 1

А для приведенных выше примеров в нем были следующие записи:

id | source | destination | active
1 site@xyz.com person.surname@xyz.com 1
2 fwd@xyz.com final-address@external-server.com 1

Верно ли мое предположение, когда я говорю, что ищет final-address@external-server.com на собственных виртуальных пользователей, а затем сбой (потому что это, очевидно, внешняя электронная почта)? Если да, то как я могу это исправить?

Спасибо.


Нет отправки через порт 25: Ни один почтовый клиент не может отправлять электронную почту через порт 25, они вынуждены переходить через порт 587 (MSA). => Они тоже получают user unknown если они пытаются отправить электронную почту через порт 25 (для внешних направлений работают внутренние). Может это что-то связано с этим?

Я думаю, это происходит потому, что контроль спама Фильтр содержимого, приведенный ниже, заставляет всю отправленную электронную почту доставляться непосредственно в dovecot и если пункт назначения не является одним из наших виртуальных пользователей, он не работает ...

Кроме того, подача контролируется следующим образом:

submission inet n       -       -       -       -       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

** может быть, ограничения smtpd_client_restrictions усложняют задачу? **

Контроль спама: master.cf был изменен на отправку всей электронной почты через фильтр содержимого:

smtp      inet  n       -       -       -       -       smtpd -o content_filter=spamassassin

spamassassin unix -     n   n   -   -   pipe
    flags=DROhu user=vmail:vmail argv=/usr/bin/spamc -f -e /usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop} 

Предлагаемые проверки @clement:

postmap -q external-server.com mysql:/etc/postfix/virtual/mysql-mailbox-maps.cf
postmap -q external-server.com mysql:/etc/postfix/virtual/mysql-mailbox-domains.cf

=> оба дают пустые результаты, как и ожидалось, поскольку external-server.com не указан там.

Определение virtual_alias_domains не помогло. Та же проблема. Надо ли его установить? Насколько я понимаю, если virtual_alias_domains постфикс пуст, дальше будем смотреть virtual_alias_maps.


Предлагаемые проверки @Guntis:

Как я и подозревал postfix, похоже, пытается доставить переадресованное письмо в spamassassin + dovecot, прочтите выше No Port 25 Sending и мои комментарии:

postfix/smtpd[]: < remote-incoming.server.com[87.x.x.x]: RCPT TO:<fwd@xyz.com>
postfix/smtpd[]: extract_addr: input: <fwd@xyz.com>
postfix/smtpd[]: smtpd_check_addr: addr=fwd@xyz.com
postfix/smtpd[]: send attr request = rewrite
postfix/smtpd[]: send attr rule = local
postfix/smtpd[]: send attr address = fwd@xyz.com
postfix/smtpd[]: private/rewrite socket: wanted attribute: flags
postfix/smtpd[]: input attribute name: flags
postfix/smtpd[]: input attribute value: 0
postfix/smtpd[]: private/rewrite socket: wanted attribute: address
postfix/smtpd[]: input attribute name: address
postfix/smtpd[]: input attribute value: fwd@xyz.com
postfix/smtpd[]: private/rewrite socket: wanted attribute: (list terminator)
postfix/smtpd[]: input attribute name: (end)
postfix/smtpd[]: rewrite_clnt: local: fwd@xyz.com -> fwd@xyz.com
postfix/smtpd[]: send attr request = resolve
postfix/smtpd[]: send attr sender =
postfix/smtpd[]: send attr address = fwd@xyz.com
postfix/smtpd[]: private/rewrite socket: wanted attribute: flags
postfix/smtpd[]: input attribute name: flags
postfix/smtpd[]: input attribute value: 0
postfix/smtpd[]: private/rewrite socket: wanted attribute: transport
postfix/smtpd[]: input attribute name: transport
postfix/smtpd[]: input attribute value: lmtp
postfix/smtpd[]: private/rewrite socket: wanted attribute: nexthop
postfix/smtpd[]: input attribute name: nexthop

# 1. WHY?? unix:private/dovecot-lmtp

postfix/smtpd[]: input attribute value: unix:private/dovecot-lmtp
postfix/smtpd[]: private/rewrite socket: wanted attribute: recipient
postfix/smtpd[]: input attribute name: recipient
postfix/smtpd[]: input attribute value: fwd@xyz.com

postfix/smtpd[]: resolve_clnt: `' -> `fwd@xyz.com' -> transp=`lmtp' host=`unix:private/dovecot-lmtp' rcpt=`fwd@xyz.com' flags= class=virtual

# 2. Tries to lookup on MySQL fwd@xyz.com (acording to virtual_alias_maps)

postfix/smtpd[]: dict_mysql_lookup: retrieved 1 rows
postfix/smtpd[]: maps_find: virtual_alias_maps: mysql:/etc/postfix/virtual/mysql-alias-maps.cf(0,lock|fold_fix): fwd@xyz.com = final-address@external-server.com
postfix/smtpd[]: mail_addr_find: fwd@xyz.com -> final-address@external-server.com

# 3. It knows it should be delivered to another address...

postfix/smtpd[]: report recipient to all milters (flags=0x0)
postfix/smtpd[]: milter_macro_lookup: "i"
postfix/smtpd[]: milter_macro_lookup: "{rcpt_addr}"
postfix/smtpd[]: ctable_locate: leave existing entry key fwd@xyz.com
postfix/smtpd[]: milter_macro_lookup: result "fwd@xyz.com"
postfix/smtpd[]: milter_macro_lookup: "{rcpt_host}"
postfix/smtpd[]: ctable_locate: leave existing entry key fwd@xyz.com
postfix/smtpd[]: milter_macro_lookup: result "unix:private/dovecot-lmtp"
postfix/smtpd[]: milter_macro_lookup: "{rcpt_mailer}"
postfix/smtpd[]: ctable_locate: leave existing entry key fwd@xyz.com
postfix/smtpd[]: milter_macro_lookup: result "lmtp"

# 4. Is it still trying to deliver on fwd@xyz.com?? 

postfix/smtpd[]: milter8_rcpt_event: milter inet:localhost:12301: rcpt <fwd@xyz.com>
postfix/smtpd[]: event: SMFIC_RCPT; macros: {rcpt_addr}=fwd@xyz.com {rcpt_host}=unix:private/dovecot-lmtp {rcpt_mailer}=lmtp
postfix/smtpd[]: reply: SMFIR_CONTINUE data 0 bytes

# After a while it delivers the error notification

postfix/pipe[]: 2E2CA2E2DB3: to=<final-address@external-server.com>, orig_to=<fwd@xyz.com>, relay=spamassassin, delay=0.63, delays=0.29/0/0/0.33, dsn=5.1.1, status=bounced (user unknown)
postfix/cleanup[]: 920F92E2DC3: message-id=<20161219134225.920F92E2DC3@my-server.xyz.com>
postfix/bounce[]: 2E2CA2E2DB3: sender non-delivery notification: 920F92E2DC3