两周前, 受命为公司部署反垃圾邮件系统. 那天我的噩梦开始了.
对邮件服务器的了解不多,只是很久以前学习TCP/IP的时候看过MAIL工作的一些原理, 现在也差不多忘干净了. 还好有个地方叫互连网, 我可以从那里得到想要的一切.
查过资料才知道,反垃圾邮件系统从功能上分为两类。
1. 基于内容 以SpamAssasin为代表。
2. 基于行为 以Spam Locker为代表。
SpamAssasin 被认为是最好的反垃圾软件,SpamAssasin将其逻辑封装在一个设计精良的、抽象化的API中,因此它可被集成到电子邮件数据流中的任何地方。它号称9x%的识别率。高识别率的代价是以牺牲性能换来的,每一封邮件都要使用大量规则去对比,系统开销可想而知。如果运行在千万级用户的系统上.......难以想象
而Spam Locker是基于行为的反垃圾,在SENDER与MAIL SERVER进行命令交换时就可以识别垃圾邮件,从而断开TCP连接,极大的节省了系统资源和带宽。而APF的机制更可以将反垃圾系统和邮件系统分别置于不同的服务器上,进一步提高了系统的稳定性,降低了资源成本。
这两种系统由于机制不同,所以没有可比性,但我更倾基于行为的反垃圾邮件系统。
两周前下载并安装了ExtMail发布的Spam Locker(以下简称SL)开源反垃圾邮件程序。SL采用PERL语言开发,通过补丁形式支持QMAIL。在MAIL SERVER接收到RCPT TO后调用APF插件,向指定IP发送如下数据:
request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
client_address=82.135.209.55
client_name=unknow
helo_name=82-135-209-55.ip.zebra.lt
sender=pulp@dcba.com
recipient=liming@abcd.com
queue_id=
SL收到数据后调用各种模块对数据进行分析,最后返回OK/DUNNO/REJECT三种状态。但是到最后我也没弄清楚模块之间的优先级到底是怎样,导致正常邮件不断的被退回。
悲剧开始了。
总公司的邮件设置很奇怪,发信使用了第三方服务,造成MX记录不匹配。有些SMTP SERVER的IP还被RBL列入黑名单。这些自然都被SL挡了回去,设置白名单也无济于事。
总公司的人急了。
南京公司内部有3台SMTP,用户没有进行统一的设置,而另外2台也没有SMTP认证,导致发信者的域名与发信IP不符,结果就被当做垃圾。在本地DNS增加了MX记录记录也不行。SL的日志中明明读取了本地DNS的信息,也返回了我设置的记录,依旧把正常邮件当垃圾。鉴于此情况我发信给公司全体人员,要求修改SMTP服务器,怕有些人不懂如何设置,我制作了3个版本的邮件客户端图文并貌的说明文件,但修改者寥寥,而我每天奔波在那些不仔细阅读说明的人中,筋疲力尽。要命的是总经理的不断问我,质问邮件为什么总发不出去,还收不到???
我哭了。
综合以上情况,最后不得不关闭了SL。
PS:在使用SL过程中还发现了诡异的幽灵记录
10-24 12:42:00 [27921]: [450 rejected, see
http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:05:24 [3926]: [450 rejected, see
http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:05:51 [3927]: [450 rejected, see
http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:05:57 [4006]: [450 rejected, see
http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:11:54 [6492]: [450 rejected, see
http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:12:13 [6499]: [450 rejected, see
http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:12:19 [6523]: [450 rejected, see
http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
在SL版问过也没人解答, 觉得这是SL的BUG. 因为在APF的日志中没有提交空信息的记录。
如果要在公司现有环境中部署反垃圾邮件,且不需要用户更改设置,就必须建立一套自己的反垃圾规则。经过两周的测试,总结了一些经验,也搜集到足够的资料。下一步打算开发一套自己的反垃圾系统。这样可以不再受第三方规则的困扰,将邮件控制权把握在自己手中(并不是说SL不好,也许是自己太笨,没弄明白)。
这个系统的雏形已经实现(VB6下的多线程模式),和SL的工作原理一样,可以说是WINDOWS下的Spam Locker。只是判断规则按照内部需要自己完善。我的PERL很弱,否则就可以在SL的基础上修改一下。经过4天的测试,运行十分稳定,识别效率和效果也非常好。吸取前次部署SL的经验,这次打算测试一个模块,上线一个模块,发现问题马上调整。
反垃圾邮件的是痛苦的,不可能一步到位,最痛苦的是要面对用户的指责,质疑。也许我功力不够,也许是降大任前的苦其心志。我依旧奔在反垃圾的路上。
如果能够顺利到达终点,我会把相关资料整理成详细文挡,希望后来的兄弟不要象我般如此痛苦。