歡迎您光臨本站 註冊首頁

(自己的一點心得)postfix下clamd+amavisd+spam反垃圾工作

←手機掃碼閱讀     火星人 @ 2014-03-05 , reply:0

(自己的一點心得)postfix下clamd+amavisd+spam反垃圾工作

本文是認為你postfix及clamd,amavisd,spamassassin都正常運轉,且你有對它們一定認識的基礎上的 。對於安裝調試請查閱其它帖子。謝謝。
Postfix反垃圾功能可以說在mta里是最好的了吧。在做反垃圾行動之前 ,需要搞清楚maillog和postfix 里的main。cf文件配置和基本命令,以及postfix的模塊,行為流程。我是翻閱了很多資料,然後吸取他們的東西,每當有選取別人的內容時候,我都會註釋出來的 ,我不會寫自己的認識的,因為你寫了也沒有別人的專業,我只是寫我的操作和理解,自己做過的要記錄下來,不然過一段時間可能就會記憶模糊了   (以下部分載自藍色月光技術貼),
        命令:postfix 本身也可以當成指令來執行,例如:
postfix check    檢查設定文件是否正確,相關數據夾是否建立,檔案擁有人和存取許可權是否正確
postfix start        啟動服務
postfix stop        停止服務
postfix abort        立刻中斷服務
postfix reload       重新載入設定檔
postfix flush        將隊列中的郵件全部寄出去

postfix 工作流程
sendmail 與 postfix 最大的不同在於程序結構上,sendmail 以一支大程序來執行所有的工作,而 postfix 則改采模塊化設計,這種設計的好處在於:程序代碼容易維護、模塊功能有彈性容易擴充。底下將針對組成 postfix 的每個模塊,它們各是負責哪些工作,又如何與其它模塊配合,作一個解說。
底下先說明收信流程:

圖例說明:橢圓代表模塊程序,黃色框代表郵件隊列或數據夾,藍色框代表設定檔。大框線內的模塊是由 master 模塊來控制行程。
•        當郵件由本機寄出時,系統執行 sendmail 程序,由於之前執行過 redhat-switch-mail 的關係,此時 sendmail 已經連結到 postfix 套件中的 postdrop 模塊,postdrop 模塊負責將郵件存放在 maildrop 數據夾中,等候 pickup 處理, pickup 模塊會對郵件內容進行檢查以保護 postfix 系統不會受到異常郵件的攻擊(譬如利用欄位溢位來破解主機)。
 
•        如果郵件是來自網路,postfix 套件中的 smtpd 將 會接收郵件並進行郵件過濾,為了應付千變萬化的偽裝郵件, 我們可以透過修改 UCE 設定檔(例如:來自 sendmail 的 access 設定檔),設定黑名單(或透過 RBL 黑名單資料庫取得黑名單)、 DNS 反查驗證,甚至是使用正規表達式來作字元串匹配檢查等方法,進行嚴格的過濾。
 
•        郵件有時候是來自 postfix 本身的 bounce 模塊,例如:當郵件無法遞送時,bounce 模塊會自動產生訊息以便通知寄信人。
 
•        郵件有時候也會由 LDA 產生,在上圖中用一道單獨存在的箭頭來表示(可以想象一下:該箭頭是連結到送信流程中的 local 模塊)。這種情形包括:根據 alias 別名資料庫改寫過收信人的郵件,或是根據每個使用者的 .forward 檔案指定的轉信信箱修改過收信人欄位的郵件。
 
•        除 了上述因無法遞送郵件引發的問題會由 bounce or defer 模塊產生通知郵件外,其它的錯誤產生時 postfix 也會自行產生通知郵件,例如:SMTP 通訊協議逾時,UCE 過濾規則衝突......等等,當然這種情形下只會通知 postmaster,在上圖中一樣用那一道單獨存在的箭頭來表示。
 
•        以上五種情況產生的新郵件,最後都會由 cleanup 模塊進行最後的處理。首先它會補足郵件中所缺少的欄位(例如來自 console 的信件將會預設 From: 欄位),並根據完整郵件地址格式改寫寄信人欄位(例如:shane@localhost 改成 shane@mail.spps.tp.edu.tw),接著讀取 canonical(全名對應) 和 virtual(虛擬對應) 設定檔,根據該設定改寫收信人欄位,所有動作處理完畢后,郵件被放置在 incoming 數據夾中,接著就會通知 qmgr 模塊有新郵件到了,由 qmgr 模塊開始進行送信作業 。
 
