在 postfix MTA MX 设置中,我有一封垃圾邮件通过了两次检查,但这是绝对不应该的。
该postfix/smtpd
过程记录这些警告,应该在这个设置中是一个严重的失败:
hostname * does not resolve to address *: No address associated with hostname
Unable to look up MX host * for Helo command *: No address associated with hostname
相关邮件日志如下:
postfix/smtpd: warning: hostname peggy-langley.colormemobile.com does not resolve to address 45.58.139.69: No address associated with hostname
postfix/smtpd: connect from unknown[45.58.139.69]
postfix/smtpd: warning: Unable to look up MX host mail.intrcomm.net for Helo command eldoark.com: No address associated with hostname
policyd-spf: prepend Received-SPF: Neutral (mailfrom) identity=mailfrom; client-ip=45.58.139.69; helo=eldoark.com; [email protected]; receiver=<UNKNOWN>
postgrey: action=greylist, reason=new, client_name=unknown, client_address=45.58.139.69, [email protected], recipient=<hidden>
postfix/smtpd: NOQUEUE: reject: RCPT from unknown[45.58.139.69]: 450 4.2.0 <hidden>: Recipient address rejected: Greylisted, try again later; from=<[email protected]> to=<hidden> proto=ESMTP helo=<eldoark.com>
这甚至不应该进入灰名单,也不应该通过稍后会阻止它的进一步检查。
原因如下:
45.58.139.69
有 PTR 记录peggy-langley.colormemobile.com
,但是该域名没有 A/AAAA IP 记录(也没有 MX 记录)。- 的 HELO
eldoark.com
具有 的 MX 记录mail.intrcomm.net
,但是此子域名没有 A/AAAA IP 记录。
我找不到postconf 设置这会使这些警告变成错误,我想知道我是否必须在那里写自己的支票。
postfix
做日志警告,它意识到了这些问题,所以希望我只是遗漏了一些东西?
MTA 配置有
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions =
[...]
reject_unknown_helo_hostname,
[...]
permit
和
smtpd_sender_restrictions =
[...]
reject_unknown_sender_domain,
[...]
permit
我本来以为其中一个或者两个都应该切断这个连接,但仔细观察后发现,这些检查似乎还不够:
拒绝未知的 helo 主机名:当 HELO 或 EHLO 主机名没有 DNS A 或 MX 记录时拒绝请求。
显然,HELO 域名有 A 和 MX 记录(只有 MX 解析失败)。所以这似乎可以通过。
拒绝未知发件人域名:当 Postfix 不是发件人地址的最终目的地,并且 MAIL FROM 域具有 1) 没有 DNS MX 和 DNS A 记录,或 2) 格式错误的 MX 记录(例如长度为零的 MX 主机名的记录)时,拒绝请求
MAIL FROM([email protected]
)显然是伪造的,所以这根本没有帮助?
编辑:添加了请求的 SMTP 记录,值得一提
Out: 220 my.domain.name ESMTP Postfix
In: EHLO eldoark.com
Out: 250-my.domain.name
Out: 250-PIPELINING
Out: 250-ETRN
Out: 250-STARTTLS
Out: 250-ENHANCEDSTATUSCODES
Out: 250-8BITMIME
Out: 250-DSN
Out: 250 SMTPUTF8
In: MAIL FROM:<[email protected]> BODY=8BITMIME
Out: 250 2.1.0 Ok
In: RCPT TO:<hidden>
Out: 450 4.2.0 <hidden>: Recipient address rejected:
Greylisted, try again later
In: QUIT
Out: 221 2.0.0 Bye
答案1
从#postfix@freenode IRC,我得到了有用的提示(感谢,JPT),连接 IP/主机名当然已经签入smtpd_client_restrictions
。
smtpd_client_restrictions =
[...]
reject_unknown_reverse_client_hostname,
[...]
我的现有reject_unknown_reverse_client_hostname
条目仅检查缺少的客户端 IP 地址地址->名称映射!我现在已将其替换为更严格的reject_unknown_client_hostname
检查,这应该会“消除”第一个警告:
拒绝未知客户端主机名:当1)客户端IP地址->名称映射失败,或2)名称->地址映射失败,或3)名称->地址映射与客户端IP地址不匹配时拒绝请求。
Postfix 似乎没有为第二个警告提供拒绝选项:
postfix/smtpd: warning: Unable to look up MX host mail.intrcomm.net for Helo command eldoark.com: No address associated with hostname
。
也许这很有道理,我不能即兴地说出来。(要清楚:如果没有 MX 主机,只有 A 记录,这对我来说是有效且可以接受的,但指向 nirvana 的 MX 主机不应该被接受?如果有人知道强制执行该配置,我很想知道。)
编辑: 解决的主要问题:
postfix/smtpd[13599]: warning: hostname extremetech.com does not resolve to address 23.94.113.133
postfix/smtpd[13599]: connect from unknown[23.94.113.133]
postfix/smtpd[13599]: NOQUEUE: reject: RCPT from unknown[23.94.113.133]: 450 4.7.25 Client host rejected: cannot find your hostname, [23.94.113.133]; from=<[email protected]> to=<hidden> proto=ESMTP helo=<lapolla.com>
postfix/smtpd[13599]: disconnect from unknown[23.94.113.133] ehlo=1 mail=1 rcpt=0/1 data=0/1 quit=1 commands=3/5
答案2
如果不查看此 SMTP 事务的完整日志,很难判断,但 Postfix 实际上不会拒绝邮件,直到客户端发送 RCPT TO 命令之后。它可能知道自己会拒绝,但实际上不会这样做。原因是,一些客户端不会检查事务期间邮件是否被拒绝,并继续尝试传递,因此连接时间会比需要的更长。
如果设置 smtpd_delay_reject = no,那么 Postfix 将在评估规则后立即拒绝。我不确定这是不是一个好主意。
如果没有看到整个配置,就很难知道这里发生了什么。