我一直在使用发送邮件和...一起milter-灰名单多年来,曾在多个地点工作。
milter-灰名单支持根据 GeoIP 数据库查找定义灰名单规则。这对于不开展国际业务的公司非常方便。几乎所有垃圾邮件都是从外国 IP 地址发送的。来自外国地址的合法 (ham) 电子邮件稍微延迟也没关系。本地电子邮件必须无延迟到达,因此对于几个国家代码,灰名单会被跳过。此外,如果 SPF 记录匹配或 IP 在白名单中,则会跳过灰名单。这在灰名单配置文件用鱼钩发送邮件配置文件这对邮件服务器的资源也有好处,因为大多数垃圾邮件在到达服务器之前就被丢弃了,因此系统负载垃圾邮件刺客和/或垃圾邮件基于过滤解决方案的传输路径进一步降低。
现在来谈谈真正的问题:
我如何实现类似的(即基于 GeoIP 的)灰名单进出口?
我有一个新职责,负责管理另一个邮件服务器,该服务器恰好运行进出口并收到大量垃圾邮件。我不想从头开始重新实施他们的电子邮件传递系统,但我肯定需要对他们的垃圾邮件量造成的负载做些什么。不幸的是进出口似乎没有 milter 界面。此外,我无法找到支持 Exim 的 GeoIP 灰名单解决方案。我对 Exim 完全是菜鸟(我可以用 sendmail.cf 和 sendmail m4 宏做任何事情)。
如果仅使用 exim 配置文件语法就可以实现此功能,我会很高兴。在这种情况下,我会努力学习它,并可能开始在其他网站上使用 exim。
答案1
我现在正在回答我自己的问题,因为我有一个我自己喜欢的解决方案。
灰名单本身可以仅使用 Exim 访问控制列表来实现,或者可以将外部灰名单助手挂接到 ACL。有几种方法可以实现这一点,这些方法在其他地方有记录。
灰名单通常在访问控制列表中实现,因此很容易在 ACL 中添加一些外部 IP 地址查找来控制灰名单行为(例如,根据国家代码查找跳过灰名单)。
有多种获取国家代码的方法:
- 例如使用 DNSBL 查找http://countries.nerd.dk/(如 mailq 的回答所述)。
- 将一些 GeoIP 数据库导入 SQL 数据库并从 ACL 进行 SQL 查询。
- 使用几个 perl GeoIP 模块之一实现 GeoIP 查找,并将其通过 perl 接口挂接到 Exim ACL 中。
- 使用
dlfunc
在 ACL 中实现 GeoIP 查找的库。
我个人选择了最后一个选项,因为它效率最高,并且不依赖外部资源。我dlfunc
为此实现了一个新的库,因为现有的几个库都没有 IPv6 支持。我的实现和简单示例可在此处找到:http://dist.epipe.com/exim/在实施这一过程时,我了解了 Exim ACL,发现它们对于实施任何类型的邮件接受策略都非常强大。
现在,通过在灰名单规则之前添加 ACL 规则,可以轻松跳过某些国家的灰名单:
warn set acl_c_geoip_country_code = \
${dlfunc{/usr/local/lib/exim4/exim-geoipv6-dlfunc.so}\
{geoip_country_code}{$sender_host_address}}
accept condition = ${if inlist{$acl_c_geoip_country_code}{FI:SE:EE}}
4.77 之前的 Exim 版本没有inlist{
语法。可以通过更改第二条规则来实现相同的效果,如下所示:
accept condition = ${if forany{FI:SE:EE}{eq{$item}{$acl_c_geoip_country_code}}}
答案2
到目前为止,管理垃圾邮件的最佳方法是贝叶斯过滤。虽然在应用贝叶斯过滤器之前,您可能会通过应用其他方法获得短暂的好处,但贝叶斯过滤的成功取决于是否有大量的垃圾邮件和普通邮件可供建模 - 因此,如果您开始根据 IP 地址拒绝电子邮件,那么从长远来看,您将在检测中失败。另一方面,应该可以标记消息,而不仅仅是拒绝它。
SPF 和 RBL 也是行之有效的垃圾邮件防范方法。并得到 spamassassin 的支持(以及贝叶斯过滤和其他方法)。
您是否已对数据进行建模,以查看添加国家/地区查询是否会改善垃圾邮件检测?与配置良好的 spamassassin 安装相比?
如果您必须走这条路……
编写过滤程序很容易 - 但据我回忆,Exim 不支持过滤程序。
尝试将所有允许的 IP 地址映射为 Exim ACL 将会非常困难。
因此,实现这一点最实用的方法是使用支持标头注入过滤器的 MDA(例如 procmail),然后将其输入到 spamassassin 中。
答案3
它只能提供一点点帮助,但有些 GeoIP 服务可以通过 DNS 查询(例如 DNSBL)。也许您可以将其用作根据结果做出决策的基础。