•        當 cleanup 模塊進行郵件欄位改寫時,實際上是呼叫 rewrite 模塊來處理,和 sendmail 不同的是,postfix 並未發展出一套複雜的宏語言來進行 rewrite 作業,相反的是採用單純的查表法來解決, 這也是 postfix 被批評功能不如 sendmail 強大的原因。postfix 開發者似乎認為 sendmail 之所以漏洞百出,與 rewrite 宏語言大而無當有直接相關(純屬猜測)。
底下說明寄信流程:
•        qmgr 模塊是整個郵件伺服器的核心,它將視情形呼叫 local、smtp、pipe 等 agent 模塊來進行寄信作業。local 模塊就是 LDA ,它負責將信件分到使用者信箱。smtp agent 顧名思義是指 smtp client 程序,而非 smtpd ,它負責將信件透過 SMTP protocol 遞送到網路上的遠程郵件伺服器。pipe 則用來處理傳真或其它封閉式網路系統的特殊電子郵件通訊協議。
當郵件出現遞送失敗的情形,qmgr 就會將郵件放在 deferred 隊列中,並呼叫 bounce 模塊處理,以避免延遲其它郵件的遞送作業 。
正 在處理中的郵件會被放在 active 隊列中,該隊列僅存放少量郵件,因為若郵件過多的話將會耗用海量存儲器,來自 incoming 資料夾的郵件,會根據郵件到達的順序依序進入 active 隊列, 而 deferred 隊列的郵件,將會暫停四個小時后,重新排入 active 隊列。
此外,qmgr 也會根據 relocated 設定檔來產生通知郵件,relocated 設定檔用來設定賬號或網域遷移的通知訊息,當 qmgr 發現某封郵件的收信人已經遷移,則會呼叫 bounce 模塊處理 。
 
•        在 遞送郵件的過程中,qmgr 會呼叫 rewrite 模塊解析收信人地址,通常 rewrite 模塊只會區分該信件是要到達本機,還是需要 relay,當然我們也可以透過 transport 設定文件,來要求 rewrite 模塊針對特定收信人地址遞送給特定主機(通常用來設定將 mail gateway 收到的郵件轉給下屬郵件伺服器)。
 
•        當信件無法遞送時(收信人或收信主機不存在或無響 應), qmgr 呼叫 bounce 模塊處理。bounce 模塊會將障礙情形以郵件型式遞交給 cleanup 模塊進行收信作業,同時將原始郵件排入 deferred 隊列,等待延遲遞送。如果無法遞送的原因是通訊協議或設定文件錯誤造成的(這種情形應通知管理員,而非寄信人),則信件將直接由 qmgr 處理,並不會去呼叫 bounce 模塊。
 
•        LDA 模塊主要工作是將信件寫入使用者的信箱中,或是根據 alias 設定或 .forward 設定改寫收信人欄位,並遞交給 cleanup 模塊進行收信作業,除了 postfix 預設的 local 模塊外,其它在 sendmail 中經常使用的外掛 LDA,例如:procmail,也可以繼續使用,這是因為 postfix 的 local 模塊是與 sendmail 完全兼容的。
其它幕後常駐模塊:
•        master:這個模塊用來監督 postfix 所有模塊,是否有依照 master.cf 中的設定執行,並會將超過上限的行程砍掉,以符合效能調校相關設定值。
 
•        flush:這個模塊用來維護 incoming 郵件隊列的雜湊表,它將郵件依收信目的地分類,建立多個雜湊表,當客戶端送出 ETRN spps.tp.edu.tw 要求時,則可以將要給 spps.tp.edu.tw 的郵件(有些可能還在排隊)優先全部寄出。
 
•        showq:當執行 mailq 指令查詢郵件隊列時,就是由此模塊提供信息。
 
•        proxymap:用來讀取設定檔,並提供設定文件內容給其它模塊,之所以這樣做是為了減少硬碟 I/O 存取。
 
•        spawn:用來呼叫執行外掛程序,透過這個機制我們可以執行非 postfix 提供的過濾程序,例如:病毒過濾。
 
•        pipe:這個模塊用來將郵件隊列中的郵件數據結構,傳輸給外部程序處理。當 master 模塊啟動外掛程序時,透過 pipe 當白手套就可以和外掛程序憑藉參數傳遞來溝通。
 
《解決方案》

常用工具:
•        postalias: 當我們執行 newalias 時,由於 redhat-switch-mail 的作用,其實是在執行 postalias,所以你也可以不用因此改變使用習慣喔!如果要透過這個指令建立 alias 雜湊表,指令格式比 newalias 稍微複雜一點:postalias hash:/etc/postfix/aliases,這道命令也可以用 postmap 代替,例如:postmap hash:/etc/postfix/aliases,其餘功能請參閱 postmap 的介紹。
•        postcat: 這是一個郵件 RFC 格式的剖析器,可以將原始郵件顯示成容易閱讀的格式,有點像用 outlook express 看到的郵件內容(假如在郵件上按右鍵查看原始內容,你可能就看不懂了),請指定要查看的檔名:postcat /var/spool/postfix/deferred/filename,由於檔名都是使用郵件編號,如果不知道要看的郵件是什麼檔名時,可以用下面 的指令查詢!
•        postqueue:用來取代 mailq 指令,使用 -p 參數就可以將郵件依編號順序列出郵件標頭(寄信人、收信人和信件主旨),方便檢索查詢!-s 參數則是列出前面介紹過的 flush 雜湊表!
•        postsuper: 這個命令用來操作隊列中的郵件,只有 root 身分才能執行。參數 -d 用來刪除郵件,-r 用來將郵件排到不同隊列里(maildrop、incoming、active或deferred),-p 當伺服器(或 postfix 程序)當掉重開機后,用來救回工作到一半的郵件。
•        postconf:這是個功能強大的工具,除了可以用來顯示 main.cf 的詳細設定內容外(自動分類),也可以用來除錯,甚至還提供修改設定的介面,例如:postconf -e mynetworks=168.100.189.0/25,這個功能如果結合 script 程序來運作,就能做到透過網頁遠程管理設定擋。我們經常使用 -n 參數,來查看 postfix 設定文件擺放的位置!
•        postmap: 用來取代 makemap 指令,並且與 makemap 完全兼容,支持的檔案類型包括:btree、dbm、hash。當用來建立資料庫檔案時,語法如后:postmap hash:/etc/postfix/access,這個工具也可以用來查詢資料庫檔案里的內容,例如:postmap -q 172.16.2 hash:/etc/postfix/access,這會列出該行的規則,如要刪除可以使用:postmap -d 172.16.2 hash:/etc/postfix/access,透過這個方式能及時有效的管理,不用重新修改 access 文字文件,然後雜湊成資料庫,然後重新啟動 postfix 載入設定檔等等,作一連串動作!
藍色月光的內容完畢,似乎有些命令用起來有些問題,大家有什麼想法請表達出來,我用公司的mail server,不敢隨便做實驗,如果上述內容那些不對,請指出來。
現在看maillog部分,查看maillog的時候amavisd部分就會看到分值了,amavisd調用spamassassin打分,cleanup就是對mail的結束處理。Smtpd是對網路部分的處理,postfix/nqmgr是隊列的處理。這個上面都講到了。仔細觀察,log的記錄,可以自己發郵件測試。



       現在看main。Cf配置,進去配置的時候需要注意每個改動自己都要清楚,都要有個備份。這樣改不好的時候可以恢復回來。還要知道裡面可以加cbl,但不要加rbl,sbl之類的。不要做反向域名解析,那樣你會丟失很多正常的mail。關於main的配置說明請到google上去search。
       以下是我后加的部分配置,
       smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 100
