茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1664719 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00038.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2012/11/20 7:08:01
Postfix反垃圾郵件技術(2)
 添加時間:2009-05-18 原文發表時間:2009-05-18  人氣:3

  一個smtpd_recipient_restrictions的例子:


smtpd_recipient_restrictions = reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
permit_mynetworks,
reject_unauth_destination,
check_client_access hash:/etc/postfix/client_checks,
check_client_access regexp:/etc/postfix/client_checks.re,
check_helo_access hash:/etc/postfix/helo,
check_sender_access hash:/etc/postfix/sender,
check_recipient_access regexp:/etc/postfix/recipient.re,
reject_rbl_client relays.ordb.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client blackholes.easynet.nl,
reject_rhsbl_client dsn.rfc-ignorant.org,
permit

  這裡要注意,有可能由於對reject_non_fqdn_*和reject_unknown_*的檢查而導致一些主機名沒有正常解析的機器不能正確發信。另外,在應用這個規則前,可以在規則列表頭加上warn_if_reject來檢查一下。

  2、多階段過濾和單階段過濾

  由於一些windows上有缺陷的郵件程序不處理在RCPT TO指令前的發回的拒絕狀態碼,所以Postfix默認不會在匹配了拒絕規則後就立刻斷開連接,而是在RCPT TO指令處理完之後再斷開的。可以通過smtpd_delay_reject設置為no來立刻發送拒絕狀態碼斷開連接(默認是yes)。

  視乎smtpd_delay_reject設置為yes或no的不同,Postfix的過濾有多階段過濾和單階段過濾兩種形式。

  A、多階段過濾

  當選項smtpd_delay_reject設置為yes時,過濾是分為多個階段進行的。比如,即便在上一個子階段該連接被判定為需要被拒絕,但是由於拒絕被延遲了,所以會接著進行本子階段的過濾,如果在本子階段又允許了該連接,那麼上一個子階段的拒絕結果就會覆蓋。

  從結果上看,這相當於無論上一個子階段的過濾結果如何,都會進行所有定義了的過濾規則。所以我們稱之為多階段過濾。其邏輯模型如下:

STATUS = CLIENT:{rule1 || rule2 || ...} * HELO:{rule1 || rule2 || ...} * SENDER:{rule1 || rule2 || ...} * RECIEPIENT:{rule1 || rule2 || ...} * permit


這裡的「||」表示如果一個規則有返回值(即進行了匹配,無論返回permit還是reject)那麼就不進行該子階段的其後的規則檢查。

  B、單階段過濾

  當選項smtpd_delay_reject設置為no時,相當於把這四個子階段的過濾規則都依序排列連接成一個單一的過濾規則列表。比如,如果在某個階段該連接被判定為需要被拒絕,那麼會立刻拒絕,而根本不處理其後規則和其後子階段的規則。

  從結果上看,這相當於如果某個規則發生了匹配,那麼其後的規則和子階段都被短路了,就像只有一個子階段的檢查一樣。所以我們稱之為單階段過濾。其邏輯模型如下:

STATUS = CLIENT:{rule1 || rule2 || ...} || HELO:{rule1 || rule2 || ...} || SENDER:{rule1 || rule2 || ...} || RECIEPIENT:{rule1 || rule2 || ...} || permit

