debian 上的 exim4:为什么这个 ACL 在使用 -bh 测试时有效,但在实际使用中却不起作用?

debian 上的 exim4:为什么这个 ACL 在使用 -bh 测试时有效,但在实际使用中却不起作用?

我已经让 local_acl_check_data 拒绝使用与 From: 和 To: 相同的地址的典型垃圾邮件发送者策略,但由于一些垃圾邮件较少的来源(例如雅虎群组)这样做,因此我也使用白名单。这是 ACL:


# block spammers who use the same "from" and "to" address
accept
    senders = ${if exists{CONFDIR/local_sender_whitelist}\
                   {CONFDIR/local_sender_whitelist}\
                   {}}
deny
    condition = ${if eqi{${address:$h_from:}}{${address:$h_to:}}{true}{false}}
    log_message = rejecting spam with to:${address:$h_to:} and from:${address:$h_from:}
    message = Message identified as spam. If you think this is wrong, get in touch with postmaster

问题是,当我测试时:


jcomeau@tektonic:~$ cat bin/testacl 
exim4 -bh 66.163.168.186 <<EOT
helo tester
mail from: [email protected]
rcpt to: [email protected]
data
from: [email protected]
to: [email protected]
subject: should be ok

this one should not reject
.
mail from: [email protected]
rcpt to: [email protected]
data
from: [email protected]
to: [email protected]
subject: should reject

this one should be rejected
.
quit
EOT

它按预期工作:第一条消息被接受,因为它在白名单中发现了 yahoogroups.com,而第二条消息被拒绝。但在实际操作中,yahoogroups.com 电子邮件与垃圾邮件发送者一起被该 ACL 拒绝。我使用的是 4.72-6,过去几年我使用的所有版本都发生过这种情况。我已经没有主意了。

根据要求,exim4 的日志拒绝了本应通过的消息:

jcomeau@tektonic:~$ grep -C2 Freecycle /var/log/exim4/rejectlog
2011-02-25 09:52:00 1Psz1U-00020g-79 H=n52c.bullet.mail.sp1.yahoo.com [66.163.168.186] F=<sentto-15991578-2122-1298645513-jc=example.com@ returns.groups.yahoo.com> 在 DATA 后被拒绝:拒绝垃圾邮件至:[电子邮件受保护]以及来自:[电子邮件受保护]
信封发件人:<sentto-15991578-2122-1298645513-jc=example.com@returns.groups.yahoo.com>
信封收件人:<[电子邮件受保护]>
--
  MIME 版本:1.0
I 消息 ID:
  邮件列表:列表[电子邮件受保护];接触[电子邮件受保护]
  交付至:邮件列表[电子邮件受保护]
  列表 ID:<PetalumaFreecycle.yahoogroups.com>
  优先级:批量
  列表取消订阅: <mailto:[电子邮件受保护]>
  日期: 2011 年 2 月 25 日 14:51:53 -0000
来自:[电子邮件受保护]
致:[电子邮件受保护]
  主题:[Petaluma Freecycle] 摘要编号 2122
  X-Yahoo-Newman-Property: groups-digest-trad-m
R 回复:“无回复”<[电子邮件受保护]>
  内容类型:文本/纯文本;字符集=ISO-8859-1
  内容传输编码:引用可打印

这是我的 testacl 脚本在第一个测试中显示的内容:

>>> 使用 ACL“acl_check_data”
>>> 处理“接受”
>>> 检查发件人 = ${如果存在{/etc/exim4/local_sender_whitelist}{/etc/exim4/local_sender_whitelist}{}}
>>> yahoogroups.com 在“yahoogroups.com”中?是(匹配“yahoogroups.com”)
>>>[电子邮件受保护]在“/etc/exim4/local_sender_whitelist”中?是(与 /etc/exim4/local_sender_whitelist 中的“yahoogroups.com”匹配)
>>> 接受:条件测试成功
日志:1PuxAz-0005jZ-B0 <=[电子邮件受保护]H=n52c.bullet.mail.sp1.yahoo.com(测试仪)[66.163.168.186] P=smtp S=380
250 OK id=1PuxAz-0005jZ-B0

答案1

我注意到了这种模式,但认为没有太多的内容被理解。尝试这个

  警告
    message = 被识别为垃圾邮件的邮件。如果您认为这是错误的,\
        与邮政局长联系
    log_message = 可能的垃圾邮件,其中 ${h_to:} 作为发件人和收件人
    !senders = ${如果存在{CONFDIR/local_sender_whitelist}\
                          {CONFDIR/local_sender_whitelist} {}}
    条件= ${if eqi{$h_from:}{$h_to:}{true}}
    控制=冻结

control = freeze当我测试规则时,我常常保存消息以供检查。如果我发现它足够准确,我会将其更改为拒绝规则。

编辑:我在我的电子邮件数据库中测试了这条规则。用作zen.spamhaus.orgDNS 黑名单可以捕获几乎所有这些情况(483 中的 467 例)。灰名单涵盖了其余大部分(16 个中的 11 个)。我发现有五条消息通过了测试。其中三封 (60%) 是合法电子邮件。其他的有 helo 名称,其中要么是主机名,要么是二级域。添加一个条件来检查以确保 helo 名称至少是第三级域,使规则相当安全。我正在测试:

    条件 = ${if eq{${extract{3}{.}{$sender_helo_name}}}{}{true}}

答案2

Exim 认为“发件人”是信封发件人地址,位于 returns.groups.yahoo.com 域中。一旦我将该域(完全;groups.yahoo.com 不起作用,yahoo.com 也不起作用)放入我的 local_sender_whitelist 中,ACL 就起作用了。

它在测试期间有效,因为我使用了 yahoogroups.com 的信封发件人地址,与发件人:地址相同。从来没有费心检查雅虎群组的电子邮件中是否存在这种情况。

答案3

您找到了一个解决方案,并且它可能对您的 acl 有效,但我只是想添加这个,因为其他人可能会遇到这种情况,即使这不是您特定用例中的问题。

exim -bh检查很多东西,但不连接到其他主机。如果您的 ACL 失败(或临时失败)并且您的标注检查失败,则需要使用-bhc.

相关内容