smtpd_error_sleep_time = 5s
fork_attempts = 5
fork_delay = 2s
transport_retry_time = 60s
deliver_lock_attempts = 5
deliver_lock_delay = 1s
stale_lock_time = 500
initial_destination_concurrency = 2
default_destination_concurrency_limit = 20
queue_run_delay = 1000s
maximal_queue_lifetime = 1d
minimal_backoff_time = 1000s
maximal_backoff_time = 4000s

smtpd_sender_restrictions = reject_unknown_sender_domain,reject_non_fqdn_sender
line_length_limit = 2048
header_size_limit = 102400
extract_recipient_limit = 10240
message_size_limit = 2240000
bounce_size_limit = 50000
header_checks = pcre:/etc/postfix/header-checks

content_filter = smtp-amavis:127.0.0.1:10024
    下面開始說明
郵件標頭過濾
標頭過濾所過濾的對象,除了郵件標頭外,更擴大範圍到附加檔案的 MIME 標頭,使得過濾可以更精確的進行,而不會因規則過於模糊,殃及無辜的郵件。用過 procmail 的使用者要特別注意:附加檔案檔名或檔案類型是在此過濾,而非在郵件內文過濾。設定方式如下:
header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks
在外掛設定檔 header_checks(可以改用其它檔名)中,當字元串比對命中時,可以採取各種處理動作,包括:
REJECT        拒收信件。
OK        跳過符合條件的標頭不作後續檢查,在 sendmail 中一旦 OK 該信件就會被接受,但在 postfix 中,OK 僅用來跳過該標頭的後續比對,萬一有其它標頭被拒絕,該封郵件一樣會被拒絕。
IGNORE        從郵件刪除該標頭。
WARN        附加警告訊息。
HOLD        放回隊列,等候處理。
DISCARD        直接將郵件丟棄,不響應拒收訊息。
FILTER transport.nexthop        呼 叫外掛過濾程序,進行郵件內文剖析過濾。外掛過濾程序可以是任何一種可執行的檔案,例如:shell script。該程序必須先定義在 master.cf 中,模擬成一個 socket 來執行(由 master 模塊負責伺服監聽),當需要呼叫它執行時,postfix 中的 clearup 模塊會將整封郵件丟到指定的 port 號,master 模塊監聽到訊息後會執行相對應的過濾程序。
header_checks 的範例如下:
/^Subject: Make Money Fast/ REJECT
/^To: friend@public.com/ REJECT
如果未設置此參數,則郵件標頭過濾功能將會關閉不啟用,這是系統默認值。     (個人點評:這個是postfix自帶的過濾功能,使用效果個人感覺一般,既然spamassassin有規則集,實在沒必要在這裡做.不過知道沒有什麼壞處)  

