![Postfix 仅在尝试发送到后备中继时“循环回到自己”](https://linux22.com/image/766552/Postfix%20%E4%BB%85%E5%9C%A8%E5%B0%9D%E8%AF%95%E5%8F%91%E9%80%81%E5%88%B0%E5%90%8E%E5%A4%87%E4%B8%AD%E7%BB%A7%E6%97%B6%E2%80%9C%E5%BE%AA%E7%8E%AF%E5%9B%9E%E5%88%B0%E8%87%AA%E5%B7%B1%E2%80%9D.png)
我已阅读了许多类似问题的答案,但没有找到确切的这个问题或任何有帮助的答案。
我有一台 Postfix 2.11 服务器 ( mail-server.example.com
),它仅用于发送邮件。如果它能够在第一次尝试时发送电子邮件,它就可以正常工作。但是,出于性能原因,如果它无法在第一次尝试时发送电子邮件,而是想要推迟发送,我已将其配置smtp_fallback_relay
为将电子邮件转发到另一台deferred-mail.example.com
仅处理推迟发送的电子邮件的服务器 ( )。
smtp_fallback_relay = [deferred-mail.example.com]
如果mynetworks
我从我的受信任 IP ( ) 向任一服务器发送一封电子邮件,该邮件发往[email protected]
,则任一服务器都会接受该邮件并尝试将其发送到 Gmail。由于我的服务器 IP 是新的,Gmail 会拒绝来自任一服务器的电子邮件421
(暂时延迟)。正如预期的那样,deferred-mail
服务器只是将邮件放入其延迟队列中并稍后重试。
奇怪的是,虽然一开始mail-server
会将邮件发送到 Gmail,但在收到 后421
,它会尝试将邮件发送到deferred-mail
,但最终放弃了,而是将邮件退回,并提示“发往 gmail.com 的邮件回环到我自己”。我在服务器上没有看到deferred-mail
任何日志说明发生了什么事情。
因此,如果客户端是受信任的并且信任deferred-mail
(mail-server
我可以从“邮件服务器”直接连接并发送到 Gmail 地址deferred-mail
),则两个服务器都配置为接受邮件并将其转发到 Gmail,那么 Postfix 是如何出现这种“循环”的,为什么它会反弹电子邮件而不是中继它?
更新和澄清关于下面的日志。
出于隐私原因,我不会发布我们正在使用的实际域名或 IP 地址。在这篇文章以及下面的日志摘录中,我已将我们正在使用的实际根域名替换为example.com
。
此设置是从正常工作的电子邮件集群复制而来的。我相信它在理论上是合理的,并怀疑这只是一些设置没有被正确替换或翻译的问题。只是由于这种奇怪的行为和看似不正确的错误消息,我不知道该更改什么,这就是我寻求帮助的原因。
- “用我自己的主机名问候我”不是一个错误或问题
通过 SMTP 发送电子邮件时,发件人首先通过主机名来标识自己。Gmail 和 Yahoo 等大型邮件处理器采取几个步骤来评估发件人的信誉。对于 IPv4,他们首先做的两件事是
- 记录发件人的 IP 地址,并建立来自该特定 IP 地址的电子邮件质量和数量记录
- 验证反向 DNS 记录因为该 IP 地址会映射回发送者用来标识自己的主机名
如果 IP 地址信誉不佳或反向 DNS 与发件人主机名不匹配,则接收者很可能会将该电子邮件标记为垃圾邮件,而不管其他情况。
由于这两个原因,mail-server.example.com
和都deferred-mail.example.com
位于同一个 NAT 网关之后,
- 具有静态 IP 地址,因此所有电子邮件都来自具有相同信誉的同一 IP 地址(
REDACTED-PUBLIC-IPv4
在下面的日志摘录中) - 具有将该 IP 地址标识为的反向 DNS 记录
mail-server.example.com
因此,当deferred-mail.example.com
在 SMTP 会话中标识自己时,它将自己标识为mail-server.example.com
。这是正确的、理想的行为,并且由于上述原因,这种情况并不少见。(deferred-mail.example.com
指向私有 IP 地址,10.111.14.181
在下面的日志中,没有反向 DNS 记录。)
- IPv6 故障不是一个错误或问题
我们的服务器堆栈目前未启用 IPv6。由于我们使用新域名,因此我们的域名声誉为零,因此我们希望坚持使用 IP 声誉,直到我们建立稳固的域名声誉为止。(由于 IPv6 地址是一次性的,因此它们永远无法成为声誉的充分基础。)
因此,无法访问 Gmail 的 IPv6 服务器aspmx.l.google.com
是alt2.aspmx.l.google.com
意料之中的事情,并不是什么大问题,但是如果我可以设置某个设置以防止postfix
尝试访问 IPv6 地址,请告诉我,以便我可以进行更改。
禁用 IPv6 尝试的答案:将其添加到您的main.cf
inet_protocols = ipv4
根据要求,以下是错误的编辑日志:
postfix/smtpd[26668]: 50F7C5B81: client=ip-10-111-7-75.us-west-2.compute.internal[10.111.7.75]
postfix/cleanup[26682]: 50F7C5B81: message-id=<>
opendkim[36]: 50F7C5B81: can't determine message sender; accepting
postfix/qmgr[143]: 50F7C5B81: from=<REDACTED-SENDER>, size=279, nrcpt=1 (queue active)
postfix/smtp[26686]: 50F7C5B81: host aspmx.l.google.com[74.125.197.26] said: 421-4.7.0 [REDACTED-PUBLIC-IPv4 15] Our system has detected that this message is 421-4.7.0 suspicious ...
postfix/smtp[26686]: connect to aspmx.l.google.com[2607:f8b0:400e:c07::1a]:25: Cannot assign requested address
postfix/smtp[26686]: connect to alt2.aspmx.l.google.com[2607:f8b0:4001:c56::1a]:25: Cannot assign requested address
postfix/smtp[26686]: 50F7C5B81: host alt2.aspmx.l.google.com[142.250.152.27] said: 421-4.7.0 [REDACTED-PUBLIC-IPv4 15] Our system has detected that this message is 421-4.7.0 suspicious ...
postfix/smtp[26686]: warning: host deferred-mail.example.com[10.111.14.181]:25 greeted me with my own hostname mail-server.example.com
postfix/smtp[26686]: warning: host deferred-mail.example.com[10.111.14.181]:25 replied to HELO/EHLO with my own hostname mail-server.example.com
postfix/smtp[26686]: 50F7C5B81: to=<[email protected]>, relay=deferred-mail.example.com[10.111.14.181]:25, delay=26, delays=24/0.01/1.5/0, dsn=5.4.6, status=bounced (mail for gmail.com loops back to myself)
log messages here about sending bounce email to sender
have been removed
postfix/bounce[26688]: 50F7C5B81: sender non-delivery notification: AEA8A5B83
postfix/qmgr[143]: 50F7C5B81: removed
答案1
根据我在某个论坛上找到的一篇帖子,使用端口 25 以外的任何端口都会禁用我遇到的邮件循环检测。但是,我无法找到任何权威来源来解释为什么邮件被视为循环,或者为什么更改连接端口会产生影响。我将这个问题留待权威来源的答案。
对我有用的解决方案是添加 TLS 证书并在端口 587 上启用 SMTP 和 TLS deferred-mail.example.com
,然后将配置更改mail-server.example.com
为
smtp_fallback_relay = [deferred-mail.example.com]:587
我认为这已经超出了必要范围;帖子说除了 25 之外的任何端口都可以。我这样做是因为无论如何我都想在端口 587 上正确设置 TLS。
答案2
检测到循环是因为目标服务器正在使用发送服务器配置的主机名进行回复。它是就这么简单。
代码有点复杂,但有一段令人信服的部分(请注意,对于同一实际情况,有两个不同的错误消息)是https://github.com/vdukhovni/postfix/blob/2595917e491dfe704390b9bf1100bcdd35b21ae8/postfix/src/smtp/smtp_proto.c#L548-L563
为了避免这个问题,我建议重新检查迫使您在两台主机上使用相同主机名的原因。也许它们实际上并不需要相同?也许只是 postfix 使用的主机名可以不同?也许您可以在第二台主机上配置具有不同主机名(另一个端口)的辅助侦听器?也许您可以禁用警告,但这可能很危险,因为您正在修改内容;下一次修改可能是无法捕获的意外循环。