我一直在多个站点使用Sendmail和milter-greylist多年。
milter-greylist支持基于GeoIP数据库查找定义灰名单规则。 这对于不做国际业务的公司来说非常方便。 几乎所有的垃圾邮件都是从外部IP地址发送的。 来自外国地址的合法(火腿)电子邮件稍微延迟是没有关系的。 本地电子邮件必须无延迟地到达,因此灰色跳过了几个国家代码。 此外,如果SPFlogging匹配或IP位于白名单上,则会跳过灰名单。 这在greilist.conf中用sendmail.cf中的milter钩子来实现是非常简单的。 对于邮件服务器的资源来说也是有利的,因为大多数垃圾邮件在到达服务器之前就被丢弃了,因此,由于基于spamassassin和/或基于dspam的过滤解决scheme导致的系统负载远低于传送path。
现在到真正的问题:
我如何实现与Exim类似的(即基于GeoIP的)灰名单?
我有一个新的责任来照顾另一个运行Exim的邮件服务器,并收到大量的垃圾邮件。 我不想从零开始重新实施他们的电子邮件传送系统,但我绝对需要做一些有关垃圾邮件量的负载。 不幸的是, Exim似乎没有更好的界面。 此外,我无法find具有对Exim的GeoIP支持的灰名单解决scheme。 我是Exim的完全noob(我可以用sendmail.cf和sendmail m4macros来做所有事情)。
如果通过使用eximconfiguration文件语法来实现此function,我会很高兴。 在这种情况下,我会努力学习它,并可能开始在其他网站使用exim。
现在我正在回答自己的问题,我有一个我喜欢自己的解决scheme。
灰名单本身可以纯粹用Exim访问控制列表实现,或者外部灰名单助手可以挂接到ACL。 有几种方法可以在其他地方logging。
灰名单通常在访问控制列表中实现,因此可以很容易地在ACL中添加一些外部IP地址查找来控制灰名单行为(例如根据国家/地区代码查询跳过灰名单)。
获取国家代码有几种select:
dlfunc库。 我个人select最后一个选项,因为它是最有效的,不依赖于外部资源。 我实现了一个新的dlfunc库作为这个purporse,因为没有几个现有的IPv6支持。 我用简单的例子可以在http://dist.epipe.com/exim/find 。 在实施这个过程中,我了解了Exim ACL,发现它们对于实现任何types的邮件接受策略都非常有用。
现在,通过在灰名单规则之前添加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}}}
到目前为止,pipe理垃圾邮件的最好方法是通过贝叶斯过滤。 虽然在应用贝叶斯filter之前,您可能会使用其他方法获得暂时的好处,但贝叶斯过滤的成功取决于是否需要大量的垃圾邮件和火腿模型 – 所以如果您开始基于IP地址拒绝电子邮件,那么您将会失去从长远来看,在检测。 OTOH应该可以标记消息而不是仅仅否认它。
SPF和RBL也是防止垃圾邮件的有效方法。 并支持spamassassin(连同贝叶斯过滤等)。
您是否build模了您的数据以查看添加国家/地区查找是否可以改进垃圾邮件检测? 与一个configuration良好的spamassassin安装相比?
如果你必须走这条路线….
写一个更简单 – 但是IIRC,Exim不支持milters。
试图将所有允许的IP地址映射为Exim ACL将是非常困难的。
所以最实用的方法是使用支持头注入filter(例如procmail)的MDA,然后将其馈入spamassassin。
它只有一点点帮助,但有GeoIP服务可以通过DNS查询(如DNSBLs)。 也许你可以用它作为根据结果作出决定的基础。