郵件內文過濾
這是用來過濾所有標頭過濾沒檢查到的郵件內容,設定方式與前面相同:
body_checks = regexp:/etc/postfix/body_checks
body_checks = pcre:/etc/postfix/body_checks
如果未設置此參數,則郵件標頭過濾功能將會關閉不啟用,這是系統默認值。(實為雞肋,一般沒有人開啟吧)
對於客戶端過濾,還是小心為妙.
對於寄信人,收信人過濾,裡面有很多參數,參考如下:
寄信人過濾
此功能並非過濾郵件標頭裡的寄信人欄位,而是過濾 mail from: 命令後面的字元串,默認值是不過濾,但由於廣告信寄信程序為了能順利寄信,經常會偽造此字元串,建議應該啟用。
可以使用的選項包括:
reject_unknown_sender_domain        寄信人的網域名稱無法從 DNS 查詢驗證時,拒絕聯機。
reject_rhsbl_sender        寄信人信箱如果被紀錄在 SPAM 資料庫站台,就拒絕他聯機。
check_sender_access        根據 access 設定過濾存取許可權。
reject_non_fqdn_sender        寄信人的網域名稱不是完整 FQDN 格式時,拒絕其聯機。
reject_sender_login_mismatch        寄信人信箱與登入的賬號不吻合時,拒絕其聯機。須配合 SASL 使用者認證機制使用(SMTP AUTH)。
配合 smtpd_sender_login_maps 指定的對應表,可以讓登入賬號與使用的信箱作對應,例如:shane 賬號可以用 webmaster 信箱寄信。
其它 permit、defer、reject、warn_if_reject、reject_unauth_pipelining 請參考前面的說明。
設定範例如下:
smtpd_sender_restrictions = reject_rhsbl_sender dsn.rfc-ignorant.org(國外免費的 SPAM 資料庫:擋寄廣告信的信箱)
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain
smtpd_sender_restrictions = permit_sasl_authenticated,reject_unknown_sender_domain,reject_non_fqdn_sender
收信人過濾
此功能並非過濾郵件標頭裡的收信人欄位,而是過濾 rcpt to: 命令後面的字元串,默認值是不過濾,但由於廣告信寄信程序為了能順利寄信,經常會偽造此字元串,建議應該啟用。
可以使用的選項包括:
permit_auth_destination        收信人網域符合 $relay_domains、$mydestination、$inet_interfaces、$vitual_alias_domains、$virtual_mailbox_domains 的定義時,接受聯機。
reject_unauth_destination        收信人網域不符合上述設定時,拒絕聯機。
permit_mx_backup        當 從 DNS 上查到本機為收信人網域的備份 MX 時,接受聯機。使用此功能有安全漏洞,可以配合 permit_mx_backup_networks = 172.16.0.0/16 來檢查主要 MX 是否在該網段內,來加強過濾功能(避免被不信任的網域設定為轉信 MX)。
check_relay_domains        允許代收要給 relay_domians 的信件。
check_recipient_access        根據 access 設定過濾存取許可權。
check_recipient_maps        當 收信人網域不符合 permit_auth_destination 之要求,或是收信人信箱不符合 $local_recipient_maps、$virtual_alias_maps、$virtual_mailbox_maps、$ relay_recipient_maps 的定義時,拒絕聯機。此參數可以放在收信人過濾規則的最後面,當作過濾政策。
reject_unknown_recipient_domain        收信人的網域名稱無法從 DNS 查詢驗證時,拒絕聯機。
reject_rhsbl_recipient        收信人信箱如果被紀錄在 SPAM 資料庫站台,就拒絕他聯機。
reject_non_fqdn_recipient        收信人的網域名稱不是完整 FQDN 格式時,拒絕其聯機。
其它 permit、defer、reject、warn_if_reject、reject_unauth_pipelining 請參考前面的說明。
設定範例如下:
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination,reject_non_fqdn_recipient
ETRN 命令過濾
用 來過濾哪些網域或哪些客戶端,可以使用 ETRN 命令。ETRN 命令用來一次處理大量郵件,當某個客戶端使用 ETRN 時,有時候會影響到其它用戶寄信的效能,通常只有撥接用戶、幫撥接用戶轉信的 mail gateway、郵件討論群組(mailing list)或電子報發行站台,需要使用此功能。postfix 的默認值是所有客戶端都可以使用 ETRN 命令。
能使用的特殊參數只有 check_etrn_access,其餘與客戶端過濾參數相同,請自行查閱前文。設定範例如下:
smtpd_etrn_restrictions = permit_mynetworks, hash:/etc/postfix/etrn_access, reject
(個人覺得: 對於sender domain 和recipient domain 是在做反向域名解析,加上了這個,那麼大多數的信件都不用投遞了,你可以用host –t mx abc.com , host abc.com ,host 11.22.33.44 命令查詢 . 便可知哪個做域名解析了 . sbl也是不要的. fqdn倒是可以加 )
《解決方案》