這裡的「||」表示如果一個規則或子階段有返回值(即進行了匹配,無論返回permit還是reject)那麼就不進行該子階段的其後的規則和子階段檢查。


  在單階段過濾中,由於smtpd_recipient_restrictions可以接受所有的數據前過濾的規則,所以通常會把所有的過濾規則都放在這裡。注意在單階段過濾,所有排在前面的過濾規則被先處理,而且會形成短路。比如,如果你在smtpd_client_restrictions裡就應用了RBL服務,但是RBL裡面有一個地址是你希望接收來自那裡的郵件的,那麼根本沒有機會來檢查發送者地址就會被拒絕了。解決地方法就是在smtpd_sender_restrictions(或smtpd_recipient_restrictions)中先做一個check_sender_access,然後再做RBL檢查。

 

  二、數據後過濾

  有時候僅僅通過在郵件數據發送前的信息還不足以判斷一封郵件是否是垃圾郵件。那麼更進一步可以通過郵件數據中包含的信息來判斷是否是垃圾郵件而決定如何處理。雖然在SMTP會話已經完成了數據接收後進行過濾並不能節省下被浪費的帶寬和處理能力,但是這樣減少了垃圾郵件佔用的空間、用戶判斷刪除垃圾郵件而浪費的精力,而且對於一些現在流行的通過郵件傳遞的蠕蟲病毒也減少了用戶誤中並繼續擴散的可能性。

  數據後過濾一般分為信頭過濾和信體過濾兩種。

  1、信頭過濾

  簡單地說,在SMTP會話中,DATA指令發送的數據以一個空行分隔開,前面的部分稱為信頭,後面的稱為信體。通常在郵件中,包括三種類型的信頭:

  • 郵件主信頭

  • MIME頭(包括主信頭中的和多部分分隔串之後的)
  • 郵件中附帶的郵件的信頭

  信頭過濾可以通過以下配置來配置:

  • head_checks = maptype:mapname
    它匹配所有的三種信頭。
  • mime_head_checks = maptype:mapname
    它僅僅匹配MIME頭。
  • nested_head_checks = maptype:mapname
    它僅僅匹配郵件中附帶的郵件的信頭。

  信頭過濾模板有兩種類型:ISO標準正則表達式regexp和Perl兼容正則表達式pcre,這兩者在語法上有一定的差異,使用任何一種都可以。過濾模板中的過濾規則格式如下:

/模式表達式/ 動作

  模式表達式是用regexp或pcre寫的用來匹配郵件頭的表達式。

  動作有如下幾種(和訪問數據庫中所支持的動作不完全一致,比如不支持[45]NN、數字、DUNNO和規則等):

  • REJECT [text]
    拒絕該郵件,可選的消息被發給發信人並記錄到maillog中。
  • OK
    對於這個信頭行不再進行其他的匹配規則處理,繼續處理下一行信頭。
  • IGNORE
    從信頭中刪除該信頭行。常被用來刪除一些特定的信頭行,如Received。
  • WARNING [text]
    將該信頭行和可選的消息記錄到maillog中。常用來測試過濾規則。
  • HOLD [text]
    將該郵件放入hold隊列中,並記錄該信頭行和可選的消息到maillog中。放入hold隊列的郵件可以通過postcat命令來查看,或通過postsuper來刪除或遞交。
  • DISCARD [text]
    成功接收郵件後並不遞交,而是悄悄地將該郵件丟棄,並記錄該信頭行和可選的消息到maillog中。
  • FILTER transport:nexthop
    將該郵件發到一個郵件過濾器中進行處理。

  另外注意,信頭過濾在對Subject處理時,中文(8位編碼)會被編碼為MIME編碼或UUENCODE編碼,請做相應轉換處理。

  2、信體過濾


  信體是除了主信頭之外的郵件內容(包括MIME頭,不過將多行的MIME頭作為多個單行處理)。信體過濾通常不檢查全部的信體,只檢查body_checks_max_size所指定的大小(以字節為單位,默認是50K)。信體過濾是針對行來處理的,對於超長的行,只檢查line_length_limi所指定的長度(默認2048字節)。

  信體過濾可以通過以下配置來配置:

  • body_checks = maptype:mapname

  信體過濾模板同信頭過濾模板一樣。

 

  三、附錄

  1、訪問數據庫

  訪問數據庫是Postfix用來判斷拒絕或接受郵件的數據庫。通過訪問數據庫可以拒絕或接收特定的主機名、域名、網絡地址和郵件地址。

  通常訪問數據庫是一個由postmap命令從一個文本文件輸入生成的db或dbm格式的HASH文件。也有NIS,LDAP,SQL和正則表達式方式的其它數據庫,它們和HASH文件以相同的方式工作,但是不需要用postmap來生成。

  數據庫的格式如下:


