close

postfix 過濾垃圾郵件徹底研究

 

文章轉載 https://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=46930

最近重新爬文研究 postfix 過濾垃圾郵件的部份

發覺網路上的中文資料很多都寫的不明不白,有些甚至是錯誤的。

我整理出一個比較合理的,參考看看:

若有錯誤也歡迎指正,大家互相交流 ^^


###########################################
# ★ 3. 垃圾郵件 過濾機制 規則 設定 #
###########################################
# 說明:
# 1.過濾規則有順序性,請合理安排先後順序,以便達到最佳效能。
# 2.一旦規則命中,就不會繼續往下比對。
# 3.當每行的第一個字為空白(tab或空白鍵)的文字列皆被視為上一列的延續。
# 4.同一個項目的設定,不可斷行,隔行會被視為結束。
# 5.FQDN (Fully Qualified Domain Name) 是指主機+網域名稱,比如:mail.xxx.com。
#
####################
# 可用的通用規則 #
####################
#
# 允許:
# permit_mynetworks ←允許來自 $mynetworks 的「寄信人」。(預設值)
# permit_sasl_authenticated ←允許經本機 SASL 驗證過的「寄信人」。(預設值)

# 拒絕(本機快速比對部份,較快):
# reject_unauth_destination ←拒絕「收件人」不在Postfix 所轄的網域(預設值)
# (所轄的網域由 $mydestination 定義)。
# reject_non_fqdn_hostname ←拒絕 HOLO 信號沒有 FQDN。
# reject_non_fqdn_sender ←拒絕「寄信人」沒有 FQDN。
# reject_non_fqdn_recipient ←拒絕「收信人」沒有 FQDN。
# reject_invalid_hostname ←拒絕「寄信人」「收信人」FQDN 不合網域名稱規則。
#
# 拒絕(需要連網查資料的比對部份,較慢):
# reject_unknown_sender_domain ←拒絕「寄信人」網域不存在。
# reject_unknown_recipient_domain ←拒絕「收件人」網域不存在。
#
#
# ★ reject_rbl_client [線上的黑名單資料庫] ★
# 使用指令 dig [黑名單資料庫] 測試網站是否還存活,存活才加進去。
#
# ★ check_sender_access hash:/etc/postfix/sender_vip.txt ★
# 允許「 VIP 寄信人」的網域直接通過,不做任何過濾。
# 「VIP 寄信人」網域清單,編輯在 sender_vip 這個檔案。
# 此規則請放在適當位置,才有優先效果。
#
# ★ check_sender_access hash:/etc/postfix/spam_domain.txt ★
# 僅對 spam_domain 清單檔案內的網域,進行 reject_unverified_sender 進階確認
# 「寄信人」進階確認可識破偽裝的網域,但需要花費 9秒以上時間
# 比如垃圾郵件「寄件人」用 gmial.com、yahoo.com 等偽裝,但實際上並不從那些主機寄出。
# 如常收到偽裝的垃圾郵件,可加入此項過濾。
# 此過濾需要花費大量時間,此規則建議放置末尾,黑名單前面,以利優化過濾速度。
#
# ★★ 外掛 postgrey 曙光 郵件過濾軟體 ★★
# 具體請參考「鳥哥私房菜」 postfix 一章教學。
# 此外掛過濾軟體會導致郵件晚幾秒或幾分鐘收到,但可有效過濾「單發型垃圾郵件」。
# 正常的郵件伺服器若第一次無法送達會重寄,而大部分的垃圾郵件發信機只發一次就不理。
# 若無安裝此 postgrey 軟體,以下此行請註解,否則 postfix 運作會出錯!
# check_policy_service unix:/var/spool/postfix/postgrey/socket


###############################################
# ★ 要求 MUA 發出 HELO 信號 # 
###############################################
# 說明:
# 預設值:no
# 正常的 MUA 軟體在寄信時會發出 HELO 信號表明主機網域身份,
# 有些垃圾郵件軟體會忽略這個步驟,這可阻擋一部分垃圾郵件。

smtpd_helo_required = yes


###############################################
# ★ recipient 收信 過濾規則 #
# (防止收到垃圾信) #
###############################################

smtpd_recipient_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 reject_unauth_destination
 reject_non_fqdn_hostname
 reject_non_fqdn_sender
 reject_non_fqdn_recipient
 check_sender_access hash:/etc/postfix/sender_vip.txt
 reject_invalid_hostname
 reject_unknown_sender_domain
 reject_unknown_recipient_domain
 reject_rbl_client cbl.abuseat.org
 reject_rbl_client bl.spamcop.net
 reject_rbl_client cblless.anti-spam.org.cn
 reject_rbl_client sbl-xbl.spamhaus.org
 check_policy_service unix:/var/spool/postfix/postgrey/socket


