我主要是一个 spamassassin (3.4.0-6) + exim4 (4.84.2) 的快乐管理员,在 Debian/jessie 系统上设置服务器端垃圾邮件过滤。
最近有用户报告了一些误报。仔细检查后发现,合法的电子邮件
- 从某个拨号 IP 地址发送(该地址被列入多个黑名单)
- 传递给发件人 ISP 的邮件服务器(使用他们现有的任何身份验证),
- 然后将电子邮件发送到我的邮件服务器
- 由于“已接收”邮件头中的一个 IP 被列入黑名单,因此该邮件被标记为垃圾邮件
spamassassin 匹配了一些黑名单规则(RCVD_IN_BL_SPAMCOP_NET
、RCVD_IN_SBL_CSS
、RCVD_IN_SORBS_SPAM
、RCVD_IN_SORBS_WEB
)。请注意,电子邮件仅有的由于 IP 被列入黑名单而获得正分。
触发垃圾邮件标记的电子邮件中的相关标题是:
Received: from [10.126.95.175] (unknown [109.126.64.1])
by smtpfilter1.public.one.com (Halon) with ESMTPSA
id ee1f1e82-251c-11e7-8f0e-b8ca3afa9d73;
Wed, 19 Apr 2017 16:26:25 +0000 (UTC)
现在假设:
发件人的 ISP 的邮件服务器都是干净的(似乎没有列入任何黑名单)
我显然不知道发件人如何向其 ISP 证明其电子邮件合法,但我认为确实进行了某种形式的身份验证
...我认为 spamassassin 不应该将该电子邮件标记为垃圾邮件。
确切地说:我的直觉告诉我,spamassassin 应该正确地为直接从列入黑名单的 IP 地址收到的邮件添加垃圾邮件分数。但是,如果邮件经过了“干净”的 MTA(ISP 的邮件服务器),sa 应该假设“他们”(ISP)已采取适当措施确保电子邮件的合法性。
由于我已经运行我的设置很长一段时间了,到目前为止还没有收到很多误报报告,我想知道:
以上是预期的行为吗?
如果不是,那么问题是不是在我这边(例如,我错误地配置了垃圾邮件分析,使其将不应该考虑的接收链的部分内容考虑进去。如果是这样,我应该在哪里寻找解决方法?)
如果不是,那么问题出在 ISP 方面吗?(例如,他们最好隐藏那些接收授权电子邮件的损坏 IP 地址。如果是这样,我应该直接向他们投诉吗?)
答案1
这些 SpamAssassin 规则符合条件消息中的中继已接收标头被列入...
RCVD_IN_BL_SPAMCOP_NET
...在Spamcop DNSBL,一个基于时间的自动阻止列表。RCVD_IN_SBL_CSS
为了Spamhaus CSS似乎不再存在,但是RCVD_IN_SBL
也一样Spamhaus SBL其中包括 CSS 组件。
尽管RCVD_IN_SORBS_WEB
更接近于你希望他们做的事情:
检查测试的 IP 地址最后一个不受信任的中继违反 SORBS 维护的 DNSBL。
如果你不相信这些测试,你可以随时调整规则分数.score RCVD_IN_BL_SPAMCOP_NET 0
如果测试匹配则不会增加任何分数,导致测试将被完全禁用。
Spamassassin 无需仅针对最新的Received:
标头进行测试,因为这是Received
来自您自己的 MTA 的,它可以执行相同的测试并实际拒绝来自匹配 IP 地址的邮件,而不是将其标记为垃圾邮件。
在后缀 main.cf
同等的接收者限制将是:
smtpd_recipient_restrictions =
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client dnsbl.sorbs.net
与Exim 4.x在acl_rcpt
ACL中exim.conf
:
deny message = Access denied - $sender_host_address\
listed by $dnslist_domain\n$dnslist_text
dnslists = sbl.spamhaus.org : \
bl.spamcop.net : \
dnsbl.sorbs.net
dnslists
如果您在模式下使用 Exim warn
,则可以通过添加标头来模拟RCVD_IN_*
仅在最后一个 MTA 交付中执行的样式规则X-blacklisted-at
warn message = X-blacklisted-at: $dnslist_domain
dnslists = sbl.spamhaus.org : \
bl.spamcop.net : \
dnsbl.sorbs.net
然后在 Spamassassin 中对该标头的存在性(或内容)进行评分,而不是RCVD_IN_*
:
header LAST_RCVD_BLACKLISTED exists:X-blacklisted-at
score LAST_RCVD_BLACKLISTED 10.0
请注意,这些拒绝列表可能太宽泛,不适合您的实际需要,例如,这dnsbl.sorbs.net
是一个包含几乎所有有 SORBS 区域。在根据这些列表拒绝甚至标记之前,您应该熟悉每个列表的用途,并决定您想要的积极程度。
我个人相信防晒指数,DMARC和贝叶斯过滤更多,并且在信任 DNSBL 时非常敏感,即只使用仅用于垃圾邮件的 IP 列表,例如smtp.dnsbl.sorbs.net
开放 SMTP 中继服务器或edrop.spamhaus.org
包含“被劫持的”网络块。
答案2
我找到了一个可以满足我要求的解决方案。无需调整分数,只需调整黑名单规则即可跳过第一个(不受信任的)跳转,
这是我所做的调整(变化只是-notfirsthop
在表达式中添加后缀;例如,zen
跳过zen-notfirsthop
对原始 IP 的检查):
header RCVD_IN_SBL eval:check_rbl_sub('zen-notfirsthop', '127.0.0.2')
header RCVD_IN_SBL_CSS eval:check_rbl_sub('zen-notfirsthop', '127.0.0.3')
header RCVD_IN_BL_SPAMCOP_NET eval:check_rbl_txt('spamcop-notfirsthop', 'bl.spamcop.net.', '(?i:spamcop)')