利用 Postfix 抵擋垃圾信

參考文件

SPAM 一直以來是郵件管理人員心中的痛,就算設定了再強的過瀘規則,SPAM 還是有辦法如洪水般的湧進來。當然,大部份的 SPAM 都是不遵守網路規則的。以下,有一些小小方法來抵擋“基本”的來源。

  • header_checks & body_checks

這應該是最常用的過瀘方法,但是隨著網路上亂丟垃圾的人手段越來越高明,會逼得我們只好一條一條的去新增規則,當然,在常見的 SPAM 下,使用 header_checks 及 body_checks 還是有很大的作用。

要使用 header_checks 或 body_checks 請在 main.cf 加上去就可以了。如果在指定的檔上是不存在的,則請手動建立。

header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
  • 拒絕動態 IP 所發出來的信件

在 2004 年開始,台灣各大 ISP 已把動態 IP 的反解改成 dynamic.*.net.tw,因此,對於此資訊,我們可以設定出一套規則,記錄在 access 裡,把來自動態 IP 的信都擋掉。

要使用這個機制,在 main.cf 加一筆設定既可。

smtpd_client_restrictions =
     check_client_access hash:/etc/postfix/access

而 access 的內容為:

dynamic.apol.com.tw REJECT We can't allow dynamic IP to relay!
dynamic.giga.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.hinet.net REJECT We can't allow dynamic IP to relay!
dynamic.seed.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.tfn.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.ttn.net REJECT We can't allow dynamic IP to relay!
dynamic.lsc.net.tw REJECT We can't allow dynamic IP to relay!

設定好之後, 要記得使用 postmap 產生 access.db 檔, 然後再重新載入 postfix, 這樣才會生效.

# postmap hash:/etc/postfix/access
# postfix reload
  • 丟棄找不到 DNS 裡 MX / A 記錄的 hostname

這個機制是查尋寄件者的主機位址,再使用這個位置去做 DNS 查尋,一般在 SPAM 新手會隨意造一個主機名稱以企圖矇騙過關,對於這種手法實只要使用一個設定既可。

要使用這種機制,在 main.cf 加上一筆:

smtpd_sender_restrictions = reject_unknown_sender_domain

隨著科技的進步,可能到處撒垃圾的 SPAM 發送者已知道我們可以從 DNS 去做查尋工作,因為就隨意去申請一個 domain name,如此就可以通過 reject_unknown_sender_domain 的檢查了。

接下來,既然使用 DNS 的正向查尋 OK,那麼我們就來檢查一下反解的動作,一般良好的 DNS 管理者,應該要把 DNS 正、反解都設定好,做個遵守規範管理員,然而 SPAM 發送者確經常不設定好,以致於在反查的時候會找不到連線主機的 IP 反解。我們可以利用這一點來過瀘這種手法。

  • 不允許對方的連線 IP 沒有反解

這種過濾方法不是參考寄件者的主機名稱,而是利用 Client 連過來時的 IP 位置。

在 main.cf 加上一筆:

smtpd_sender_restrictions = reject_unknown_client

當然,這種方式非常的有效,但也“超乎你所想像”的有效,為什麼這麼說呢?一些合法的信件、也許不是垃圾信,會因為查不到 DNS 的 PTR 記錄而被擋到外面。像這種“例外的案子”就必需把他們加入到 mynetworks 這個項目裡以便收到他的“例外信件”。

因此,您的 mynetworks 必需加一個段落,以 11.22.33.44 來說,我們就必需使用如下方法:

mynetworks = 11.22.33.44, 192.168.3.0/24, 127.0.0.0/8

再把他加到 smtpd_sender_restrictions 裡,配合 reject_unknown_client 一起使用。

smtpd_sender_restrictions =
     permit_mynetworks
     reject_unknown_client

因為 permit 的項目如果驗證通過,就會離開整個 smtpd_sender_restrictions 的規則,所以當使用者從 11.22.33.44 連上來的時候,就會被視為合合的來源,而不會被 reject_unknown_client 所過濾。

DNS & Mail

在防堵別人的 mail 之前,一定要把自家的設定都弄得很完善才行,如此才可以跟對方說“那是你的問題”尤其是在 DNS 方面。

DNS 裡必需指定最少一個 MX record 到你正解設定,如:

abc.com.             IN MX      10      mail.abc.com
mail.abc.com.     IN A                   11.22.33.44

這樣,才算遵守規則。在反解方面,也必需設定完全。

44          IN PTR          mail.abc.com.

做測試

查 MX record

# host -t mx abc.com
abc.com mail is handled by 10 mail.abc.com.

查 mail.abc.com 正解

# host mail.abc.com
mail.abc.com has address 11.22.33.44

查反解

#host 11.22.33.44
44.33.22.11.in-addr.arpa domain name pointer mail.abc.com.

以上,如果在手工測試 OK 之後都有結果,那麼就可以確定你的 DNS 致少是好的。

很多機關已把垃圾信的過濾規則定得相當嚴僅,比如出現三個驚嘆號 (!!!) 就馬上退信,當然在一般的做法上是不用如此的嚴格,選出適用的條件既可。

 

Index