效能調整是很有用的 ,如下
同步處理限制
postfix 採用同步處理限制來進行流量調整和控制,當 postfix 寄信到某個郵件主機時,首先傳兩封信過去(initial_destination_concurrency = 2),如果一切正常則逐步增加每次傳送的量,一直到傳輸失敗或者是到達同步上限每次 20 封信(default_destination_concurrency_limit = 20)。
如果想要針對不同 agent 來設定同步上限,也可以使用底下的參數(未設定的參數將會沿用 default_destination_concurrency_limit 限制):
local_destination_concurrency_limit = 2
uucp_destination_concurrency_limit = 2
smtp_destination_concurrency_limit = 10
收信人限制
這 是指一封信可以寄給多少人,postfix 預設可以處理 50 個收信人(default_destination_recipient_limit = 50),如果一封信的收信人超過 50 人,postfix 會自動將此信複製成很多份,以 50 人為單位分批寄送。
和同步處理限制一樣,可以針對不同 agent 來設定不同上限:
uucp_destination_recipient_limit = 2
smtp_destination_recipient_limit = 10
延遲傳送
當 郵件伺服器使用撥接線路聯機時,由於部分時段處於斷線狀態,當 postfix 處理信件時會因為無法收發信件,持續產生錯誤訊息,為了避免發生這個現象,我們可以設定 defer_transports = smtp 來告知 postfix,要從 smtp agent 傳送出去的郵件暫時不要傳送。這些郵件可以等到上線后,再以 ETRN 指令全部寄出。
如果本機是前述郵件伺服器的 mail gateway,由於該伺服器只有部分時段上線,因此有可能 mail gateway 已經累積許多信件等待傳送給它,為了避免 mail gateway 持續嘗試傳送,可以設定:
defer_transport = hold
接著在 /etc/postfix/transport 設定:
customer.com   hold:
這個設定的意思是,要給 customer.com 的郵件先暫存在 gateway.customer.com,等待前者上線后再全部傳送給它(使用 ETRN 命令)。
設定好后,還需修改 master.cf,找到 smtp 行程設定(可參考前面小節),將 smtp 改為 hold 即可:
hold   unix   -   -   n   -   -   smtp
傳送失敗處理
當郵件傳送失敗的時候,負責傳送郵件的 Agent 會將郵件退回給 qmgr 模塊,qmgr 模塊則會計算從郵件到達到現在的時間間隔,依此時間間隔將郵件排入延遲傳送隊列中,以等待下次傳送。
如 果該封郵件傳送到一半的時候失敗了,也就是說有些收信人有收到,有些沒有。這種情況下,除了將該郵件排入延遲傳送隊列外,也會將傳送失敗的對象排入 dead 清單一段時間,在這段時間內如果有其它郵件要傳送給這些對象時,就會直接排入延遲傳送隊列,而不用徒勞無功地去嘗試傳送!
底下是有關於郵件傳送失敗處理的相關效能設定:
queue_run_delay = 1000s        qmgr 模塊每 1000 秒(約 16 分鐘)檢查一次 defer 隊列,查看是否有郵件須排入 active 隊列
maximal_queue_lifetime = 5d        無法傳送的信件在 defer 隊列里最多保存 5 天,超過時間則退給寄信人
minimal_backoff_time = 1000s        傳送失敗的郵件至少在 defer 隊列中暫停 1000 秒,而且被排入 dead 清單的收信人至少也要待 1000 秒,也就是說在這段時間內不再嘗試寄信給他
maximal_backoff_time = 4000s        傳送失敗的郵件最多在 defer 隊列中等待 4000 秒(約 1 小時)
qmgr_message_recipient_limit = 1000        dead 清單的大小,也就是說第 1001 個傳送失敗的對象,不會被排入 dead 清單
拖延戰術
當懷有惡意的客戶端連續傳送大量郵件時,postfix 為了處理這些郵件耗掉太多資源,導致無法正常工作,這也就是經常被討論的「阻斷服務攻擊」。
postfix 的設計者認為阻斷服務攻擊是不可能被解決的,因為我們無法單從郵件區分出它是惡意或善意,但是我們可以透過一些手段來降低損害。postfix 採用的方法是針對每條聯機,設定一個聯機錯誤計數器( session error count),當客戶端聯機時,開啟計數器,如果客戶端傳送不存在的 SMTP 命令(這絕對是惡意想阻斷服務),或是超過字數限制的長字元串(內存溢位攻擊)、超過一行的標頭(引發郵件剖析錯誤),計數器就會不斷累加。當郵件交寄成 功時,計數器才會歸零重新計算。
現在我們只要根據計數器採取適當的處理動作就行了:
smtpd_soft_error_limit = 10        當計數器到達 10 時,就暫停該聯機一段時間
smtpd_hard_error_limit = 100        當計數器到達 100 時,直接斷線
smtpd_error_sleep_time = 5s        每次暫停 5 秒鐘
 資源管制