###############################################
# sender 寄信/轉遞 過濾規則 #
# (防止內部電腦中病毒,亂寄垃圾信) # 
###############################################
# 說明:
# 一般不需要開啟。開啟會影響寄信/轉遞效率,或甚至信寄不出去。
# 有時內部電腦中病毒亂轉遞垃圾信,會導致被 ISP 封鎖 SMTP。
# 使用此項過濾,可大致過濾掉收件人不存在的垃圾信被亂寄出。
# 這個只有在允許內部網路不必 SASL 驗證即可轉遞的情況下,才需要開啟。
# 若轉遞只允許 localhost,也不需要開啟。

#smtpd_sender_restrictions =
# reject_non_fqdn_recipient
# reject_non_fqdn_sender
# reject_invalid_hostname
# reject_unknown_recipient_domain


###############################################
# client(MUA)發信端 過濾規則 #
# (進階用途過濾) #
###############################################
# 說明:
# 一般不會用到,除非想要非常嚴格的過濾。
# 通用規則在此項不適用,僅有幾個特別的規則是給此項專用。
#
# check_client_access [允許轉遞的清單檔案] 
# 僅用於 smtpd_client_restrictions(MUA)發信端 過濾規則
# 範例:check_client_access hash:/etc/postfix/access
# "只有"列在清單檔案上的 IP、網段、主機名稱,才能與 postfix 連線。
# 此規則是用在 postfix 是組織內部聯絡專用主機的情況。
# 若 postfix 接收外面網路任何主機的郵件,此規則不可加入。
#
# reject_unknown_client 
# 僅用於 smtpd_client_restrictions(MUA)發信端 過濾規則 
# 當 MUA 連線時,若無法查詢該用戶端之 PTR(DSN 反解),則拒絕連線。
# 反解需要連網查詢,會花一些時間。
# 此規則不建議使用,因為很多私人或小公司架設的伺服器都沒有 PTR 反解。


#smtpd_client_restrictions =
# check_client_access hash:/etc/postfix/access
# reject_unknown_client


###############################################
# ★ 限制 Client (MUA) 的連線頻率 # 
###############################################
#
# 說明:
# 1.此項設定用來防護 DoS 阻斷式洪水攻擊。
# 2.此處的 client (MUA) 是指來自某位的 clinet 的連線,
# 非 postfix 整體處理數。

# postfix 計算 client (MUA) 連線數以多久時間為一「週期單位」
client_connection_rate_time_unit = 60s

# 在上面那個「週期單位」內,允許每個 client (MUA) 的最大連線數
smtpd_client_connection_rate_limit = 30

# 限制每個 clinet (MUA) 同一時間的最大連線數
smtpd_client_connection_count_limit = 20

# 在上面那個限制同一時間最大連線數,要允許例外的主機
# 預設已經允許 $mynetworks 不受限制
# 可設多組,多組以逗號隔開
#
# 參考可用的變數:
# $mydestination(通常是 $myhostname + $mydomain)
# $myhostname
# $mydomain

#smtpd_client_connection_count_limit_exceptions = $mynetworks,


因為論壇不支援 code 排版的關係,上面擷取的部份比較亂

完整版本的 main.cf 下載:(有排版)
註解中文程度約 80%,大部分關鍵的設定都有中文化
http://www.box.com/s/2gmtps3fod4ly7gfphvh

-----------------------------------------------------------

說明:

1. 關於主要的過濾三個段落解析

smtpd_recipient_restrictions = 收信 限制(input 防火牆)
smtpd_sender_restrictions = 寄信 限制(output 防火牆)
smtpd_client_restrictions = client(MUA)限制

recipient 英文收信的意思
restrictions 限制的意思

sender 英文是寄信者的意思,但這邊是指寄信


這三段限制,可以看作防火牆的三個鏈,這樣會比較容易理解

在過濾垃圾郵件的時候
其實只有 smtpd_recipient_restrictions (input)需要用到

因為我們過濾垃圾郵件,是不想「收到」垃圾郵件
是要在 input 那邊做過濾

在「寄信」(output)那邊進行過濾,就顯得不合理
「寄信」是指內部的人透過 postfix 轉遞把信寄出去時過濾

那麼為什麼要去過濾自己寄出的信?
胡亂過濾一通,反而還導致郵件寄不出去!
除非一種情況:內部有電腦中病毒,亂發垃圾郵件

