我們知道在現在網絡環境中, 存在大量的spam。
就筆者目前負責的一個在線郵件安全系統,每天爲客戶擋掉的spam就有200M 這麼多, 而且這還是已經下降了60%的結果,一年前, 大概每天spam的數量在1B左右。
龐大的垃圾郵件, 浪費的大量的網絡帶寬與磁盤空間。 如何來處理垃圾郵件呢。
一般來說, 有以下幾種選擇
1. 在SMTP對話中,當場拒收垃圾郵件。 這也在第一時間將垃圾郵件拒之門外, 但是也有可能會有合法郵件被認爲是垃圾郵件而被處理掉, 如果客戶不能接收這樣的損失, 可以採用方法2
2. 暫時將可疑的郵件存儲在另外的專用的郵箱中, 再研究可選的程序來處理他們。 比如定期檢閱被 集中起來的可疑郵件, 確定沒有合法郵件之後,一併刪除。
3. 將可疑的郵件打上某種特殊標記, 投遞到用戶的郵箱, 讓用戶收下後自行判斷。 (microsoft的outlook exchange就使用的這種方法)
Postfix的擋信機制
1) 客戶端判別規則
2)語法檢查參數
3)內容檢查
4)自定義規則
一、客戶端判別規則
smtpd_client_restrictions
smtpd_helo_restrictions
smtpd_sender_restrictions
smtpd_recipient_restrictions
smtp_dta_restrictions
如下:
讓我們來簡單看一個完整的SMTP對話過程
上面 0 對應是smtp_client_restriction過程, 這時已經知道了客戶端的IP地址。 就可以做出接受或者拒收的決定。
連接成功後, 客戶端發出 HELO命令, 就是1內容, postfix會依據smtp_helo_restriction來檢查主機名。
3是smtp_sender_restriction的依據與smtp_recipient_restriction的依據
4 是已經經過了header check 與body check,進入下一跳了。
限制條件 | 客戶端提供的受檢信息 |
check_client_access type:mapname | |
reject_rbl_client | 客戶端的IP地址或者主機名 |
reject_rhsbl_client | |
reject_unknown_client | |
check_helo_access type:mapname | |
permit_naked_ip_address | |
reject_invalid_hostname | |
reject_not_fqdn_hostname | HELO 提供的主機名 |
reject_unknown_hostname | |
check_sender_access type:mapname | |
reject_non_fqdn_sender | |
reject_rhsbl_sender | Mail From提供的寄件人的郵件地址 |
reject_unknown_sender_domain | |
permit_auth_destination | |
permit_mx_backup | RCPT TO提供的收件人郵件地址 |
reject_non_fqdn_recipient | |
reject_unauth_destination | |
reject_unknow_recipient_domain | |
check_recipient_access type:mapname | |
reject_unauth_pipelining | Data命令 |
permit | 無條件批准 |
reject | 無條件拒絕 |
defer | 無條件延遲 |
warn_if_reject | 將原來的REJECT變成WARN |
POSTFIX的限制條件分爲三大類
1) 內置的條件, 名稱是以permit_ 與 reject_開關的,不需要參數
2)自定義條件, 名稱是以check_開頭的,需要一個type:mapname自變量,mapname用來指定訪問表的名稱。
3)通用條件,它們沒有額外的自變量,也不檢查任何個信息,用來直接改變郵件的處理流程
對於內置的條件, 處理方式包括 OK(略過同一過濾規則的其餘條件,繼續下一個,直到所有的規則都完畢或者遇到REJECT), REJECT(立即拒收),DUNNO(看其他的結果)
如果整個的規則沒有明確的結果(全部是DUNNO),默認是收下郵件。
當處理是REJECT,Postfix並不是立即拒收, 而是等到RCPT TO命令時,纔會響應REJECT。如果想改變這種機制,讓其立即RJECT, 在main.cf中,設置 smtpd_delay_reject=no就可以了
當我們新加入一個規則,想調試的時候,
1) 將soft_bounce設置爲yes,這樣服務器返回的5xx會自動轉換爲4xx,這樣允許smtp client保留郵件以再次的嘗試。
如果確定沒有問題了, 再將其關掉。
2) 使用warn_if_reject,將原來的reject動作變成warn,留下log。
下面用一個例子還說明Postfix處理的過程 。
smtp_recipient_restrictions=
permit_my_network
reject_unauth_destination
reject_invalid_hostname
reject_unknown_sender_domain
其處理流程如下:下一篇,將繼續介紹,
Postfix (3) 反垃圾郵件的措施(2)
(未完,待續。。。)