postfix 可以在記憶體有限的系統上執行,而不會影響其它服務的效能,這是因為 postfix 提供的記憶體管理功能非常有彈性,可以依據各種需求加以調整。
每封郵件用量限制
當 postfix 處理郵件時,必須將郵件暫存於郵件佇列中,其中 maildrop 和 incoming 佇列使用硬碟,而 active 和 deferred 則使用記憶體,每封暫存在佇列中的郵件耗用多少記憶體是由郵件資料結構來決定,幸運的是這個資料結構的欄位大小是可以微調的,透過這些微調就能決定 postfix 的最大記憶體用量了!
line_length_limit = 2048        從用戶端接收待寄郵件時,每行最多 2 KB
header_size_limit = 102400        每封郵件的標頭大小不得超過 100 KB
extract_recipient_limit = 10240        每封郵件的收信人欄位不得超過 10 KB
message_size_limit = 10240000        每封郵件(包含信封)的大小,不得超過 10 MB
queue_minfree =         當記憶體剩下多少 Bytes 時,才可以處理下一封郵件,預設是沒有限制。
bounce_size_limit = 50000        警告信的大小限制為 50 KB。
假設通通使用預設值,也就是所有參數都不設置,那麼處理一封郵件須耗用 10.05 MB,再加上 postfix 模組程式的大小,總共約 20 MB,這也就是 postfix 運行的最小需求了!
郵件數量限制
當前述用量限制設置完畢後,接著我們還可以針對郵件佇列一次要處理多少郵件作出限制,把每封郵件記憶體用量乘上郵件數量,就可以算出所需的記憶體總量,當記憶體足夠時,我們當然希望儘可能多處理幾封郵件來增進 postfix 的效能。
qmgr_message_recipient_limit = 1000        這個參數之前介紹過了,除了用來控制 dead 清單的大小外,也控制著處理中的郵件收信人總量,兩者的預設限制都是 1000。
qmgr_message_active_limit = 1000        最多同時處理 1000 封郵件。
duplicate_filter_limit = 1000        在進行收信人過濾時,要快取多少已通過過濾的清單,這個功能是用來提高過濾效能,預設要快取 1000 個不同收信人
時間限制
postfix 某些模組在運作時,會依照設定檔的要求讀取外掛程式或是執行 shell 命令,有些則是會讀取外部檔案。如果無限制的讓 postfix 等待外部命令執行完畢或等待外部檔案讀取完畢,將會因為這些外部程式的設計不當或 I/O 衝突,而導致 postfix 無法運作,因此就需要設定等候時間限制,超過此時間限制 postfix 將逕行處理下一個程序。
舉例來說:當 local agent 將郵件分到使用者信箱時,會透過 proxymap 模組讀取 alias 資料庫,接著根據 alias 設定讀取 :include: 檔案,最後讀取 .forward 檔案,前述動作中如果其中一個因為系統 I/O 忙碌無法於時間限制內讀取檔案,local agent 就會直接跳過進行下一個處理動作。
command_time_limit = 1000s        等候外部命令或 I/O 的時間不可超過 16 分鐘。
service_time_limit =         這個參數的目的是允許不同 service 採用不同時間限制,因此它會取代前述參數的設定,其中 service 就是 master.cf 中的第一個欄位。
檔案鎖定
當 local agent 要將信件分到使用者信箱時,有時候使用者正透過 POP3 讀取信箱,因此信箱被鎖定無法開啟,這種情況發生時,local agent 必須等候一段時間重新嘗試讀取檔案,但也不能一直等下去,所以必須要有一些限制。
postfix 支援兩種的檔案鎖定機制:一、使用系統函式 fcntl( ) 或 flock( ),二、使用 local file,postfix 將根據作業系統的不同,選擇其中一種或兩種並用。有關檔案鎖定機制在這裡不予討論,有興趣的讀者可以從「專業 Linux 程式設計」(Wrox 出版,碁峯翻譯經銷)一書一窺究竟。
deliver_lock_attempts = 5        檔案被鎖定時,嘗試讀取 5 次。
deliver_lock_delay = 1s        每次嘗試讀取前,先等候一秒鐘。
stale_lock_time = 500        當 lock file 存在超過 500s 時,強制刪除 lock file 解除其鎖定狀態。使用 lock file 其實是透過程式設計技巧來模擬檔案鎖定功能,它必須由程式設計師自行維護鎖定狀態,萬一有粗心的設計者鎖定檔案後忘記解除,或是程式當掉無法解除鎖定,都 會造成檔案長期被鎖定的假象,所以需要此設定來排除問題。
行程自動回復
當 行程或子執行緒因為某些原因當掉,例如:記憶體不足......等,這個時候 master 將會延遲一段時間後嘗試重新啟動該行程。當然,如果程式當掉的原因是 main.cf 檔案損毀所造成的,就算是不斷重複啟動也不能恢復正常,因此 postfix 也會將當掉的情形紀錄在系統日誌裡,以便管理員偵錯並人工修復。
fork_attempts = 5        行程當掉以後,會嘗試重新啟動它 5 次!
fork_delay = 1s        每次重新啟動前,先等候一秒鐘。
transport_retry_time = 60s        qmgr 每隔 60 秒嘗試驅動 agent 進行分信。
 
   關於clamd,amavisd,spamassassin的配置,做的最好的是易人居士的了.我基本是按照他寫的,然後根據自己的因數改一部分內容.現在直接copy過來,然後說一下自己的看法.
Clamav (/usr/local/etc/clamd.conf )

# This option enables scanning of Microsoft Office document macros.
# Default: enabled
ScanOLE2                 打開office文檔掃描

# Enable internal e-mail scanner.
# Default: enabled
ScanMail                 打開郵件掃描

# ClamAV can scan within archives and compressed files.
# Default: enabled
ScanArchive             掃描壓縮包

# Due to license issues libclamav does not support RAR 3.0 archives (only the
# old 2.0 format is supported). Because some users report stability problems
# with unrarlib it's disabled by default and you must uncomment the directive
# below to enable RAR 2.0 support.
# Default: disabled
ScanRAR                 掃描RAR壓縮包

# Files in archives larger than this limit won't be scanned.
# Value of 0 disables the limit.
# Default: 10M
ArchiveMaxFileSize 10M     最大掃描壓縮包文件為10兆

# Nested archives are scanned recursively, e.g. if a Zip archive contains a RAR
# file, all files within it will also be scanned. This options specifies how
# deep the process should be continued.
# Value of 0 disables the limit.
# Default: 8
ArchiveMaxRecursion 9         掃描壓縮包9層

# Number of files to be scanned within an archive.
《解決方案》

# Value of 0 disables the limit.
# Default: 1000
ArchiveMaxFiles 1000         最多掃描壓縮包內1500個文件

