2006年12月25日

對抗垃圾信,使用 Postgrey

最近一堆有架設 Mail Server 的人多因為 ORDB 要終止服務的關係而顯的異常忙錄。最早應該是從 TWEmu.no-ip.org Planet 中看來的,原文 可能 (我忘了咩)是 gslinORDB 結束營業 這個日誌。

迅速的檢查一下 Postfix 的設定檔,嗯,果然不落人後的有使用 ordb 的服務,馬上將該設定先終止後,結束第一回合相關作業。

然後是 Leeym's Blog 這篇 ORDB 要關門了,改改 DNSBL 設定吧 中提到可以使用 Postgrey 做第二層防護,一看 Gentoo Portage 中已有內建時,就毫不猶豫的給他裝了上去。

總的來說,Postgrey 並不是服務名稱,它其實是 Greylisting 這個防廣告信機制的 Postfix 版實作,相對於 Sendmail 則要改用 milter-greylist

那麼 Greylisting 防制廣告信的概念是啥呢?

要知道廣告信一次發送都是上千萬筆,而且絕大多數使用快遞送達方式(因為絕大多數郵件主機已不代轉非負責網域內的信件,除了那些本來就是用來寄送廣告信的 Server, 如: ms?.epaper.com.tw),所以當發現受信主機回應說系統目前有問題暫停收信時,寄信端是否會重新送信就成了一個值得思考的問題。

本來嘛,廣告信寄信程序早就知道絕大多數的郵件主機會拒絕某些特徵的寄信請求,那麼為了避免浪費時間就會放棄該次傳送動作。Greylisting 的基本原則就是賭廣告信沒有時間重覆送信,因而阻絕掉大多數的垃圾信件。

在 Gentoo 系統中設定 postgrey 真的很簡單,裝上後直接啟動即可,當然請別忘了把 postgrey 加到系統服務啟動列表中去。

完成 postgrey 的安裝與啟動後,剩下的則是 Postfix 方面的設定。Postfix 的設定也不複雜,只需要求 Postfix 先去繞個彎看看 Postgrey 要不要開放收信而以,這個動作放在 Postfix 設定檔 main.cf 中的 smtpd_recipient_restrictions 設定中,告訴 Postfix 去本機上的埠號 10030 (可以改,見 /etc/conf.d/postgrey 中之設定)處中進行檢查即可,設定範例如下:

smtpd_recipient_restrictions = permit_mynetworks,
                               reject_unknown_recipient_domain,
                               reject_non_fqdn_recipient,
                               reject_unauth_destination,
                               check_policy_service inet:127.0.0.1:10030

完成設定後,重新載入 postfix 設定即可開始讓 postgrey 提供服務。

※註:Postfix 收信時對各 filter 的執行順序(資料來源: Postfix Configuration - UCE Controls

  1. smtpd_client_restrictions: restricts what clients this system accepts SMTP connections from. 這是連線來源的檢查,會直接踢掉該連線。
  2. smtpd_helo_restrictions: what hostnames clients may send with the HELO (EHLO) command. 這是郵件主機的身份識別檢查,通常不會加以限制。
  3. smtpd_sender_restrictions: restricts what sender addresses this system accepts in MAIL FROM commands. 這是信件寄件者郵址的檢查,說起來並不好處理。
  4. smtpd_recipient_restrictions: restricts what recipient addresses this system accepts in RCPT TO commands.這是收件人郵址檢查,通常是接受本機上的用戶信件。