我看到这个问题在 serverfault 上被反复问到,每次似乎都伴随着一份配置副本,并且结果是由非常乐于助人的读者做出成功或失败的诊断。
如果可能的话,我愿意利用这种善意,但要稍微提高一点赌注。在我看来,这通常归结为设置smtpd_recipient_restrictions
。但它通常是一个相当长的列表,例如我的:
# Recipient restriction rules
smtpd_recipient_restrictions =
check_policy_service inet:127.0.0.1:9999
permit_mynetworks
permit_sasl_authenticated
check_recipient_access
proxy:pgsql:/etc/postfix/sql-maintain.cf
proxy:pgsql:/etc/postfix/sql-relay-recipient-verification.cf
reject_unverified_recipient
reject_unauth_destination
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_non_fqdn_helo_hostname
但那里发生了很多事情,而我从未看到解决的更大问题是:
有没有办法让 Postfix 告诉我们为什么它拒绝客户端主机?
由于缺乏线索,我尝试了一个工作流程如下:
- 注释掉其中一项限制
postfix reload
(重新加载设置) 3postconf smtpd_recipient_restrictions
(确认)swaks --port 587 -tls --server smtp.mydomain.tld --to [email protected] --from [email protected]
(测试一下)
对上述配置进行的最后一次测试得到了很好的跟踪,其突出的结论是:
<~* 554 5.7.1 <_gateway[192.168.0.1]>: Client host rejected: Access denied
如果我从德国服务器(我在塔斯马尼亚)尝试相同操作,我会看到:
<~* 554 5.7.1 <static.244.6.251.148.clients.your-server.de[148.251.6.244]>: Client host rejected: Access denied
因此现在尝试找出被拒绝的原因,我按照上面指出的方式循环工作,这个发现很有趣。
我可以评论它们全部除此以外reject_unauth_destination
,我仍然会得到相同的拒绝。如果我注释掉reject_unauth_destination
(无论其他限制是否有效或注释掉),我得到的是:
<** Timeout (30 secs) waiting for server response
这完全没有道理。当缺少该规则时,Postfix 选择不响应。
记录如下:
reject_unauth_destination
Reject the request unless one of the following is true:
Postfix is a mail forwarder: the resolved RCPT TO domain matches $relay_domains or a subdomain thereof, and contains no sender-specified routing (user@elsewhere@domain),
Postfix is the final destination: the resolved RCPT TO domain matches $mydestination, $inet_interfaces, $proxy_interfaces, $virtual_alias_domains, or $virtual_mailbox_domains, and contains no sender-specified routing (user@elsewhere@domain).
深入研究一下,我可以用以下方法检查提到的所有配置:
postconf mydestination myhostname inet_interfaces proxy_interfaces virtual_alias_domains virtual_mailbox_domains
得出(已编辑)
mydestination = $myhostname, mydomain.tld
myhostname = smtp.mydomain.tld
inet_interfaces = all
proxy_interfaces =
virtual_alias_domains = proxy:pgsql:/etc/postfix/sql-domain-aliases.cf
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/sql-domains.cf
/etc/postfix/sql-domains.cf
我已确认返回的 SQL 查询并且可以在 PostgreSQL(其内部日志)中mydomain.tld
看到 Postfix 发出的确切查询。SELECT * FROM pg_stat_activity
说实话,我添加了,mydomain.tld
看看mydestination
是否有帮助,但没有,我仍然得到Client host rejected
我尝试观察/var/log/mail.err
并/var/log/mail.log
从另一台机器运行 swaks,但发现没有添加任何内容mail.err
,mail.log
只有这些行(已删除):
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: connect from _gateway[192.168.0.1]
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: Anonymous TLS connection established from _gateway[192.168.0.1]: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: NOQUEUE: reject: RCPT from _gateway[192.168.0.1]: 554 5.7.1 <_gateway[192.168.0.1]>: Client host rejected: Access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<myswaksbox>
Jan 2 15:18:27 mailserver postfix/submission/smtpd[2160301]: disconnect from _gateway[192.168.0.1] ehlo=2 starttls=1 mail=1 rcpt=0/1 quit=1 commands=5/6
因此需要解决的问题是:
reject_unauth_destination
为什么解除限制后 postfix 会超时- 为什么这个限制似乎拒绝了电子邮件,尽管:
- 观察到 SQL 被发出(在 postgreSQL 日志中)并返回
mydomain.tld
- 我已经添加
mydomain.tld
到mydestination
- 观察到 SQL 被发出(在 postgreSQL 日志中)并返回
- 我们如何才能从 Postfix 中找出拒绝的具体原因?
至今它仍让我困惑。
答案1
使用该debug_peer_list
选项并仔细检查结果后,我才发现本来应该很明显的事情,哎呀!我需要登录到 SMTP 服务器,然后输入参数,swaks
并--auth-user
在--auth-password
添加有效帐户详细信息后,SMTP 请求就会成功。
我们能做的最好的事情似乎是仔细检查转储到日志文件中的调试信息debug_peer_list
。它并不完全是我所希望的,因为它列出了拒绝的确切标准和原因(但它没有),但它看起来是我们拥有的最好的,除非有人知道更好的东西(它做了我梦想的拒绝分析,记录每个标准测试和状态,通过或失败)。