# Set access mask for Clamuko.
# Default: disabled
ClamukoScanOnOpen
ClamukoScanOnClose
ClamukoScanOnExec

# Don't scan files larger than ClamukoMaxFileSize
# Value of 0 disables the limit.
# Default: 5M
ClamukoMaxFileSize 10M

-----------------------------------------------------------------------------------------------
(關於clamd,其實過濾效果是很好的,隨便設置一下,都會達到100%過濾的,反病毒還是做的很好.不過我後來註釋掉了很多)
Amavisd-new   (/etc/ amavisd.conf   )

D_PASS:   不做任何處理,直接傳送給收件人。
D_DISCARD:   郵件不傳送給發件人及收件人。
D_BOUNCE:   不傳送給收件人。除了定義在 $viruses_that_fake_sender_re 病毒名稱外的信件,amavisd-new 皆會傳送 DSN 訊息給發件人。
D_REJECT:   不傳送給收件人,發件人會收到拒絕傳送的信息。
        
$sa_auto_whitelist = 1;   # 啟用自動學習白名單 White List
$sa_mail_body_size_limit = 200*1024;   # 超過某個特定大小的郵件就不經過
SpamAssassin 的掃描。
      
$sa_tag_level_deflt = 4.0;   # 超過這個分數標準者,才視為垃圾郵件打分數。
                    加入 X-Spam-Status 及 X-Spam-Level 信息頭

$sa_tag2_level_deflt = 6.3;   #   超過這個分數標準者,才允許在郵件標題加入
                        Spam 信息。
                        加入 X-Spam-Flag:YES 及改寫主題
(你如果細心查看maillog ,就會發現sa_tag2_level_deflt才是垃圾信的標準,超過6.3的pass,低於的就Passed SPAM了 ,所以我把這個值提高到7 , 另外我的$max_servers = 10;)
$sa_kill_level_deflt = 10 ;   #   超過這個分數標準者,就直接將信件備份后刪除。

$sa_dsn_cutoff_level = 9;   # 超過這個分數標準者,將不會送出 DSN 信息。

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

Spamassassin   (/etc/mail/spamassassin/local.cf )

# SpamAssassin config file for version 3.x
# NOTE: NOT COMPATIBLE WITH VERSIONS 2.5 or 2.6
# See http://www.yrex.com/spam/spamconfig25.php for earlier versions
# Generated by http://www.yrex.com/spam/spamconfig.php (version 1.50)

# How many hits before a message is considered spam. 得分多少以上就會被判定為垃圾郵件。
required_hits       6.3
(不知道自己的spamassassin的version 可以輸入spamassassin –version查看 ,  我的值都高點,我設成6.5 )
# Whether to change the subject of suspected spam. 在已判定的垃圾郵件之標題加上標記。( 如果是使用amaivsd來呼叫spamassass進行過濾的,請修改 Amavisd-new 的配置文件amavisd.conf 中的相應選項:$sa_spam_subject_tag = '***[ Junk Mail ]*** '; )
rewrite_header Subject ****SPAM(_SCORE_)****

# Encapsulate spam in an attachment.
# 要如何處理垃圾郵件。如果郵件還會經過防毒程序的掃描處理,所以必須設定為 0。
# 0:將信息寫入郵件表頭。
# 1:將垃圾郵件轉為附件。
# 2:將垃圾郵件轉為純文字附件。
report_safe         0

# Use terse version of the spam report. 用精簡的方式來回復垃圾郵件信息給管理者
use_terse_report     0

# Enable the Bayes system. 使用貝葉斯學習系統
use_bayes           1
(光啟用了似乎還不可以吧,還需要指定一些參數,參考如下
# 是否使用 Bayesian
use_bayes 1
# Bayesian 之資料庫位置
bayes_path /var/lib/amavis/.spamassassin/bayes
# 是否啟用 Bayesian 自動學習功能?
auto_learn 1
不過我沒有找到我的bayes的資料庫位置 ,所以就沒有寫出來  )

# Enable Bayes auto-learning. 開啟貝葉斯自動學習功能
auto_learn         1

# Enable or Disable network checks. 略過 RBLs 檢查、使用 Razor version 2、使用 DCC (Distributed Checksum Clearinghouse)、使用 Pyzor
skip_rbl_checks       0
use_razor2         1
use_dcc           1
use_pyzor           1

# Blacklist. 黑名單,判定減 + 100 分
blacklist_from *@sohu.com *@mailfb.com

# Whitelist . 白名單,判定加 — 100 分 (這個很管用,一定要用好)
whitelist_from *@yahoo.com.tw *@yahoo.com.hk *@yahoogroups.com.hk
whitelist_from rika@rika.idv.tw

# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - chinese
ok_languages         zh en

# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales         zh en

# Disabled scores. 防止中文主旨和中文收件者誤判,建議再加上下列幾行
score HEADER_8BITS 0
score HTML_COMMENT_8BITS 0
score SUBJ_FULL_OF_8BITS 0
score UPPERCASE_25_50 0
score UPPERCASE_50_75 0
score UPPERCASE_75_100 0

