我在反垃圾的路上狂奔
兩周前, 受命為公司部署反垃圾郵件系統. 那天我的噩夢開始了.
對郵件伺服器的了解不多,只是很久以前學習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 : http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:05:24 : http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:05:51 : http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:05:57 : http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:11:54 : http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:12:13 : http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
10-24 13:12:19 : http://bl.extmail.org/cgi/freq? ,from=<> to=<> helo=<> client=<>]
在SL版問過也沒人解答, 覺得這是SL的BUG. 因為在APF的日誌中沒有提交空信息的記錄。
如果要在公司現有環境中部署反垃圾郵件,且不需要用戶更改設置,就必須建立一套自己的反垃圾規則。經過兩周的測試,總結了一些經驗,也搜集到足夠的資料。下一步打算開發一套自己的反垃圾系統。這樣可以不再受第三方規則的困擾,將郵件控制權把握在自己手中(並不是說SL不好,也許是自己太笨,沒弄明白)。
這個系統的雛形已經實現(VB6下的多線程模式),和SL的工作原理一樣,可以說是WINDOWS下的Spam Locker。只是判斷規則按照內部需要自己完善。我的PERL很弱,否則就可以在SL的基礎上修改一下。經過4天的測試,運行十分穩定,識別效率和效果也非常好。吸取前次部署SL的經驗,這次打算測試一個模塊,上線一個模塊,發現問題馬上調整。
反垃圾郵件的是痛苦的,不可能一步到位,最痛苦的是要面對用戶的指責,質疑。也許我功力不夠,也許是降大任前的苦其心志。我依舊奔在反垃圾的路上。
如果能夠順利到達終點,我會把相關資料整理成詳細文擋,希望後來的兄弟不要象我般如此痛苦。
[ 本帖最後由 pencat 於 2007-10-29 22:42 編輯 ]
《解決方案》
回復 #1 pencat 的帖子
垃圾郵件確實讓人頭痛,我的經驗是不能單靠一方面技術解決垃圾郵件問題, 我的解決辦法是 spamassassin + rbl 評分 + 關鍵字評分
《解決方案》
公司的情況比較特殊 MAIL SERVER已經滿負荷運行了, 2G內存都用滿了, 很難再支持spamassassin 這樣龐然大物. rbl 雖然方便 但是誤傷率太高.
《解決方案》
要我看,吹噓9x%的垃圾郵件過濾沒有見到,或者9x%的過濾代價就是大量誤判。rbl國內公司用不現實,遇到個誤判收不到訂單之類你就要被批一頓。教你個損招,叫客戶用outlook 2003自帶的垃圾郵件過濾,然後告訴他誤判了到垃圾箱去找,如果客戶抱怨誤判,垃圾郵件多之類就說微軟這麼大的公司做的都這樣,我也沒辦法了。順便罵一頓微軟。
《解決方案》
樓上的哥們方法不錯,但俺們經理也不是吃乾飯的。 這麼干俺是要下崗的
通過觀察發現 有30%左右的垃圾郵件 是自動生成用戶名 向你的伺服器循環發送. 我維護了一個域內用戶和信任關係列表。 這樣用一個很簡單的規則就檔住了30% 的垃圾 準確率是100%
rbl 是靠不住的,除非是自己維護的rbl server 國外提供的服務不考慮,國內提供的更不考慮.
[ 本帖最後由 pencat 於 2007-10-31 09:13 編輯 ]
《解決方案》
用多個rbl 進行綜合評分,而不是常用的一符合 rbl 就拒絕,這種方式還是比較有效的,如果一個ip 被幾個 rbl 列入了,基本就肯定是 垃圾ip了,spamassiass 如果配置成 daemon運行方式 消耗資源還是比較小的
《解決方案》
rbl 除非很快 訪問那麼多rbl 速度必然會下降. spamassiass 在daemon方式下運行還沒測試過, 不過再小也小不過基於行為連接的軟體.
exmail.org 提供的spam locker就很好 不過統計界面不太友好,根據他的機制我重寫了個win下的 現在正在跑, 效果還不錯.
http://blog.bigcomic.com/upload/119388685525_p0.png
web界面
http://blog.bigcomic.com/upload/p1.png
http://blog.bigcomic.com/upload/p2.png
[ 本帖最後由 pencat 於 2007-11-1 11:27 編輯 ]
《解決方案》
推薦用商業反垃圾病毒郵件網關, 省很多事情。
《解決方案》
第三方的東西用著不放心
《解決方案》
郵件網關用著還可以呀
應該比較放心,因為你是掏錢的,還有很多服務,壞了直接替換上了
可以查郵件,屏蔽郵件,功能還很強大..