而 client 限制,是專門針對 MUA端電腦主機 進行過濾。

client 端,可以是遠端不認識的人,也可以是自己內部的人。凡是要與 postfix 主機連線的,都是 client 端。

client 端的限制屬於比較特殊,能用的規則不多,通用規則在那邊並不適用,通常都是針對 IP 或主機名稱過濾,大部分只會用到一個過濾規則,即 PTR(DNS 反解)。


2.防火牆的過濾規則,有優先順序

從最前面開始,一條一條規則往下比對,一旦命中,就會做出相應的處理(放行 或 丟棄),而停止繼續往下比對。若所有規則都沒命中,最後的預設處理原則是放行。

所以這些規則在排列順序的時候,必須考慮到「優化」,讓過濾的速度更快些。

比方說:

一開始該放行的,先放行,來自內部網路自己人的郵件,直接放行,不再往下過濾。

檢查 HOLO 信號,和檢查 FQDN 完整性的,這是在本機直接檢查,比較快,就要放前面。

檢查 domain 網域名稱是否正確(即是和 DNS 伺服器查詢正解,判斷那台網域主機是否存在),這個需要連網查詢,比較慢,應該放後面。

而檢查 rbl 黑名單的,需要先去黑名單主機下載黑名單,然後還要進行比對,這個很慢,應該放最後面。

有另外安裝額外的過濾軟體,比如:曙光垃圾郵件過濾軟體,這個最慢,因為該軟體會先扣押來信數秒,若對方有重寄,才放行,用來防止單發型的垃圾郵件,因為最終絕招,也是最慢,所以要放最後面。


3.另外還有一個 "限制連線頻率" 的設定

這個和過濾垃圾郵件無關,主要是保護 postfix 主機免受 DoS 阻斷服務式洪水攻擊。

有些惡意的人可能寄來正確格式的郵件,因為是正確格式,垃圾郵件過濾規則,過濾不了。但是他可能一秒寄上萬封,postfix 處理不暇,導致 cpu 和 網路頻寬 負載太高,服務就會被阻斷。

考慮到這種情況的可能性,所以連線頻率也必須加以限制。

---------------------------------------------------

其它心得:

關於「SASL 認證」是否必要的迷思:

dovecot(套件:dovecot)是負責 POP3、POP3s、IMAP、IMAPs 等協定的支援

saslauthd(套件:cyrus-sasl)是負責 SASL 認證支援

SASL 認證,主要用於 postfix 「轉遞」郵件時的認證保護
白話的說,就是想利用 postfix 寄信的時候,需要帳號密碼登入


寄信是指:postfix 主機,自己 localhost 直接寄出信件

轉遞(relay)是指:postfix 以外的任何地方主機,欲透過 postfix 主機寄出信件,這個行為叫做轉遞。

之所以「轉遞」要做「SASL認證」(要登入驗證身份才給轉遞)
是因為不希望阿貓阿狗不認識的人,都來偷轉遞寄信


但是,假如 postfix 主機本身就有架設 web mail(比如:Roundcube),且所有使用者都是透過瀏覽器上 web mail 來收發信。

因為 web mail 軟體就裝在 postfix 那台主機,收發信都是直接 localhost 連線的。

這個情況下,其實 cyrus-sasl(SASL 認證) 不用裝,也不用開啟。只要在 postfix 的設定中,設定成只允許 localhost 127.0.0.1 轉遞,那麼 postfix 就"不會接受" localhost 以外的位址進行轉遞。

既然不會接受 localhost 以外的位址進行轉遞,那麼當然也就沒必要去驗證轉遞者的身份了。因為根本就不會轉遞了,轉遞功能已經被關閉了。

不過 dovecot 仍要裝和開啟,因為 web mail 軟體是使用 IMAP 或 IMAPs 協定與 postfix 連線的。


-----------------------------------------------------------

參考的網路資料:

Postfix 三十天就上手-Day 22 ~ 30
---------------------------------------------
http://ithelp.ithome.com.tw/question/10078139
http://ithelp.ithome.com.tw/question/10078302
http://ithelp.ithome.com.tw/question/10078506
http://ithelp.ithome.com.tw/question/10078814
http://ithelp.ithome.com.tw/question/10079113
http://ithelp.ithome.com.tw/question/10079349
http://ithelp.ithome.com.tw/question/10079659
http://ithelp.ithome.com.tw/question/10079923
http://ithelp.ithome.com.tw/question/10080091

arrow
arrow

    Johnson峰 發表在 痞客邦 留言(0) 人氣()