# local domain from but ip not match. 域名和 IP 不符合,疑為垃圾郵件
header __FROM_TEATIME Received =~ /from test.com.cn/i
header __FROM_TEATIME_IP Received =~ //
meta FROM_TEATIME_BUT_IP_ERROR (__FROM_TEATIME)
describe FROM_TEATIME_BUT_IP_ERROR From test.com.cn but ip not match
score FROM_TEATIME_BUT_IP_ERROR 8

score NO_REAL_NAME 4.000
score SPF_FAIL 10.000
score SPF_HELO_FAIL 10.000
score BAYES_99 4.300
score BAYES_90 3.500
score BAYES_80 3.000
Spamassassin 系統設置之 黑白名單

-----------------------------------------------------------------------------------------------------
vi /etc/amavisd.conf (加入以下兩行)

-----------------------------------------------------------------------------------------------------
read_hash(\%whitelist_sender, '/var/amavis/var/.spamassassin/whitelist');
read_hash(\%blacklist_sender, '/var/amavis/var/.spamassassin/blacklist');


-------------------------------------------------------------------------------------------------------
註明:以上兩個文件 whitelist 和 blacklist 要手動建立
《解決方案》

touch > /var/amavis/var/.spamassassin/whitelist
touch > /var/amavis/var/.spamassassin/blacklist
兩個文件的屬主屬性為:
chown amavis:amavis whitelist
chown amavis:amavis blacklist

1)建立后,執行 /etc/rc.d/init.d/amavisd reload 讓 amavisd 重新讀取配置文件信息。

2)登記在 whitelist 的郵件地址或域名均不會被 Spamassassin 打分為垃圾郵件。

3)登記在 blacklist 的郵件地址或域名均會被 Spamassassin 打分為垃圾郵件。

4)whitelist 和 blacklist 的寫法,例如:
test@test.com.cn
*@boss.com

5)修改了 whitelist 或 blacklist 文件,均需要執行 /etc/rc.d/init.d/amavisd restart 讓 amavisd 重新啟動,否則,黑白名單不能生效 !!!(我似乎感覺不到這兩行的威力,加了之後還是打分,判斷是否垃圾 ….. 如果大家有什麼好的判斷,請說出來,一起研究  )

修改好了這些后時候就萬事大吉了呢  ,不是的  . 每個mail server都不同,都會有不同的垃圾源盯上你的mail server的.所以必須量身定做 適合自己的垃圾規則集, 我以前一直忽略了這個問題,只是在postfix配置 和clamd amavisd參數上下功夫,事倍功半的 .  
仔細search你的maillog ,grep 你的昨天 前天的mail的收發信息,  然後grep  Passed SPAM ,或者 grep Passed CLEAN 挑出通過的和沒通過的,自習研究他們的數量和規律,例如你查處有個叫debora**的sb總是向你發mail ,每天上百封,你就可以過濾掉它. 而某某好的郵箱給你發信,竟被你拒掉了,那麼添加規則 凡是它發過來的都pass . 或者進入/var/virusmails, gunzip –d * ,然後grep 某人 ,查看他的郵件的打分情況  ,例如下面的  
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1437
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1437
X-Spam-Status: Yes, score=22.214 tag=4 tag2=6 kill=10 tests=[BAYES_00=-2.599,
EN_SUBJECT_147=11, EXTRA_MPART_TYPE=1.091, HELO_DYNAMIC_DHCP=3.066,
HELO_DYNAMIC_IPADDR=4.2, HTML_MESSAGE=0.001, RCVD_IN_BL_SPAMCOP_NET=1.558,
RCVD_IN_XBL=3.897]
X-Spam-Score: 22.214
X-Spam-Level: *********************
X-Spam-Flag: YES就知道自己打分的情況了 .   
你可以vi /usr/share/spamassassin/aaa.cf  定義自己的垃圾標準    ,例如
header EN_SUBJECT_147           Subject =~ /all/
score EN_SUBJECT_147            11.00
header EN_SUBJECT_148           Subject =~ /hi all/
score EN_SUBJECT_148            11.00
header EN_SUBJECT_149           Subject =~ /It's/
score EN_SUBJECT_149            11.00
header EN_SUBJECT_150           Subject =~ /this it/
score EN_SUBJECT_150            11.00
header EN_SUBJECT_151           Subject =~ /Your/
score EN_SUBJECT_151            11.00
header EN_SUBJECT_152           Subject =~ /wrote/
score EN_SUBJECT_152            11.00
header EN_SUBJECT_153           Subject =~ /QBQ/
score EN_SUBJECT_153            11.00

郵件from呢  
header EN_FROM_017              From:name =~ /4tune/
score EN_FROM_017               11.00
header EN_FROM_018              From:name =~ /newsletter/
score EN_FROM_018               11.00
header EN_FROM_019              From:name =~ /debora/
score EN_FROM_019               11.00
及對郵件內容打分 等等   ,以上匹配的都是要加11分的  ,垃圾嫌疑值可自己酌情定義. 最後累加 看是否超過及格線,超過為垃圾
添加完后都是需要重啟服務的   .   

好了,基本上先寫這些東西,大家有什麼想法可說出來,不對的地方請指正批評
《解決方案》

頂。收藏了!
《解決方案》

不要收藏    多說說看法

[火星人 ] (自己的一點心得)postfix下clamd+amavisd+spam反垃圾工作已經有2377次圍觀

http://coctec.com/docs/service/show-post-43475.html