模式表達式 動作

  當匹配了模式表達式時,就觸發了相應的動作。

  數據庫中的空行和以「#」開頭的行被忽略掉。以空格開始的行是上一行的續行。

  A、郵件地址

  非正則表達式用來表示郵件地址時有如下格式:

  • user@domain.tld
    匹配特定的郵件地址
  • domain.tld
    匹配特定郵件的域。如果在parent_domain_matches_subdomains指定了smtpd_access_maps(默認),那麼也會匹配該域的子域;否則就需要使用.doamin.tld格式(注意前面的點)來單獨匹配子域。
  • user@
    匹配所有本地部分(郵件用戶名)是user的郵件地址
  • <>
    匹配無郵件地址。這個值是通過smtpd_null_access_lookup_key來指定的。

  B、主機名和地址

  非正則表達式用來表示主機名和地址時有如下格式:


  • domain.tld
    匹配特定郵件的域。如果在parent_domain_matches_subdomains指定了smtpd_access_maps(默認),那麼也會匹配該域的子域;否則就需要使用.doamin.tld格式(注意前面的點)來單獨匹配子域。
  • net.work.addr.ess
    net.work.addr
    net.work
    net
    匹配網絡地址。注意CIDR(無類網絡地址,network/netmask格式)不被支持。

  C、動作

  訪問數據庫支持如下動作:

  • [45]NN text
    拒絕該郵件並返回數字的拒絕狀態碼和消息。
  • REJECT [text]
    拒絕該郵件並返回拒絕狀態碼和消息,如果沒有指定消息就返回通用的消息。
  • OK
    接受該郵件。
  • 數字
    同OK一樣,接受該郵件。
  • DUNNO
    跳過該規則,繼續處理下面的規則。

  • HOLD [text]
    將該郵件放入hold隊列中,並記錄可選的消息或通用的消息到maillog中。放入hold隊列的郵件可以通過postcat命令來查看,或通過postsuper來刪除或遞交。
  • DISCARD [text]
    成功接收郵件後並不遞交,而是悄悄地將該郵件丟棄,並記錄可選的消息或通用的消息到maillog中。
  • FILTER transport:nexthop
    將該郵件發到一個郵件過濾器中進行處理。
  • UCE規則
    應用UCE規則,如permit、reject_unauth_destination和smtpd_restriction_classes定義的規則類。

 

  2、SMTP認證(SASL認證)

  如上所述,漫遊用戶需要通過SMTP認證方式來使用發信服務。Postfix默認是不支持SASL協議,即不支持SMTP認證,需要通過額外指定SASL庫的位置並打開SASL認證功能才能支持SMTP認證。以下以Postfix-2.0.13和Cyrus-Sasl-2.1.1為例簡單說明如何使用SMTP認證。


  1. 首先下載Postfix-2.0.13和Cyrus-Sasl-2.1.1,並安裝cyrus-sasl-2.1.1。默認cyrus-sasl安裝到了/usr/local下,它的庫在/usr/local/lib下,它的頭文件在/usr/local/include/sasl下。
  2. 然後解開Postfix-2.0.13的源代碼包,並使用如下命令編譯:
    % make tidy
    % make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl"\
    AUXLIBS="-L/usr/local/lib -lsasl2"
    如果需要你還可以加上其他的編譯選項,如對MySQL的支持等。
  3. 編譯完成後安裝,然後修改/etc/postfix/main.cf,添加如下配置:
    smtpd_sasl_auth_enable = yes
    來打開SASL認證功能,然後在smtpd_recipient_restrictions中添加permit_sasl_authenticated規則:
    smtpd_recipient_restrictions = permit_sasl_authenticated
    來允許通過了SASL認證的用戶發信,你還可以在這裡增加其它需要的規則。
  4. 修改/usr/local/lib/sasl2/smtpd.conf(如沒有請創建),設定你需要的認證方式,如auxprop、pwcheck、saslauthd等,這依賴於你的具體需求。

  5. 在配置好Postfix後,重新啟動Postfix。

  然後就可以通過支持SMTP認證的郵件客戶端進行認證發信了。你也可以通過Telnet方式來測試你SMTP認證是否成功。

  有關SASL認證的更詳細的細節,請參閱Postfix源代碼包中的README_FILES目錄中的SASL_README文件。


 

原文出處:Postfix反垃圾郵件技術(2) - Posfix - 知識+
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|