我的 postfix 不会将 AUTH PLAIN 发送到传出中继服务器。它必须在几天前工作,但现在我收到“不允许中继”的退回邮件。
邮件系统使用 postfix、fetchmail 和 dovecot 在 Alpine Linux VM 中运行。Postfix 使用 Cyrus SASL 库,而不是 dovecot 库。
main.cf 的相关部分:
relayhost = [RELAY_HOST]
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/mailsrv/etc/postfix/sasl_passwd
smtp_sasl_security_options =
sasl_passwd:
[RELAY_HOST] USER:PASSWORD
我使用 tcpdump 捕获了一个传出会话,并且没有发送 AUTH PLAIN。我使用正确的 AUTH PLAIN 行测试了通过 telnet 手动发送邮件,它工作正常。
所以我的解释是,后缀在某些时候不会决定使用 SASL / AUTH PLAIN。
可能是什么问题呢?
权限应该没问题,postmap 已被调用,postfix 重新启动并重新加载,libsasl 已安装并且 postfix 报告已使用 cyrus 构建。我知道这是陈词滥调,但该系统几天前可以正常工作。某些证书到期是否可能是一个问题,我在日志中没有看到?
HELO 是原始的握手命令,没有任何协商扩展的能力。在客户端可以使用 SASL 之前,它必须发送 EHLO (extended-hello) 并检查服务器是否通告了所需的 SASL 机制。
默认情况下,许多 SMTP 客户端(包括 Postfix)仅在服务器的问候语横幅中出现“ ESMTP
220 foo.example.com ESMTP Sendmail
”一词时才发送 EHLO(例如)。假定不支持 ESMTP 的服务器也不支持 SASL。如果服务器的问候语正确,请确保您没有意外启用
smtp_never_send_ehlo
或smtp_pix_workarounds
选项。如果服务器的问候语错误,但它仍然接受 EHLO,您可以通过
smtp_always_send_ehlo = yes
在 Postfix 配置中启用来强制使用 EHLO。如果您正在管理服务器,请尝试修复其问候语,因为这可能还会影响来自其他域的传入消息传递——例如,没有 ESMTP,也没有机会性 STARTTLS。
例如,如果服务器也在运行 Postfix,它必须在
smtpd_banner
选项中包含“ESMTP”:(也可能是连接通过反垃圾邮件网关,该网关使用此方法来尝试禁止使用 STARTTLS,而不是简单地将其从 EHLO 响应中删除,而是尝试禁止 EHLO 本身。)
请注意,通常端口 25 仅用于消息接收(来自其他域的入站传递)– 587 或 465 是用于消息“提交”(从客户端出站)的端口。
因此,如果您的 Postfix 充当本地客户端(因为它有一个中继主机并想要使用身份验证),它实际上应该连接到端口 587 上的中继主机。
请注意,连接到端口 465 需要
smtp_tls_wrappermode = yes
,因为它从一开始就使用 TLS。(这实际上是一个优势,因为它可以防止防火墙篡改握手。)使用端口 587 时,TLS 是可选的(仅使用“STARTTLS”命令激活),但如果服务器支持,您也应该强制使用 TLS。为此,请设置
smtp_tls_security_level = verify
.