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

Google 自訂搜尋

Goole 廣告

隨機相片
Yomi&Kagura_00024.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

小企鵝開談 : [轉貼] postfix 如何過濾垃圾郵件

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼] postfix 如何過濾垃圾郵件
前言:

web server 幾個月沒收郵件,結果一收發現上萬封「垃圾郵件」,看都懶得看,全刪了。

以前就覺得這樣不是辦法,會把真正有用的郵件給淹沒了,雖知道有過濾機制這種東西,但就是很懶,所以一直沒去用,今天爬文研究整天,研究出一點心得,分享出來 ^^b

postfix 其實本身就內建過濾垃圾郵件的機制,效果還不錯,若再加上第三方的軟體,幾乎可做到 95% 以上防堵過濾。

網路上亂七八糟的資料一大堆,有的是沒整理,有的根本錯誤。浪費很多時間,假如有清晰的資料,10分鐘就能搞定了。

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

小弟製作的 postfix 的 main.cf 檔,漢化版(中文化約 80%)

下載:

http://www.box.net/shared/65c245nnjd9thum9xkei


裡頭關於過濾垃圾郵件機制的部份




###################################################################
# #
# ★ 3. 垃圾郵件 過濾機制 規則 設定 #
# #
###################################################################
#
# 說明:
# 1.此過濾規則有順序性,請合理安排先後順序,以便達到最佳效能。
# 2.一旦規則命中,就不會繼續往下比對。
# 3.當每行的第一個字為空白(tab或空白鍵)的文字列皆被視為上一列的延續。
# 4.同一個項目的設定,不可斷行,隔行會被視為結束。
#
# 允許:
# permit_mynetworks ←允許來自 $mynetworks 設定值的來源。(預設值)
# permit_sasl_authenticated ←允許經 sasl 金鑰驗證過的來源。(預設值)
#
# 拒絕:
# reject_unauth_destination ←預設值,拒絕不信任的目標。(預設值)
# reject_unknown_recipient_domain ←拒絕收件人網域不存在的郵件。
# reject_unknown_sender_domain ←MAIL FROM 命令所提供的寄信人位置,
# 若查不到 A 紀錄 或 MX 紀錄 則退信。
# reject_non_fqdn_sender ←用戶端的 MAIL FROM 命令,
# 若不是RFC要求的完整名稱則退信。
# reject_unknown_client ←當 SMTP Client 連線時,
# postfix 若無法查詢該用戶端之 PTR(DSN 反解),
# 則拒絕連線。此規則不建議使用。
#
# ★ reject_rbl_client [線上的黑名單資料庫] ★
# 使用指令 dig [黑名單資料庫] 測試網站是否還存活,存活才加進去。
#
# ★ check_client_access [要檢查的轉遞允許清單] ★
# 若轉遞的限制,不是使用/etc/postfix/access的話,以下此行請註解
# 或者不要開啟 client 發信端 的過濾規則
# check_client_access hash:/etc/postfix/access
#
# ★★★ 外掛 postgrey 曙光 郵件過濾軟體 ★★★
# 具體請參考「鳥哥私房菜」 postfix 一章教學。
# 此外掛過濾軟體會導致郵件晚幾秒或幾分鐘收到,但可有效過濾單發型垃圾郵件。
# 若無安裝此 postgrey 軟體,以下此行請註解,否則 postfix 運作會出錯!
# check_policy_service unix:/var/spool/postfix/postgrey/socket
###############################################
# ★ recipient 收件人 過濾規則 #
###############################################
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
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
###############################################
# client 發信者 過濾規則 #
###############################################
#smtpd_client_restrictions =
# check_client_access hash:/etc/postfix/access
# check_client_access regexp:/etc/postfix/client_checks
# 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
###############################################
# sender 寄件者 過濾規則 #
###############################################
smtpd_sender_restrictions =
reject_non_fqdn_sender
reject_unknown_sender_domain
###############################################
# #
# ★ 進階 - 正規表示式 驗證 表頭欄位 #
# #
###############################################
#
# 默認值:不使用
#
# 說明:
# 1.使用自訂的「正規表示式」文件檔,來分析郵件的表頭、內文,並進行進階的過濾。
# 2.相關使用方法,請查閱網路上教學。
# 3.上面 smtpd_ 的相關過濾機制,已有過濾大部分的郵件表頭錯誤(垃圾郵件),
# 所以不必特地在正規表示式再過濾一遍,此項目主要用途為過濾特定的標題或夾檔。
# 分析郵件表頭
#header_checks = regexp:/etc/postfix/header_checks
# 內文
#body_checks = regexp:/etc/postfix/body_checks





註:
1→這個實際上是有 "排版" 的,但是因為論壇 code 標籤不完美的關係,所以全走樣了。貼出來僅供大略看一下內容。

2→postfix 的主要設定檔 main.cf,對於每行開頭的空白有非常嚴格的要求,所以請勿直接 copy 這段文字使用,因為那很可能會出錯。

3→建議下載上面提供的那個漢化版檔案,檔案是有排版的,比較清晰和整齊。

XD



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

補充-01:

關於 postgrey 曙光 垃圾郵件抵擋軟體

首封郵件的抵擋時間,該多久比較好?
才不會對收信效能有影響之探討


此軟體的說明,具體請參考鳥哥的私房菜教學網站:

http://linux.vbird.org/linux_server/0380mail.php#adv_postgrey

postgrey 在 CentOS 安裝非常簡易,依照教學安裝一個 rpm 匯入第三方軟體庫源後,yum install 可以直接裝。

Ubuntu 怎麼裝,沒研究....


這個軟體一開始裝好,預設值的抵擋時間是 5分鐘(300秒)
而鳥哥網站的建議是 60秒

但我測試用 3 秒其實就可以了

原本一天收上百上千封垃圾郵件,用了 postfix 內建的過濾 + postgrey 的單發抵擋,銳減為不到 3封垃圾郵件


為什麼要設抵檔只有 3秒,理由說明:

E-mail 的好處就是快,如果要拖 60秒後才能收到,那拖太久了。

而且對方也不一定 60秒後就馬上重寄 <--這點很重要

從原理來說,mail server 寄出去的郵件,若無法成功寄出,就會退回佇列,每次退回,停留佇列的時間就會持續增加,直到設定值的上限。

以 postfix 的佇列停留時間為例,預設好像 400~4000 秒,就是第一次沒寄出,等 400秒,下一次又沒寄出,等 500秒,再下次600秒...這樣子以此類推,最大到每次等 4000秒上限,直到預設的5天後都寄不出去,就丟棄信件。

換句話說,如果對方第一時間無法成功寄出,立刻重試也無法寄,那再下一次輪到這封信寄出的佇列時間就會拖非常久,可能要 400 秒以上。

這就是為什麼 postgrey 曙光垃圾郵件抵擋軟體,預設抵擋時間會是 5分鐘(300秒)的原因,因為大部分的 mail sever 軟體,預設的佇列停留時間最小都要300秒以上。

但一般垃圾郵件廣發軟體,只會寄出一次(單發),就射後不理了。因為他們的 mail 名單也不一定正確的,有些甚至就沒名單,根本像亂數破解密碼那樣,從 a~z 在那 try,在亂寄的,所以他們不會去理會對方伺服器的回應,也不會去等。

因此理論上只抵擋 1秒應該也行,但考慮到有些垃圾郵件軟體,可能會連續寄兩次或三次,所以取抵擋3秒。

這就是為什麼設抵擋 3秒就ok 了,或者 1秒、2秒也行。


我用外面的 gmail 信箱實測(實驗)

若不開 postgrey 曙光垃圾郵件抵擋,gmail 寄出,我主機這邊是1秒內立刻收到。

而開了 postgrey 抵擋後,第一封確實會被擋下來,然後約10秒後才能收到。

我設只擋3秒,但卻要 10秒後才能收到,這證明對方 mail server 也不會一直持續發送,有佇列停留時間的。如果重發失敗次數愈多,這個佇列停留時間就會增長愈長。所以抵擋時間不宜設大。


原文出處:[心得] postfix 如何過濾垃圾郵件 [論壇 - 伺服器架設] | Ubuntu 正體中文站
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]Postfix反垃圾郵件技術
Postfix反垃圾郵件技術
 添加時間:2009-05-18 原文發表時間:2009-05-18  人氣:3
Postfix是一個非常優秀的MTA,她素以高效、安全的特點而著稱。Postfix是作者在UNIX上所見過的MTA中在反垃圾郵件(Anti-Spam或Anti-UCE)方面做得最好的一個,甚至有很多公司在Postfix代碼的基礎上進行二次開發而推出反垃圾郵件網關產品。

  MTA的反垃圾郵件功能,實際上就是在MTA處理過程中對會話進行過濾。這個過濾不但過濾了發往自身的垃圾郵件,而且還防止了自身被惡意利用發送垃圾郵件。Postfix實現了目前所有主要的MTA過濾技術。關於郵件過濾技術可以參閱本站的相關文章

  MTA過濾分為兩類:郵件數據發送前過濾和郵件數據發送後過濾。

 

  一、數據前過濾


  數據前過濾是指在SMTP會話中,DATA指令發送前進行的過濾。在這個階段,有四種不同子階段的過濾:SMTP連接時過濾、HELO/EHLO指令過濾、MAIL FROM指令過濾和RCPT TO指令過濾。根據這四個子階段接收到的信息的不同,它們也分別稱作SMTP客戶端限制、HELO/EHLO主機名限制、發送者地址限制和接收者地址限制。

  過濾默認是在RCPT TO指令後生效的,這是因為一些Windows上的郵件客戶端不處理在RCPT TO指令前的過濾動作。可以通過將smtpd_delay_reject設置為no來使過濾動作立刻生效。這個參數還影響了在不同的指令上可以使用的過濾規則參數。

  1、過濾規則

  這四個子階段的過濾是分別通過四個配置語句來指定過濾規則的。它們都接收一系列的規則參數列表,參數間可以用空格或逗號分隔開。在默認狀態下smtpd_delay_reject的值是yes,它們可以接受所有支持的規則,不過需在RCPT TO指令後才能全部生效;如果把smtpd_delay_reject設置為no,它們只可以接受五個公共的規則參數、之前子階段的過濾規則參數和該子階段的規則參數。

  它們接受的公共的規則參數如下:

  • permit
    允許該連接進行。該規則通常置於規則列表的最後面使規則更清晰。

  • defer
    通知客戶端現在不能繼續會話,稍後再進行SMTP連接請求。這常用於服務器需要進行一些DNS檢查,但是(由於DNS查詢超時)沒有及時獲得結果時,通知客戶端稍後再進行連接。該規則通常置於規則列表的最後面使規則更清晰。
  • reject
    拒絕該連接請求。在這個階段就斷開了連接,有效的節約了垃圾郵件造成的帶寬和處理能力的浪費。該規則通常置於規則列表的最後面使規則更清晰。
    拒絕動作默認不會在匹配了拒絕規則後就立刻斷開連接,而是在rcpt to指令處理完之後再斷開的,這是由於一些windows上有缺陷的郵件程序不處理在rcpt to指令前的發回的拒絕狀態碼。可以通過smtpd_delay_reject設置為no來立刻發送拒絕狀態碼斷開連接。
    reject_code指定了拒絕的返回狀態碼(默認是554)。
  • warn_if_reject
    改變其後規則的拒絕動作為警告,即如果其後存在滿足拒絕的條件,並不實際拒絕,而是發出一條警告信息(reject_warning)到日誌文件中(通常是/var/log/maillog)。它常用於在實際運行的郵件服務器上測試郵件過濾規則。
  • reject_unauth_pipelining
    拒絕在Postfix支持指令流水線前發送SMTP指令流水線的客戶端連接。指令流水線是一些郵件客戶端為了快速發送郵件所採用的技術。

  以下就四個子階段分別講述過濾規則


  A、SMTP連接時過濾(SMTP客戶端限制)

  Postfix可以在接受客戶端的SMTP連接請求時進行過濾檢查。

  通過Postfix的smtpd_client_restrictions指令可以指定這個階段的過濾規則。這個階段可用的過濾規則除公共規則外還有:

  • reject_unknown_client
    拒絕客戶的地址沒有對應的DNS的A記錄或PTR記錄的連接。通常有些機器,尤其是個人撥號用戶的機器沒有對應的A記錄或PTR記錄,所以要注意漫遊用戶的使用(漫遊用戶是指不在$mynetworks中,比如在別的ISP撥號上網的用戶。通常用SMTP認證來解決這個問題)。
    unknown_client_reject_code指定了拒絕的返回狀態碼(默認是450)。
  • permit_mynetworks
    允許來自其IP地址屬於$mynetworks所定義網絡的客戶端的連接。通常可用於ISP為自己的撥號用戶提供SMTP服務時,通過$mynetworks參數指定自己的網絡並允許自己的網絡內的機器發送郵件。

  • reject_rbl_client domain.tld和reject_rhsbl_client domain.tld
    拒絕來自屬於RBL和RHSBL列表中的地址進行連接。通過檢查一個IP地址或域名是否存在於domain.tld的RBL或RHSBL中,可以判斷該客戶端是否被列入了domain.tld的實時黑名單,從而決定是否接受連接。有關實時黑名單可以參考本站的【
    反垃圾郵件技術參考>> 實時黑名單技術】。
    maps_rbl_reject_code指定了拒絕的返回狀態碼(默認是554)。
  • check_client_access maptype:mapname
    搜索名為mapname的maptype類型的訪問數據庫。可以根據客戶端的主機名、父域、IP地址或部分IP地址來匹配。關於訪問數據庫請參閱下面的

    附錄

  例子:

smtpd_client_restrictions = hash:/etc/postfix/access,
reject_rbl_client relays.ordb.org,
reject_rhsbl_client dsn.rfc-ignorant.org,
permit_mynetworks,
reject_unknown_client

  其中relays.ordb.org和dsn.rfs-ignorant.org都是國外比較權威的免費RBL和RHSBL服務器。

  B、HELO/EHLO指令過濾(HELO/EHLO主機名限制)

  在接受了SMTP連接後,可以對HELO或EHLO指令所發送的信息進行過濾檢查。

  有些郵件客戶端在通訊時並不發送HELO/EHLO指令,可以通過smtpd_helo_required設置為yes強制要求發送HELO/EHLO指令(默認Postfix不要求發送HELO/EHLO)。


  通過Postfix的smtpd_helo_restrictions指令可以指定這個階段的過濾規則。這個階段可用的過濾規則除公共規則和smtpd_client_restrictions的規則外還有:

  • reject_invalid_hostname
    拒絕無效格式的主機名的連接。
    invalid_hostname_reject_code指定了拒絕的返回狀態碼(默認是501)。
  • reject_unknown_hostname
    拒絕未知的主機名的連接。所謂未知的主機名是指該主機沒有DNS的A記錄或MX記錄。由於很多撥號用戶的機器並沒有對應的A記錄或MX記錄,所以要注意漫遊用戶的使用。
    unknown_hostname_reject_code指定了拒絕的返回狀態碼(默認是450)。
  • reject_non_fqdn_hostname
    拒絕主機名不是FQDN格式(完全限定域名格式,即用點分隔開的包括域名和主機名的主機全名)的連接。
    non_fqdn_reject_code指定了拒絕的返回狀態碼(默認時504)。
  • permit_naked_ip_address
    允許直接使用IP地址的連接。通常在HELO/EHLO中使用主機名而不是IP地址。

  • check_client_access maptype:mapname
    搜索名為mapname的maptype類型的訪問數據庫。可以根據HELO/EHLO發送的主機名、父域來匹配。關於訪問數據庫請參閱下面的
    附錄

  C、MAIL FROM指令過濾(發送者地址限制)

  在接受了SMTP連接,客戶端發送了HELO/EHLO指令後(該指令可選),應該通過MAIL FROM指令聲明發送者的身份。可以對發送者身份進行過濾檢查。

  按照RFC規範,在MAIL FROM指令和下面的RCPT TO指令中應該使用RFC 821格式的郵件地址(例如:<user@domain.tld>),但是由於有許多的郵件客戶端的不規範,往往不使用標準的RFC 821格式。Postfix默認接受任何可以理解的郵件地址,如:丟失了地址裡的一對尖括號、可以包含RFC 822格式的註釋等。如果希望打開對RFC 821格式的限制,可以將strict_rfc821_envelopes設置為yes。


  通過Postfix的smtpd_sender_restrictions指令可以指定這個階段的過濾規則。這個階段可用的過濾規則除了公共規則和smtpd_client_restrictions的規則和smtpd_helo_restrictions的規則外還有:

  • reject_unknown_sender_domain
    拒絕發送者郵件的域沒有DNS的A記錄或MX記錄的連接。
    unknown_address_reject_code指定了拒絕的返回狀態碼(默認是450)。當進行DNS查詢出現臨時錯誤時(如查詢超時)也總是返回450。
  • reject_rhsbl_sender domain.tld
    拒絕發送者郵件的域屬於RHSBL黑名單的連接。通過檢查一個域名是否存在於domain.tld的RHSBL中,可以判斷該客戶端是否被列入了domain.tld的實時黑名單,從而決定是否接受連接。
    maps_rbl_reject_code指定了拒絕的返回狀態碼(默認是554)。
  • check_sender_access maptype:mapname
    搜索名為mapname的maptype類型的訪問數據庫。可以根據發送者郵件的郵件地址、名字、域和父域來匹配。關於訪問數據庫請參閱下面的
    附錄
  • reject_non_fqdn_sender
    拒絕發送者郵件的域不是FQDN格式的連接。
    non_fqdn_reject_code指定了拒絕的返回狀態碼(默認時504)。
  • reject_sender_login_mismatch
    拒絕發送者在$smtpd_sender_owner_maps中所匹配的用戶名和SASL登錄名不一致的連接。

  D、RCPT TO指令過濾(接收者地址限制)

  在MAIL FROM指令後要通過RCPT TO指令指定郵件接收者。可以對接收者身份進行過濾檢查。

  通過Postfix的smtpd_recipient_restrictions指令可以指定這個階段的過濾規則。同以上的檢查指令不同,為了避免開放轉發,這個指令有默認值:permit_mynetworks,reject_unauth_destination。這個階段可用的過濾規則除了公共規則和smtpd_client_restrictions的規則和smtpd_helo_restrictions的規則和smtpd_sender_restrictions的規則外還有:

  • permit_auth_destination
    允許發往默認轉發和默認接收的連接。
    • Postfix默認轉發以下的郵件:
      • 來自$mynetworks中地址發送的郵件
      • 發往$relay_domains中的域或其子域的郵件。但是不能包含郵件路由(如user@elsewhere@domain.tld)。
    • Postfix默認接收最終投遞目標符合如下條件的郵件:
      • 目標在$inet_interfaces
      • 目標在$mydestinations
      • 目標在$virtual_alias_domains
      • 目標在$virtual_mailbox_domains
  • reject_unauth_destination
    拒絕不是發往默認轉發和默認接收的連接。
    relay_domain_reject_code指定了拒絕的返回狀態碼(默認是554)。
  • permit_mx_backup
    允許接收本地主機是郵件投遞目標的MX地址的郵件。但是不能包含郵件路由(如user@elsewhere@domain.tld)。

  • check_recipient_access maptype:mapname
    搜索名為mapname的maptype類型的數據庫。可以根據接收者郵件的郵件地址、名字、域和父域來匹配。 關於訪問數據庫請參閱下面的
    附錄
  • check_recipient_maps
    拒絕接收者不匹配如下列表的連接:
    • $local_recipient_maps($mydestinations和$inet_interfaces)
    • $virtual_alias_maps($virtual_alias_domains)
    • $virtual_mailbox_maps($virtual_mailbox_domains)
    • $relay_recipient_maps($relay_domains)


    空的$local_recipient_maps和$local_recipient_maps表示不對接收者地址進行過濾檢查。
    Postfix默認在接收者檢查列表的最後做check_recipient_maps檢查。

  • reject_unknown_recipient_domain
    拒絕接收者郵件的域沒有DNS的A記錄或MX記錄的連接。
    unknown_address_reject_code指定了拒絕的返回狀態碼(默認是450)。當進行DNS查詢出現臨時錯誤時(如查詢超時)也總是返回450。
  • reject_rhsbl_recipient domain.tld
    拒絕接收者郵件的域屬於RHSBL黑名單的連接。通過檢查一個域名是否存在於domain.tld的RHSBL中,可以判斷該客戶端是否被列入了domain.tld的實時黑名單,從而決定是否接受連接。
    maps_rbl_reject_code指定了拒絕的返回狀態碼(默認是554)。
  • reject_non_fqdn_recipient
    拒絕接收者郵件的域不是FQDN格式的連接。
    non_fqdn_reject_code指定了拒絕的返回狀態碼(默認時504)。

  • permit_sasl_authenticated
    允許通過了SASL認證的用戶發送郵件。通過SASL協議(包括SASL1和SASL2)實現的SMTP認證功能需要在編譯Postfix時編譯進SASL支持,並在main.cf中將smtpd_sasl_auth_enable設置為yes。有關SASL及如何在Postfix中實現SASL認證請參閱下面的
    附錄。通過SASL認證可以對漫遊用戶提供發信支持,是關閉Open-Relay的重要手段。

  以上的所有過濾規則如下表歸納:

















check_*_access

 
X
reject_unknown_*
 
X
 
reject_non_fqdn_*
 
X
 
reject_rbl_*/reject_rhsbl_*
 
X
 
permit_*
 
X

 
other
X
 



defer
X
 
 
 
 
 
reject
X
 
 
 

 
 
warn_if_reject
X
 
 
 
 
 
reject_unauth_pipelining
X
 
 
 
 
 
permit
 
X
 
 
 
 



permit_mynetworks
 

X
 
 
 
 
reject_rbl_client
 
 
X
 
 
 
reject_rhsbl_client
 
 
X
 
 
 
reject_unknown_client
 
 
 
 
X
 
check_client_access
 
 
 
 
 
X
H
E
L
O


reject_invalid_hostname
X
 
 
 
 
 
permit_naked_ip_address

 
 
 
 
 
reject_non_fqdn_hostname
 
 
 
X
 
 
reject_unknown_hostname
 
 
 

 
X
 
check_helo_access
 
 
 
 
 
X




reject_sender_login_mismatch
X
 
 
 
 
 
reject_rhsbl_sender
 
 
X
 
 
 

reject_non_fqdn_sender
 
 
 
X
 
 
reject_unknown_sender_domain
 

 
 
 
X
 
check_sender_access
 
 
 
 
 
X




reject_unauth_destination
X
 
 

 
 
 
check_recipient_maps
X
 
 
 
 
 
permit_auth_destination
 
X
 
 
 
 

permit_mx_backup
 
X
 
 
 
 
permit_sasl_authenticated
 
X
 
 
 
 
reject_rhsbl_recipient
 
 
X
 
 
 
reject_non_fqdn_recipient
 
 
 
X
 
 
reject_unknown_recipient_domain
 
 
 
 
X
 
check_recipient_access
 
 
 
 
 
X

 

原文出處:Postfix反垃圾郵件技術 - Posfix - 知識+
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]Postfix反垃圾郵件技術(2)
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 - 知識+
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]關於postfix access 的設定,無效
引言:

請教學長們

最近有一個domain name 一直發一大堆mail ,都是一些spam 或virus
我想利用 /etc/postfix/access 把這個doman name REJECT, 但是一
直不成功,以下是我的設定方式,請教一下有錯嗎 ?

# vi /etc/postfix/main.cf
mynetworks = 127.0.0.0/8, hash:/etc/postfix/access (加入了這一行)

然後在
#vi /etc/postfix/access 加入 要和不要 relay 的domain 例如

localhost.localdomain______RELAY
localhost________________RELAY
127.0.0.1________________RELAY

yahoo.com.tw____________REJECT(例如要REJECT yahoo的郵件)
msn.com ________________REJECT

然後 建立 /etc/postfix/access.db 這個資料庫
#postmap hash:/etc/postfix/access

不知道這樣做是那裡有錯誤,因為yahoo被我REJECT 了,但還是可以寄信進來也可以寄信過去, , 請問一下要禁止某一domain 的relay,這樣做是錯在那裡呢, 謝謝回覆





您是完全使用 sendmail style 的架構來看 postfix 的,這當然完全無效。
要談防 spam 或者是阻擋連線/寄信,需要先了解這些東西:
1. 連線端 ip 來源
2. smtp 溝通時使用的 sender
3. smtp 溝通時使用的 recipient
4. mail header 內容

而我個人設定像是:
smtpd_recipient_restrictions =
        reject_non_fqdn_sender
        reject_non_fqdn_recipient
        reject_unknown_sender_domain
        reject_unknown_recipient_domain
        reject_unlisted_sender
        permit_mynetworks
        permit_sasl_authenticated
        reject_rbl_client dnsbl.sorbs.net
        reject_rbl_client bl.spamcop.net
        reject_rbl_client relays.ordb.org
        reject_rbl_client xbl.spamhaus.org
        check_recipient_access regexp:/etc/postfix/rcpt_checks
        check_client_access regexp:/etc/postfix/client_checks
        check_helo_access regexp:/etc/postfix/helo_checks
        check_sender_access regexp:/etc/postfix/sender_checks
        reject_unauth_destination

其中像是 client_checks 檔案:
/192\.168\.2\.1/             REJECT


請先閱讀:
http://www.postfix.org/SMTPD_ACCESS_README.html
http://www.postfix.org/postconf.5.html




感謝 kenduest , 這邊文章實在是惠我良多,我看了很多遍。
瞭解其順序還有每個環節的重要

不知是否可以分享一下 裡面幾個 checks 檔的用法
        check_recipient_access regexp:/etc/postfix/rcpt_checks
        check_client_access regexp:/etc/postfix/client_checks
        check_helo_access regexp:/etc/postfix/helo_checks
        check_sender_access regexp:/etc/postfix/sender_checks

我分享一下我找到一個不錯的 helo_checks, 作者是 Ralf Hildebrandt (http://www.postfix-book.com/)
他把用本機或是自己的 domain name 及數字的 helo/ehlo 檔掉了 效果真的不錯
/^localhost$/ 550 Don't use my own domain (localhost)
/^charite\.de$/ 550 Don't use my own domain
/^160\.45\.207\.131$/ 550 Don't use my own IP address
/^mail\.charite\.de$/ 550 Don't use my own hostname
/^141\.42\./ 550 Don't use an IP address from my network
/^\[160\.45\.207\.131\]$/ 550 Don't use my own IP address in brackets
/^\[141\.42\./ 550 Don't use an IP address from my network
/^[0-9.]+$/ 550 Your software is not RFC 2821 compliant: EHLO/HELO must be a domain or an address-literal (IP enclosed in []) - not a naked IP.




原文出處:關於postfix access 的設定,無效
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]Postfix 進階篇
有鑑於 study-area 詢問數篇有關 eMail 問題?
但答案往往石沉大海!經過反覆測試才發表心得?提供
給新手一個參考:-)

本篇不在於告知 postfix 如何安裝,如需要請參考!
鳥哥網站!
http://linux.vbird.org/linux_server/0390postfix.php
主要針對 postfix 擋信參數用法及心得在此講解一下:

_1. /etc/postfix/main.cf 中比較注意是
~當每行的第一個字為空白(tab或空白鍵)的文字列皆被視為上一列的延續。
方便解讀分析!

_2.根據 postfix 官方文件的資訊,所有的規則寫在前面的如果符合就先被執行,
因此順序變的重要!

_3.而 Postfix 用戶端判別規則檢查順序如下:
1 → smtpd_client_restrictions
2 → smtpd_helo_restrictions
3 → smtpd_sender_restrictions
4 → smtpd_recipient_restrictions
5 → smtpd_data_restrictions
6 → header_checks
7 → body_checks

_4.我僅列表我的防範垃圾信規則如下︰
# -=------------------------------------------------------=-
# _1_Server: 220 smtp.example.com ESMTO Postfix
# check client use ip/domain
#
smtpd_client_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_rbl_client relays.ordb.org,
reject_rbl_client dsn.rfs-ignorant.org,
reject_rbl_client spam.ecenter.idv.tw,
check_client_access regexp:/etc/postfix/client_checks

# _2_Client: MAIL FROM:<info@ora.com>
# check Mail From
#
smtpd_sender_restrictions = permit_mynetworks,
check_sender_access regexp:/etc/postfix/sender_access,
reject_unknown_client,
reject_non_fqdn_sender,
reject_unknown_sender_domain

# _3_Clinet: RCPT TO:<kdent@example.com>
# check local network Relay
#
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination

# _4_Client: Data (這段定義是要配合 spamassassin 用,若無!可以省略)
#
smtpd_data_restrictions = check_client_access cidr:/etc/postfix/header-local,
permit_mynetworks,
check_client_access cidr:/etc/postfix/header-auth,
permit_sasl_authenticated,
check_client_access cidr:/etc/postfix/header-remote
#
# -=------------------------------------------------------=-

上面參數意義我想大部份的人都瞭解,只幫各位複習一下!
permit_sasl_authenticated → 允許SASL寄送
permit_mynetworks → 允許本地網路寄送
reject_unauth_destination → 不允許非認證來來源寄送

reject_rbl_client relay.ordb.org → 不允許RBL資料庫中之用戶端寄送
reject_non_fqdn_sender → 用戶端的MAIL FROM命令若不是RFC要求的完整名稱則退信。
reject_unknown_client → 當SMTP Client連線時,postfix若無法查詢該用戶端之PTR紀錄,則拒絕連線。
reject_unknown_sender_domain → mail from 命令所提供的寄信人位置若查不到A 紀錄或MX紀錄則退信。

~其實重點不是講這些參數意義,而是自定義檔案用法,如下︰
__check_client_access regexp:/etc/postfix/client_checks
...
/.*\.dynamic\..*\.tw/ 554 Service unavailable
/.*\.dynamic\.hinet\.net/ 554 Service unavailable

Maillog 若有阻擋成功訊息如下:
Oct 2 09:04:12 tej9806 postfix/smtpd[20256]: connect from 61-225-206-44.dynamic
.hinet.net[61.225.206.44]

Oct 2 09:04:12 tej9806 postfix/smtpd[20256]: NOQUEUE: reject: CONNECT from 61-2
25-206-44.dynamic.hinet.net[61.225.206.44]: 554 <61-225-206-44.dynamic.hinet.net
^^^^
[61.225.206.44]>: Client host rejected: Service unavailable; proto=SMTP
^^^^^^^^^^^^^^^^^^^^
Oct 2 09:04:12 tej9806 postfix/smtpd[20256]: disconnect from 61-225-206-44.dyna
mic.hinet.net[61.225.206.44]

__check_sender_access regexp:/etc/postfix/sender_access
...
/.*firstbank\.com\.tw/ OK
/61\.219\.52\.9/ OK

/ms[1-9]\.epaper\.com\.tw/ DISCARD
/ms[a-z]\.epaper\.com\.tw/ DISCARD

/ecfs[1-9]\.epaper\.com\.tw/ DISCARD
/ecfs10\.epaper\.com\.tw/ DISCARD
/ecfsrv\.epaper\.com\.tw/ DISCARD

Maillog 若有阻擋成功訊息如下:
Sep 27 14:24:57 tej9806 postfix/smtpd[20168]: connect from msr.epaper.com.tw[211
.20.188.103]

Sep 27 14:24:58 tej9806 postfix/smtpd[20168]: NOQUEUE: discard: MAIL from msr.epaper.com.tw
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[211.20.188.103]: <edm@msx.epaper.com.tw>: Sender address triggers DISCARD action
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; from=<edm@msx.epaper.com.tw> proto=ESMTP helo=<msr.epaper.com.tw>
Sep 27 14:24:58 tej9806 postfix/smtpd[20168]: 52FFC14145: client=msr.epaper.com.
tw[211.20.188.103]
Sep 27 14:24:59 tej9806 postfix/smtpd[20168]: disconnect from msr.epaper.com.tw[
211.20.188.103]

有無看出這兩個檔都用 regexp(正規表示法)作法,但所帶參數不一樣,
並非網路上所討論一樣!我的規則是所有用動態 IP 所架 MailServ 一律
阻擋,但來至於公司使用者不限是否為動態 IP。至於已確定誤判 Mail
Server 可試先定義在 sender_access 檔案內其允許值為 OK!

而正規表示法意義可參考鳥哥網站︰
http://linux.vbird.org/linux_basic/0330regularex.php

附 註︰
eMail 表頭垃圾信分析

~ 垃圾信範例︰~

_1、由 MTA 所產生 /var/log/maillog 內容
[root@tej9806 postfix]# cat /var/log/maillog |grep '9E41D14148'
Sep 27 02:25:30 tej9806 postfix/smtpd[1958]: 9E41D14148: client=comserver.nnrha.
org[209.96.171.130]

Sep 27 02:25:31 tej9806 postfix/cleanup[2547]: 9E41D14148: hold: header Received
: from gabriel.INTERNAL.NNRHA.ORG (comserver.nnrha.org [209.96.171.130])??by tej
┌^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
├→ 發送者正確 IP 位址
9806.tej.com.tw (Postfix) with ESMTP id 9E41D14148??for <xfs@tej.com.tw>; Wed, 2
^^^^^^^^^^^^^^^^^^^→由 SMTP Client
以【RCPT TO︰】 命令所指定的【信封地址】(即收件者),而該 User 有存在 aliases 檔內!
7 Sep 2006 02:25:30 +0800 (CST) from comserver.nnrha.org[209.96.171.130]; from=<
wkobcajod@bc1dftqw0iss.com> to=<xfs@tej.com.tw> proto=ESMTP helo=<gabriel.INTERNAL.NNRHA.ORG>
┌^^^^^^^^^^^^^^^^^^^^^^^^
├→ 來自於寄件者 【MAIL FROM︰】

_2、透過 Open WebMail 查看收到 Header
From wkobcajod@bc1dftqw0iss.com Wed Sep 27 02:25:39 2006
┌^^^^^^^^^^^^^^^^^^^^^^^^
├→ 這裡沒有冒號!來自於寄件者 【MAIL FROM︰】也可以造假!
Return-Path: <wkobcajod@bc1dftqw0iss.com>
X-Original-To: xfs@tej.com.tw
Delivered-To: root@tej.com.tw
X-TejNet-Auth-LOCAL: LOCAL
X-TejNet-Auth-SASL: SASL
X-TejNet-Auth-NONE: NONE
Received: from gabriel.INTERNAL.NNRHA.ORG (comserver.nnrha.org [209.96.171.130])
┌^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
├→ 發送者正確 IP 位址
by tej9806.tej.com.tw (Postfix) with ESMTP id 9E41D14148
for <xfs@tej.com.tw>; Wed, 27 Sep 2006 02:25:30 +0800 (CST)
^^^^^^^^^^^^^^^^^^^→由 SMTP Client 以【RCPT TO︰】 命令所指定的
【信封地址】(即收件者),而該 User 有存在 aliases 檔內!

Received: from bc1dftqw0iss.com ([218.35.90.113] RDNS failed) by gabriel.INTERNAL.NNRHA.ORG with Microsoft SMTPSVC(6.0.3790.1830);
Tue, 26 Sep 2006 14:25:13 -0400

~【DATA】~
From: MP4總站 <wkobcajod@bc1dftqw0iss.com> ←─ 寄件者可以造假!
Subject: 最新網友搶手貨--MP4經典果凍機下殺NT$2590
To: desert_lj@yahoo.com.tw ←─ 收件者可以造假!
Content-Type: text/html;
charset="big5";
charset="big5";
charset="big5";
charset="big5";
charset="big5"
Content-Transfer-Encoding: 8bit
Date: Wed, 27 Sep 2006 02:26:00 +0800
Message-ID: <GABRIELXsprw0m25q8a000091f2@gabriel.INTERNAL.NNRHA.ORG>
X-OriginalArrivalTime: 26 Sep 2006 18:25:15.0088 (UTC) FILETIME=[1C7DA500:01C6E199]
...

這是參考 OREILLY 書所參考研究出的,想給解讀 maillog 的人
一點方向!希望此篇能對大家有所幫助,也不吝諸位先進給與弟指教!


原文出處:鳥哥的 Linux 私房菜-新手討論區 • 檢視主題 - [分享] Postfix 進階篇
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]Postfix 進階篇
原先立意是希望不擋浮動 ip user 能順利寄信,但上述設定
確擋住所有 dynamic 使用者!

由於已變動數次設定,乾脆全部重貼全文!對已看過 User 說聲
抱歉!因功力不足所以才會不斷修正,謝謝:-)

本篇不在於告知 postfix 如何安裝,如需要請參考!
鳥哥網站!
http://linux.vbird.org/linux_server/0390postfix.php
主要針對 postfix 擋信參數用法及心得在此講解一下:

_1. /etc/postfix/main.cf 中比較注意是
~當每行的第一個字為空白(tab或空白鍵)的文字列皆被視為上一列的延續。
方便解讀分析!

_2.根據 postfix 官方文件的資訊,所有的規則寫在前面的如果符合就先被執行,
因此順序變的重要!

_3.而 Postfix 用戶端判別規則檢查順序如下:
1 → smtpd_client_restrictions
2 → smtpd_helo_restrictions
3 → smtpd_sender_restrictions
4 → smtpd_recipient_restrictions
5 → smtpd_data_restrictions
6 → header_checks
7 → body_checks

_4.我僅列表我的防範垃圾信規則如下︰
# -=------------------------------------------------------=-
# _1_Server: 220 smtp.example.com ESMTO Postfix
# check client use ip/domain
#
smtpd_client_restrictions = permit_mynetworks,
permit_sasl_authenticated,
check_client_access regexp:/etc/postfix/client_checks, <-- 直接拒收不歡迎 smtp server,是用 554 方式拒收!,另誤判為 ODRB IP 直接以 OK 設此!
reject_rbl_client cbl.abuseat.org,
reject_rbl_client bl.spamcop.net

---------------------------------------------
reject_rbl_client dul.dnsbl.sorbs.net <-- 加上這段可擋大部分 Dynamic IP
reject_rbl_client cbl.anti-spam.org.cn <-- 擋來自大陸的垃圾信
---------------------------------------------

# _2_Client: MAIL FROM:<info@ora.com>
# check Mail From
#
smtpd_sender_restrictions = permit_mynetworks,
permit_sasl_authenticated, <-- 避免來自未設反解 IP 而拒決轉寄!
check_sender_access regexp:/etc/postfix/sender_access, <-- 開放未定義反解 smtp server 是用正規表示法設定,以 OK 放行接受來源端信件!
reject_unknown_client, ┐
reject_non_fqdn_sender, ┼─→ DNS 檢查段!規則符合就先放行,後面就不檢查!
reject_unknown_sender_domain ┘

# _3_Clinet: RCPT TO:<kdent@example.com>
# check local network Relay
#
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
check_recipient_access regexp:/etc/postfix/no_fqnlist, <-- 設定部份帳號具有多重網域身份,其餘拒絕!
check_client_access regexp:/etc/postfix/client_access, <-- 拒收所有 Dynamic dns name!
reject_unauth_destination

# _4_Client: Data (這段定義是要配合 spamassassin 用,若無!可以省略)
#
smtpd_data_restrictions = check_client_access cidr:/etc/postfix/header-local,
permit_mynetworks,
check_client_access cidr:/etc/postfix/header-auth,
permit_sasl_authenticated,
check_client_access cidr:/etc/postfix/header-remote

#
# -=------------------------------------------------------=-

上面參數意義我想大部份的人都瞭解,只幫各位複習一下!
permit_sasl_authenticated → 允許SASL寄送
permit_mynetworks → 允許本地網路寄送
reject_unauth_destination → 不允許非認證來來源寄送

reject_rbl_client relay.ordb.org → 不允許RBL資料庫中之用戶端寄送
reject_non_fqdn_sender → 用戶端的MAIL FROM命令若不是RFC要求的完整名稱則退信。
reject_unknown_client → 當SMTP Client連線時,postfix若無法查詢該用戶端之PTR紀錄,則拒絕連線。
reject_unknown_sender_domain → mail from 命令所提供的寄信人位置若查不到A 紀錄或MX紀錄則退信。

~其實重點不是講這些參數意義,而是自定義檔案用法;凡是有做過【修改】必須
重新【載入設定檔,設定值才會生效!]啟動 MTA 系統!
Exp︰
# /etc/rc.d/init.d/MailScanner restart
# /etc/rc.d/init.d/postfix reload


~注意!
檢查規則順序是按照訂的先後作判斷;若已有條件符合者後面就不檢查了!
__check_client_access regexp:/etc/postfix/client_checks
...
/ecfs[1-9]\.epaper\.com\.tw/ 554 Service unavailable
/ecfs1[0-9]\.epaper\.com\.tw/ 554 Service unavailable

# -=---------------------------------------------=-
# For Japen Mike_Huang
/125\.175\.32\.168/ OK ←─ 放行誤判為 ORDB IP!


~Maillog 若有阻擋成功訊息如下:
Oct 2 09:04:12 tej9806 postfix/smtpd[20256]: connect from 61-225-206-44.dynamic
.hinet.net[61.225.206.44]

Oct 2 09:04:12 tej9806 postfix/smtpd[20256]: NOQUEUE: reject: CONNECT from 61-2
25-206-44.dynamic.hinet.net[61.225.206.44]: 554 <61-225-206-44.dynamic.hinet.net
^^^^
[61.225.206.44]>: Client host rejected: Service unavailable; proto=SMTP
^^^^^^^^^^^^^^^^^^^^
Oct 2 09:04:12 tej9806 postfix/smtpd[20256]: disconnect from 61-225-206-44.dyna
mic.hinet.net[61.225.206.44]

__check_sender_access regexp:/etc/postfix/sender_access
...
/.*firstbank\.com\.tw/ OK
/61\.219\.52\.9/ OK

/ms[1-9]\.epaper\.com\.tw/ DISCARD
/ms[a-z]\.epaper\.com\.tw/ DISCARD

/ecfs[1-9]\.epaper\.com\.tw/ DISCARD
/ecfs10\.epaper\.com\.tw/ DISCARD
/ecfsrv\.epaper\.com\.tw/ DISCARD

~Maillog 若有阻擋成功訊息如下:
Sep 27 14:24:57 tej9806 postfix/smtpd[20168]: connect from msr.epaper.com.tw[211
.20.188.103]

Sep 27 14:24:58 tej9806 postfix/smtpd[20168]: NOQUEUE: discard: MAIL from msr.epaper.com.tw
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[211.20.188.103]: <edm@msx.epaper.com.tw>: Sender address triggers DISCARD action
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; from=<edm@msx.epaper.com.tw> proto=ESMTP helo=<msr.epaper.com.tw>
Sep 27 14:24:58 tej9806 postfix/smtpd[20168]: 52FFC14145: client=msr.epaper.com.
tw[211.20.188.103]
Sep 27 14:24:59 tej9806 postfix/smtpd[20168]: disconnect from msr.epaper.com.tw[
211.20.188.103]

__check_client_access regexp:/etc/postfix/client_checks
...
# -=---------------------------------------------=-
/.*dynamic\..*/ DISCARD

~Maillog 若有阻擋成功訊息如下:
Oct 14 13:40:45 tej9806 postfix/smtpd[21152]: connect from 141.168.179.60
.broad.nb.zj.dynamic.cndata.com[60.179.168.141]

Oct 14 13:40:55 tej9806 postfix/smtpd[21152]: NOQUEUE: discard: RCPT from
^^^^^^^^^
141.168.179.60.broad.nb.zj.dynamic.cndata.com[60.179.168.141]: <141.168.179.60.
broad.nb.zj.dynamic.cndata.com[60.179.168.141]>: Client host triggers DISCARD action;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
from=<zeMnt1o3g2qkygWW0AQOzkkIcIhR@ms53.hinet.net> to=<patty@tej.com.tw> p
roto=SMTP helo=<141.168.179.60.broad.nb.zj.dynamic.cndata.com>

Oct 14 13:40:55 tej9806 postfix/smtpd[21152]: DBB0D14149: client=141.168.
179.60.broad.nb.zj.dynamic.cndata.com[60.179.168.141]

Oct 14 13:41:00 tej9806 postfix/smtpd[21152]: disconnect from 141.168.179
.60.broad.nb.zj.dynamic.cndata.com[60.179.168.141]

__check_recipient_access regexp:/etc/postfix/no_fqnlist
# -=---------------------------------------------=-
/service@richmall\.com\.tw/ OK
/rise@richmall\.com\.tw/ OK
/.*richmall\.com\.tw/ DISCARD

~Maillog 若有阻擋成功訊息如下:
Dec 21 15:22:07 tej9806 postfix/smtpd[29202]: NOQUEUE: discard: RCPT from
amos.component.com.tw[59.124.227.230]: <paul@richmall.com.tw>: Recipient
address triggers DISCARD action; from=<kuang@amos.component.com.tw>
to=<paul@richmall.com.tw> proto=ESMTP helo=<amos.component.com.tw>

有無看出這兩個檔都用 regexp(正規表示法)作法,但所帶參數不一樣,
並非網路上所討論一樣!我的規則是所有用動態 IP 所架 MailServ 一律
阻擋,但來至於公司使用者不限是否為動態 IP。至於已確定誤判 Mail
Server 可試先定義在 sender_access 檔案內其允許值為 OK!

__總結:

/etc/postfix/client_checks 內容定義要拒收已知發信者 ip ,如 pchome 廣告信!

/etc/postfix/sender_access 俗稱白名單避免一些正常信未設反解而遭到誤判為
垃圾信,如第一銀行; 新聞局(ncc.tw)

/etc/postfix/client_access 任何 IP 來自屬於自家 User 可寄信!其餘來自任何 IP
其反解 ptr name 帶有 dynamic, dhcp 所發信主機或
client 端皆拒收!

/etc/postfix/no_fqnlist 定義在多重網域下,只允許部份帳號具有多重身份,
其餘則只能具有單一 Domain!

__而正規表示法意義可參考鳥哥網站︰
http://linux.vbird.org/linux_basic/0330regularex.php

參考上奇那本 POSTFIX後 實做
我的main.cf
smtpd_recipient_restrictions =
....
reject_rbl_client dul.dnsbl.sorbs.net <--加上這段可擋大部分 Dynamic IP
reject_rbl_client cbl.anti-spam.org.cn <----擋來自大陸的垃圾信

另外書上有提到若是想讓特定被listed為spam的ip 也接受 在之後可以設置
check_sender_access = hash:/etc/postfix/rhsbl_sender_exceptions

就是你提到的白名單 可是我就是實做上有點問題 不知是否格式問題
又請問你所提的白名單是在DNS check之前 還是之後
以下為log
-----------------------
1.擋Dynamic IP
Nov 24 04:41:59 ns1 postfix/smtpd[1415]: NOQUEUE: reject: RCPT from unknown[201.66.41.181]:
554 Service unavailable; Client host [201.66.41.181] blocked using dul.dnsbl.sorbs.net;
Dynamic IP Addresses See: http://www.sorbs.net/lookup.shtml?201.66.41.181; from=<alice@XXX.com.tw>
to=<alice@XXX.com.tw> proto=ESMTP helo=<201-66-41-181.ctame706.dsl.brasiltelecom.net.br>

2.在RCPT TO之後會收到 451 Server configuration error
Nov 24 03:57:32 ns1 postfix/smtpd[15441]: NOQUEUE: reject: RCPT from XX-XX-67-141.HINET-IP.hinet.net[XX.XX.67.141]:
451 Server configuration error; from=<spXXtw@gmail.com> to=<peter@XX.com.tw> proto=ESMTP helo=<googlemail.com>
Nov 24 03:57:32 ns1 postfix/smtpd[15441]: > XX-XX-67-141.HINET-IP.hinet.net[XX.XX.67.141]: 451 Server configuration error


謝謝 !!



原文出處:鳥哥的 Linux 私房菜-新手討論區 • 檢視主題 - [分享] Postfix 進階篇
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]用 SendMail 建立備援交換站
__用 SendMail 建立備援交換站 ( Backup MX )︰
說明︰
﹒『我們的郵件並非真的完全轉到下一個 MX 主機接收﹐而是先將郵件
暫時佇列( queue ) 在那台機器上﹐當原來的 MX 主機恢復連線之後﹐郵件會
自動的從佇列主機那邊送回來』

﹒Backup MX 以 SendMail 為基礎以 Mailscanner 搭配 clamav 和 greylist
及 ORDB 資料庫做檢查!

﹒所有的觀念及設定皆來自 Study-Area 網友所提供的,並非原創只是
加以整理及實做後重新發表。~特此說明~

__方法如下︰
在 DNS Server 上設定如下﹕
$ORIGIN my.domain.com.
@ IN MX 10 a.my.domain.com.
@ IN MX 20 b.my.domain.com.
a IN A 1.2.3.4
b IN A 1.2.3.5

接下來在 a 機器上面做如下動作﹕
echo "my.domain.com" >> /etc/mail/local-host-names
echo "a.my.domain.com" >> /etc/mail/local-host-names
service sendmail restart

再於 b 機器上面做如下動作﹕
echo "b.my.domain.com" >> /etc/mail/local-host-names
echo "my.domain.com RELAY" >> /etc/mail/access
echo "a.my.domain.com RELAY" >> /etc/mail/access
makemap hash /etc/mail/access.db < /etc/mail/access
service sendmail restart

# 注意﹕
在 b 機器上的 /etc/mail/local-host-names 檔案中不能有 my.domain.com ﹗
否則會視為 local 而不是 queue ﹐請再三確認。

__另須製作 SSH RSA Key 不用密碼可立即登入的 Server User
架設方式可參考鳥哥網站!網址如下︰
http://linux.vbird.org/linux_server/031 ... sshdconfig

~僅做重點說明︰
﹒Mail(主要) SSH Server Config 檔:
因我須保有原有 pam 認證及新的 RSA Key 免密碼登入,雙重模式!
# vi /etc/ssh/sshd_config
PermitRootLogin no
...
PasswordAuthentication yes # 改成 no,這樣子沒有私鑰就會無法登入了
...
RSAAuthentication yes # 是否使用純的 RSA 認證!?僅針對 version 1 !
PubkeyAuthentication yes # 是否允許 Public Key ?當然允許啦!僅針對 version 2
AuthorizedKeysFile .ssh/authorized_keys # 使用不需要密碼登入的帳號時,那麼那個帳號的存放檔案所在檔名!
...
#PermitEmptyPasswords no

需注意︰
_1. 產生 RSA Key 必須用 Client 端產生,本例是在 (Backup MX)
主機上用 root user 去產生 id_rsa (私鑰)及 id_rsa.pub(公鑰)
_2. 在 Mail (主要) 主機上,指定登入 user 帳號下擺入 id_rsa.pub
檔案在 [UserHome]\.ssh 目錄下產生 authorized_keys 檔案!
   cat ../id_rsa.pub >> authorized_keys
_3. 檢查 Mail (主要) 主機上,
﹒userhome 目錄下 ~./ssh 是否是 744 的權限
﹒檢查是否存在 ~/.ssh/authorized_keys
﹒並且 ~/.ssh/authorized_keys 的權限是否是 644
_4. 當 Backup MX 主機上第一次執行,請依下列步驟︰
# cd
# cd .ssh
# rm -f known_hosts
# cd ..
# ssh test@10.10.20.20 [該 ip 為 Mail (主要) 機器]
The authenticity of host '10.10.20.20 (10.10.20.20)' can't be established.
RSA key fingerprint is 07:d2:a4:93:b7:99:b2:39:2a:45:db:e1:6f:c7:d8:32.
Are you sure you want to continue connecting (yes/no)?yes

你會發現該 Key 值並非原先透過 # ssh-keygen -t rsa
所產生 Key 值一樣,不要擔心請按 yes 就完成!下次再重 run 一次就
直接登入。

重點回顧︰
Client 必須製作出 Public & Private 這兩把 keys,且 Private 需放到 ~/.ssh/ 內;
Server 必須要有 Public Key ,且放置到使用者家目錄下的 ~/.ssh/authorized_keys;

__重頭戲要上演了!雖然建立備援交換站 (Backup MX)已可正常工作,但
實際上確發生一大推已離職員工或不存在 user 被由 Mail (主要)機器
退回 mail 而 queue 住(因 mail header 已被 Backup MX 改寫),久而
久之到達 queue 上限而造成 Backup queue Mail Server 停擺!

雖然可定時擺入 crontab 以 Shell scripts 方式去 kill sendmail
queue 但並非完美方式;經參加 study-area 舉辦 1/27 日研討會,得知其他
網管其作法是將 mail 帳號產生一份清單擺在 Backup queue MX 主機上去
驗證使用者,就可以解決此問題!

~作法如下︰
﹒主要主機 postfix 是採用 PAM 機制,故寫一隻 Shell scripts !
去抓取 /etc/passwd 檔產生使用者清單,程式碼如下︰
# vi /etc/rc.d/emaills

# >>>>>>>>>> The filename "naliases" must be
# >> NOTE >> manual add eMail User aliases
# >>>>>>>>>> please add root account
#
cd /etc/rc.d
echo -e "# $(date) " > rcptlist
cat /etc/passwd |awk -F":" '$3>=500 && $3 <=60000 {printf("%s@aaa.com.tw\n",$1);}' >> rcptlist
cat /etc/postfix/naliases >> rcptlist

上述中 email 別名檔,是由手動方式去維護 naliase 檔案,必竟不多且變動不大
因只須存入不存在帳號使用者,及要收 Backup MX 主機上帳號!

# chmod 666 rcptlist ←─ 一定要變更為 rw 權限,讓由 Backup MX 主機啟動 ssh 指令
透過非 root user 去執行!

~備援交換站 ( Backup MX )︰
# vi /etc/mail/up_account
cd /etc/mail
rm -f rcptlist

ssh test@10.10.20.20 /etc/rc.d/emaills
scp -p test@10.10.20.20:/etc/rc.d/rcptlist .

if [ -f /etc/mail/rcptlist ]; then
makemap hash -er /etc/mail/rcptlist < /etc/mail/rcptlist
fi

# chmod 755 up_account

新增 crontab 排程!
由於採用 eMail 帳號清單,是否開放 relay 功能!故必須修改此檔
或者將此地帳號加入 naliases 檔案內即可。
# vi /etc/crontab
...
30 11 * * * root /etc/mail/up_account > /dev/null 2>&1
00 17 * * * root /etc/mail/up_account > /dev/null 2>&1

# /etc/rc.d/init.d/crond restart


# cat /etc/mail/rcptlist
james@abc.om
rock@abc.com

1.將下面加入sendmail.cf中.
直接手動加入 sendmail.cf
原本 sendmail.cf 中,應有一行 SLocal_check_rcpt,

修改如下即可!只需採用其中一個範例即可!
(注意中間是 Tab,幾個沒差)

2.規則為當進來的recipient email address不存在 rcptlist中,
就 reject. 規則也可以 discard.
熟 sendmail,就好應用.試試看
# vi /etc/mail/sendmail.cf

__尋找 SLocal_check_rcpt 位置(約 1251 行),將下列範例全部置換!
~例 1︰(reject)
Krcptlist hash -m -a% /etc/mail/rcptlist
SLocal_check_rcpt
R$*<$*>$*[tab]$: $2
R$*[tab]$: $(rcptlist $1 $:? $) $| $1
R?$|$*[tab]$#error $@ 5.7.1 $: "550 Relaying denied"
R$*[tab]$@ ok

~例 2︰(discard)
Krcptlist hash -m -a% /etc/mail/rcptlist
SLocal_check_rcpt
R$*<$*>$*[tab]$: $2
R$*[tab]$: $(rcptlist $1 $:? $) $| $1
R?$|$*[tab]$#discard $: discard
R$*[tab]$@ ok

附 註︰
刪除 sendmail eMail queue shell scripts 如下︰
# cat /etc/mail/killmail
su -l root -c '/etc/rc.d/init.d/MailScanner stop'
sleep 3
su -l root -c '/etc/rc.d/init.d/sendmail stop'
sleep 1
# fixed Argument list too long
cd /var/spool/mqueue
ls -C1 |xargs -i rm {}
su -l root -c '/etc/rc.d/init.d/MailScanner start'

到此完成後!就打造完美 Mail System 僅此拋磚引玉,
給有需求網友作參考!


原文出處:鳥哥的 Linux 私房菜-新手討論區 • 檢視主題 - [分享] Postfix 進階篇
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]Postfix 反垃圾擋信機制

Postfix 反垃圾擋信機制  

postfix的擋信機制

———  《postfix權威指南》學習筆記   lxq007

       不請自來的大宗郵件」(Unsolicited Bulk E-mail,UBE),或「不請自來的廣告郵件
」(Unsolicited Commercial E-mail,UCE),就是一般俗稱的「垃圾郵件」(spam),寄件人
沒有事先徵得收件人的同意,就擅自寄送大量(煩人的)郵件給一大群陌生的收件人,這樣的行為稱為
「濫發垃圾郵件」,而專門幹這種事的人,叫做「垃圾郵件發送者」(spammer)。垃圾郵件之所以存在,
是因為寄送成本便宜。郵遞量從幾百人增加到幾千人並不會增加太多成本,所以,來郵件發送者的目標
就是盡量收集多的郵件地址。

按照UBE的判別依據,postfix提供的檢查機制可分四大類:

客戶端判別規則
    Postfix提供四種檢查客戶端身份的參數,每一種參數都可設定一系列決定如何響應客戶端的限
   制條件(restriction)。如果條件成立,可能的響應動作包括OK(收下郵件)與reject(當場

   拒收)。例如,你可以設定一條檢查規則。擋掉來自特定IP 地址的郵件。相對的,如果條件不成
   立,則由後續條件繼續處理(這種結果 通常以DUNNO表示)。

語法檢查參數
    Postfix內置一系列專用檢查語法的參數, 可用來核驗客戶端的smtp對話內容是否符合標準規
    定。由於垃圾郵件發送者通常不遵守標準規定,則對於不符合規定的客戶端或郵件,你可以要求
    postfix予以拒收。有些語法檢查參數也可作為客戶端判別規則。

內容檢查
    你可以將一組描述垃圾郵件特徵的正則表達式(regular expression)寫在查詢表(稱為模式
    表)中,要求Postfix依據樣式表來檢查郵件的標題與正文內容。

自定義過濾規則
    你可將一系列內置的限制條件組織成新的過濾規則。


 設定postfix的垃圾郵件標識參數時,你還必須指定如何處理被辨認出來的垃圾郵件。一般而言,
postfix可以當場拒收,或是收下郵件但是暫存在另一個隊列,或是交給外部過濾程序去處理。


一、客戶端判別規則

   下列過濾規則可設定一系列對客戶端信息的限制條件:
 
   上述的每一項參數,分別用於檢查smtp對話過程中的特定階段。在每一個階段,客戶端分別提供不同類型
 的信息。potfix依據你給各規則設定的限制條件來檢查這些信息。


   下圖為 SMTP對話過程及各階段對應的限制條件
    (描述了上述參數與SMTP對話過程各階段的對應關係,其中 header_checksbody_checks
      參數為「內容檢查」)

 


1 smtp對話過程(簡述)

   首先,一個smtp client通過socket連接到postfix。由於是socket方式連接,所以postfix在建立連
接時就可以知道客戶端的ip地址。 smtpd client_restrictions讓你可依據客戶端的ip地址或主機名稱來
決定是接收還是拒收該信息。連接成功後,客戶端送出HELO命令來顯示自 己(送信方)的主機名稱.postfix
依據 smtpd_helo_restrictions的限制條件來檢查這個主機名稱,借此決定應該收下還是拒收郵件。

   下一步,客戶端發出mail from命令來顯示寄件人的郵件地址,接著以一個rcpt to命令來表明收件人的

郵件地址。寄件人與收件人的郵件地址的限制條件,分別設定在 smtpd_sender_restrictionssmtpd_
recipient_restrictions中。

   如果到DATA命令為止之前的一切都可以接收,客戶端就可以開始傳送郵件的內容。郵件內容分成兩部分,
前半部是標題,由 header_check過濾;後 半部是正文(body),由check_body過濾。如果最後的標題與
正文檢查也過關,postfix就收下信息,並交給適當的MDA執行投遞操作。

  註:很多垃圾郵件發送者在HELO步驟送出的是「收信方」的主機名稱,任何遵守規定的smtp client都不會
這樣做,所以你可以在 smtp_helo_restrictions設一個限制條件,禁止對方使用我們的主機名稱。


2 設定限制條件

   任何限制條件都可以用於任何過濾規則。postfix的這種設計,主要是為了讓你可以更有靈活性的安排限制條件的順序。
   

    表:

限制條件與對應的受檢信息
   限制條件                             客戶端提供的受檢信息
   reject_rbl_client                   客戶端的IP地址或主機名稱
   reject_rhsbl_client
   reject_unknown_client

   check_client_access type:mapname    HELO提供的主機名稱
   permit_naked_ip_address
   reject_invalid_hostname
   reject_non_fqdn_hostname
   reject_unknown_hostname
 
   check_helo_access type:mapname       MAIL FROM提供的寄件人郵件地址
   reject_non_fqdn_sender

   reject_rhsbl_sender
   reject_unknown_sender_domain
  
   check_sender_access type:mapname     RCPT TO提供的收件人郵件地址
   permit_auth_destination
   permit_mx_backup
   reject_non_fqdn_recipient
   reject_unauth_destination
   reject_unknown_recipient_domain
   check_recipient_access type:mapname

   reject_unauth_pipelining               DATA命令
   permit                                 無條件批准

   reject                                 無條件拒絕
   defer                                  無條件延遲
   warn_if_reject                         將原本的REJECT動作改成WARN
 
   reject_unauth_pipelining               禁止非授權客戶端使用PIPELINING命令

                                        
拒絕在Postfix支持指令流水線前發送SMTP指
                                               令流水線的客戶端連接。指令流水線是一些郵件
                                               客戶端為了快速發送郵件所採用的技術
    
   

                                                                                                            
  上邊所列的限制條件大致可分為3類。
第一類是內置條件,它們的名稱以permit_和reject_開頭,不需
要額外自變量。第二類為自定義條件,它們的名稱類似check_*_access,需要一個type:mapname自變量,
其中mapname是訪問表(access table)的名稱。在技術上, 訪問表與一般的postfix查詢表沒兩樣,同樣
都是由一系列的key-value組合而成; 在用途上,訪問表供管理員定義自己的過濾規則;索引鍵描述客戶端的
匹配條件,對應值描述如何處理符合條件的客戶端。第三類為通用條件,它們沒有額外自變量,也不檢查任何信
息,用於直接改變郵件的處理流程,或是改變其他限制條件的作用。

 
 
2.1 內置限制條件的工作流程

  
   每一種內置限制條件(reject_和permit_系列),
分別檢查不同的客戶端信息,Postfix依據
檢查結果決定如何處理郵件。處理方式包括:OK、 REJECT以及DUNNO. 當你在同一個過濾規則中列
出多個限制條件時,  postfix依照它們的排列順序來進行檢查過程。 檢查過程中,如果某條件的檢
查結果為reject,則POSTFIX會立刻拒收郵件;
如果檢查結果為OK,則略過同一過濾規則中的其餘條件,繼續檢查下一個規則;到所有 規則都檢查完畢或是出現reject結果為止。

  當過濾規則的檢查結果為reject時,postfix的默認行為並不是真的當場拒收,除非客戶端已經送出recp to命令。如果你想改變延遲reject時機的行為,讓 reject動作在第一時間發生,你可將main.cf的smtpd_delay_reject設成成no:
        smtpd_delay_reject = no


2.2 測試限制條件:

 
   當管理員修改了或增加了新的限制條件時,有些新條件的效果很難完全預測,為此,POSTFIX

提供了一個參數,讓你用來測試新限制條件
    soft_bounce =yes  #硬性拒絕碼(5xx)被改成軟性(4xx)

    在sotf_bounce模式下,硬性拒絕碼(5xx)會被改成軟性拒絕碼(4xx)。對smtp client
而言, 5xx代表服務器端徹底拒絕請求,即使下次再嘗試寄出同一封郵件,服務器端也不會接受。所
有,收到5xx響應碼的客戶端不會繼續嘗試同樣的動作。另一方面,4xx代表服務器端只是暫時拒絕請
求,客戶端下次仍有機會成功寄出郵件, 所以smtp client會保留郵件以等待下次寄送時機。 利用
sotf_bounce模式來測試新條件,即使發生誤判,只要我們能實時更正,被誤判的smtp client就
有機會寄出它的信。
   每增加一條你沒把握的新限制條件,都可以打開soft_bounce模式,然後觀察日誌文件,看看是
否發生誤判,並調整條件設計,等一切都妥當之後,再關掉sotf bounce模式。
  
  另一個有用的條件測試工具是 warn_if_reject修飾符。將這個修飾符放在限制條件之前,該條件
原本的reject動作都被改成warn。也就是 說,smtp client不會被擋在門外,但是postfix會在
日誌文件裡留下一筆警告記錄, 表示該條件發生作用了。 如果你不確定新條件在實際環境下會造成什
麼後果, 但是又不喜歡 soft_bounce 模式那種全面性的影響,你可以用warn_if_reject。來測
試新條件,等到確定新條件的效果符合預期之 後,再拿掉warn_if_reject修飾符。舉例來說:

       smtpd_recipient_restrictions =
                   permit_mynetworks

                      r eject_unauth_destination
                   warn_if_reject   reject_invalid_hostname
                   reject_unknown_recipient_domain
                   reject_non_fqdn_recipient
在此例中,如果客戶端使用helo命令送出了一個無效的主機名稱,postfix仍然會容許對方送出郵件
(如果沒被其他條件擋掉的話),但是會在日誌文件留下一筆警告記錄。


2.3
實例
smtpd_recipient_restrictions =
   permit_mynetworks
   reject_unauth_destination
   reject_invalid_hostname
  
reject_unknown_sender_domain
          當客戶端建立連接時,若它來自mynetworks或mynetworks_style定義的網絡,則
     permit_mynetworks返回OK, 整個smtpd_recipient_restrictions過濾規則也就跟
     著結束。 若客戶端來自外界網絡,permit_mynetworks返回DUNNO。
       

      若郵件的收件人不在Postfix所轄的網域(由mydestination定義),
reject_unauth_
     destination返回REJECT;否則返回DUNNO。

        
        reject_invalid_hostname,
若客戶端使用HELO命令提供的主機名稱是無效的,這項檢查
      返回REJECT;有效則為DUNNO。
         reject_unknown_sender_domain,如果客戶端在MAIL FROM提供的郵件地址的網域部分
      是無效的(即用DNS查不出來),則檢查結果會是REJECT。


3 定義限制條件

  
 依據檢查對象的不同,限制條件分為六大類型:
  
 訪問表 
      check_*_access形式的,依據訪問表所列的IP地址、主機名稱或郵件地址而決定Postfix
      應拒收還是接收。
   
 客戶端參數

      依據配置文件裡的一般信息而非訪問列表來檢查客戶端的資格。如permit_mynetwork條件
      就是檢查客戶端是否來自mynetworks或mynetworks_style定義的網絡。
    
 嚴格語法檢查
      某些限制條件要求Postfix非常嚴格地貫徹SMTP標準。

 DNS檢查
      利用DNS系統提供的信息來審核客戶端是否誠實。
        
 實時黑名單
     RBL是一種依附在DNS系統下的網絡服務,供MTA實時查詢客戶端是否來自惡名昭彰的垃圾源。
   
 通用限制條件
     無條件拒絕reject或收下permit郵件,或是改變其他條件的行為(warn_if_reject)。

 
 3.1 訪問表(access map)
 
   訪問表也是Postfix查詢表的一種,由key-value組成,訪問表的索引鍵(key)是客戶端標識
   信息(IP地址、郵件地址、主機名稱),而value是處理動作(OK或REJECT).
 
  check_client_access maptype:mapname
   
check_client_access  指向一個含有IP地址、網絡地址、主機名稱、從屬網域名稱的訪問

    表. 設定此限制條件時,Postfix先從DNS系統反查出客戶端IP地址的完整主機名稱( ptr記
    錄),並自己分析出主機本名與從屬網域,然後以這些信息與訪問表中的每一個索引鍵比對,如
    果發現相符的索引鍵,則採取對應值所指定的處理動作。

  check_helo_access maptype:mapname
    所指的訪問表含有主機名稱與從屬網域,用於比對客戶端在HELO 命令中顯示的主機名稱。如果
    發現相符的索引鍵,則Postfix執行對應值所指定的處理動作。

  check_recipient_access maptype:mapname
    指向一個含有郵件地址、網域名稱、人名的訪問表,用於比對客戶端在RCPT TO命令中提供的收
    件地址。如果發現相符的索引鍵,則Postfix執行對應值所指定的處理動作。

  check_sender_access maptype:mapname
    指向一個含有郵件地址、網域名稱、人名的訪問表,用於比對客戶端在 MAIL FROM命令中提供
    的寄件人郵件地址。如果發現相符的索引鍵,則Postfix執行對應值所指定的處理動作。
  
  索引鍵:
  
check_recipient_access 和 check_sender_access用來檢查客戶端提供的郵件地址,有
  user@example.com、example.com、user@等格式


   
check_client_access和 check_helo_access檢查的數據都是IP地址與主機名稱,如下寫法均
   可192、192.168、 192.168.132、192.168.132.221
  
  對應值:
   OK    通過當前過濾規則的檢查,
繼續檢查下一個限制條件
   REJECT
   REJECT   message-text
      另外加一段簡短信息,說明拒絕服務的理由,這段信息會連同拒絕碼一起返回給客戶端,並且
     被記錄在postfix的日誌文件裡。
access_map_reject_code定義所有check_*_access
     限制條件的默認拒絕碼;maps_rbl_reject_code參數定義reject_maps_rbl的默認拒絕
     碼;兩者均為554
   DUNNO   
     未知,繼續檢查下一個限制條件
  
FILTER transport:nexthop
     將郵件轉交給指定的內容過濾器。
   HOLD
   HOLD message-text  
     將郵件放在保留隊列
   DISCARD
   DISCARD message-text   
     要求postfix收下郵件後立刻丟棄,但是讓客戶端誤以為它已成功送出郵件。如果你加注一段
     簡短信息, 則postfix會將這段信息記錄在日誌文件裡;否則只記錄一般信息.別輕易嘗試
     discard動作,除非你已經謹慎考慮過可能的後果。暗自丟掉郵件的行為,有違郵件系統的設
     計初衷.雖然丟掉垃圾郵件是 理所當然的動作,但萬一發生誤判,勢必無法挽回已經消息的合
     法郵件,而且有損用於對於internet e-mail的信任。


   4xx message-text
     返回指定的拒絕碼與信息給客戶端,表示暫時拒收郵件。400-499範圍內的拒絕碼代表服務器

     端暫時性問題,客戶端應該先保留郵件,下次再嘗試傳送。
   5xx message-text
     返回指定的拒絕碼與信息給客戶端,表示徹底拒收郵件。500-599範圍內的拒絕碼代表服務器
     端不管怎樣都不會收下郵件,客戶端應該發出退信通知給原寄件人。

  訪問表的索引鍵也可以是「正則表達式」。一般而言,使用正則表達式來描述訪問表是一種浪費,因
為postfix已經有分析郵件地址、網域名稱、ip地址的能力,所以正則表達式帶來的好處並不多。但
如果要檢查郵件的內容(標題或正文),正則表達式就非常好用。

    範例:
     
 

    /etc/postfix/client_access文件,其內容如下:

10.157                  REJECT
192.168.132.221         REJECT
example.com             REJECT
    /etc/postfix/sender_access文件,其內容如下:
user@example.com                    REJECT
test1@                              REJECT

example-test.com                    REJECT
    #轉換查詢表
    #postmap   /etc/postfix/client_access
    #postmap  
/etc/postfix/sender_access


  3.2 客戶端條件設置
    
   permit_auth_destination 
       如果收件地址位於Postfix的轄域,則批准請求。所謂"postfix的轄區「,
包括mydesti
       nation、inet_interfaces、virtual_alias_maps或virtual_mailbox_maps及
       relay_domain所列的網域及子網域。

   permit_mynetworks
       如果客戶端的IP地址位於mynetworks參數所列的任何地址範圍內,則批准請求。
    
   reject_unauth_destination

      
如果收件地址不位於Postfix的轄域,批准請求.拒絕碼為relay_domains_reject_code參
        數提供。


  3.3嚴格語法條件


    在內置限制條件,有部分是以「客戶端在smtp對話過程提供的信息是否符合標準「為判斷依據的。
  這類條件可偵測出大量垃圾郵件,但是發生誤判的機會也很 高。你應該研究你收到的垃圾郵件與真
  實郵件之間的差異(或共同處),才會知道哪些條件可以使用(或不可使用)。如果你事先知道哪些
  寄件人可能被誤判,建議 你將他們列入白名單裡。


  reject_invalid_hostname
     客戶端在helo命令提供的主機名稱不是有效的主機名稱,返回invalid_hostname_reject
     _code參數指定的拒絕碼(默認為501)

  reject_non_fqdn_hostname
     客戶端在HELO命令提供的主機名稱不是RFC要求的完整格式(FQDN),則返回non_fqdn_
     reject_code參數指定的拒絕碼(默認504). 並非所有合法寄件人都會提供FQDN完整名稱
    (尤其是Windows)。


  reject_non_fqdn_recipient
     客戶端在RCPT TO命令提供的收件地址的網域部分,不是RFC要求的完整格式(FQDN),則返
     回non_fqdn_reject_code參數指定的拒絕碼(默認504)。

  reject_non_fqdn_sender
     客戶端在mail from命令提供的寄件人地址的網域部分,不是RFC要求的完整格式(FQDN),則
     返回non_fqdn_reject_code參數指定的拒絕碼(默認504)。


  reject_unauth_pipelining
     流水線操作(Pipelining)是一種加速處理大宗郵件的技術,其原理是容許客戶端一次送出多
     個SMTP命令. 協議要求客戶端必須先檢查服務器端是否支持pipelining,才可開始流水線操
     作,但有些MUA與MTA不遵守規定。此條件會拒絕不遵守規定的SMTP client。

    

  3 .4 DNS限制 條件
 

    DNS限制條件確定客戶端所在的網絡以及信封上的郵件地址,是否有可查驗的dns信息。如果郵件
 管理員總是能取得有效的DNS信息,Internet E-mail系統的可用度將獲得普遍提升,因為垃圾郵
 件發送者將難以遁形。不幸的, DNS系統是網管人員最常疏忽的一環,有許多合法用戶所在的網絡並
 沒有可茲查驗的dns信息,因此,完全依賴dns來過濾垃圾郵件, 反而成了不切實際的想法。你應該
 研究你所收到的垃圾郵件與真實郵件的本質,看看哪些限制條件既能夠阻擋最多的垃圾郵件,而誤判
 機率又不令人擔心。如果你事先知道哪些寄件人可能被誤判,建議你將他們列入白名單裡,以免受到
 dns限制條件的影響


   r eject_unknown_client
      當SMTP client通過socket建立連接時,POSTFIX Server可從socket連接知道客戶端
      的IP地址.先查詢客戶端IP地址的PTR記錄(改IP記錄在DNS系統登錄的主機名稱),如果查
      不出,則會拒絕服務;如果能從DNS查出主機名稱,則POSTFIX還會使用該主機名再向DNS查
      出其對應的IP地址,如查出的IP地址不符合socket連接提供的遠程IP地址,則會拒絕服務.
      此拒絕碼定義在unknown_client_reject_code參數,其默認值為450(由於當前很多的
      合法郵件均沒有PTR記錄,所以建議不使用這條規則)。
   reject_unknown_hostname

      如果HELO命令提供的主機名稱既沒有A記錄,也沒有MX記錄,則拒絕服務並返回unknown_
      hostname_reject_code參數指定的拒絕碼(450)。這條規則建議不使用,因為許多客戶
      端的HELO所提供的主機名稱不是完整形式,FOXMAIL中HELO所提供的主機名稱為客戶端系
      統的計算機名稱。
   reject_unknown_recipient_domain
      如果RCPT to命令提供收件人地址,其網域部分查不出有效的DNS A或MX記錄,則以unknown
      _address_reject_code參數定義的拒絕碼拒絕服務(450)。 
   reject_unknown_sender_domain
      如果mail from命令提供寄件人地址, 其網域部分查不出有效的DNS A 或 MX記錄,則以
      unknown_address_reject_code參數定義的拒絕碼拒絕服務(450).建議使用這條規則.


  3.5 實時黑名單

   實時黑名單(Real-Time Blacklist)是一種專為抵制垃圾郵件而設計的網絡服務。這種服務
   依賴於DNS服務,所以也成為DNSBL。Postfix提供下列三種DNSBL的限制條件:
           

    reject_rbl_client rblprovider.domain
       將客戶端IP地址( 例如 192.168.1.3 )顛倒順序(成為3.1.168.192),搭配RBL管理
       員的網
域名稱( 例如xpl.spamhaus.org ) 構成一個主機名稱( 成為
       3.1.168.192.xpl.spamhaus.org)
, 然後以此主機名稱向DNS 系統查詢,如果能查出
       一
筆A 記錄,表示該地址已被列入黑名單,則會當場拒收郵件。

    reject_rhsbl_client  rblprovider.domain
       如果客戶端的主機名在指定的rblprovdier.domain網域下有一筆A記錄,則拒絕服服務.
    reject_rhsbl_sender  rblprovider.domain

       如果寄件人的郵件地址的網域部分,在指定的
rblprovdier.domain網域下有一筆A記錄,
       則拒絕服務。


 3.6通用限制條件


   除了針對特定信息的檢查條件之外,postfix還提供了四個可用於任何過濾規則的限制條件,它
   們適合放在過濾規則的最後,作為該組規則的默認處理政策。
   permit
       批准收下郵件。postfix不再繼續當前的過濾規則,但是會跳到下一組過濾規則
   reject 
       無條件拒收。postfix不再繼續處理任何過濾規則。
   defer
       婉拒請求,客戶端被告知稍候再試。

       


二、SMTP語法規範參數
       

    smtp是相當寬鬆的協議,有些smtp client/server的對話過程甚至比協議本身要求更寬鬆.
為此,postfix提供兩個參數,讓你自己決定是否要求嚴格遵守smtp協議的對話過程與語法。第一個
參數是smtp_helo_required,它決定是否要求smtp client以helo或ehlo動作為開場白。按照
smtp rfc的規定,smtp clients連接到server後的第一句話必須是helo或ehlo。
   默認情況下,postfix對客戶端抱持寬容態度,容許客戶端不嚴格遵循smtp協議。但如果你設定
smtpd_helo_required = yes,而客戶端見面不打招呼,則postfix將拒絕服務。
    smtp rfc也明確規範了信封地址的格式,正常情況下,postfix幾乎接受任何有意義的信封地
址,但是, 如果你設定了strict_rfc821_envelopes = yes,則沒有提供正確格式地址的客戶
端將被擋在門外。
   實際上,要求對方必須提供helo/ehlo或許是個好主意,因為大部分的客戶端至少都會遵守smtp
協議的基本對話過程。但並非所有客戶端都提供符合標準格式的郵件地址,如果要求太嚴格,可能會錯
失一些合法郵件。



三、內容檢查

   直接讓postfix將垃圾郵件過濾的最後機會,是檢查郵件內容本身。

   Postfix提供了四個檢查郵件內容的參數:
      headr_checks 檢查標題

      mime_header_checks  檢查標題的MIME相關字段
      nested_header_checks檢查夾帶附件的標題
      body_checks檢查郵件的正文

   內容檢查的影響是全面性的,即該階段已經沒有機會讓特定寄件人或收件人繞過檢查。
   
  1 設定內容檢查參數

    在默認情況下,如果你沒有設定mime_header_checks和nested_header_checks參數,它
  們將與 header_checks共享同一個查詢表。如果你想將其區分開來,則必須分別提供不同的查詢
  表給它們。設定檢查參數時,必須先註明正則表達式的語法格 式(regexp代表postfix的標準正
  則表達式語法,pcre代表perl兼容的語法)以及模式表的完整路徑。例如:

header_checks = regexp:/etc/postfix/checks/header_checks

mime_header_checks = regexp:/etc/postfix/checks/mime_header_checks
body_checks = regexp:/etc/postfix/checks/body_checks
 
  模式表的索引鍵是描述比對特徵的正則表達式,此正則表達式本身必須放在一對分隔符(通常是/)
  之間,例如:
header_checks模式表如下:
/free mortgage quote/   reject  
/^Date:.* 200[0-7]/ REJECT Your email has a date from the past.
/^Date:.*19[0-9][0-9]/ REJECT  Fix your system clock and try again.
/^Date:.* 2[0-9][1-9][0-9] / REJECT Your email has a error date.
/^Date:.* 200[9] / REJECT Your email has a error date.
 

 
2 內容檢查的響應動作

     REJECT  message-text
        如果模式匹配成功,則拒絕郵件,並將message-text傳給客戶端。
     WARN message-text
        模擬拒收動作。      
     IGNORE 
        刪除符合模式的標題字段或整行文字。用來刪除某些敏感信息。
     HOLD message-text
        將郵件放在保留隊列。
     DISCARD message
        要求Postfix假裝接收郵件,但其實偷偷丟掉。能解決迂迴攻擊的問題。還有如果有無辜
        用戶的郵件地址被用來當初垃圾郵件發信者地址,可用此沒收郵件,以免無辜受害者收到
        退信通知。
     FILTER  transport:nexthop
       
將郵件轉交給指定的內容過濾器。


  3 模式匹配

   執行標題檢查時,標題裡的每一個字段都要依序與模式表裡的正則表達式匹配。如果字段內容跨越
   多行,在比對之前,它們會先被合併成一行, postfix先從模式表裡的第一個正則表達式開始比
   對 ,只要發現字段符合某正則表達式, 整個比對過程就立刻結束,並執行該正則表達式對應的動
   作。只有在所有字段都不符合所有模式的請客下,整個標題才算通過檢查。

   執行正文檢查時,body_checks指定的模式表裡的每一個正則表達式,依序與正文裡的每一文字
   行比對,每次只比對一行。如果發現符合模式的字符串,整個比對過程立刻結束,執行此模式所對
   應的動作。

   如果要比對的文字行超過長度上限,postfix會將它們拆成符合長度限制的段落,分段檢查。文字
   行的字符數上限由line_length_limit參數決定 ,其默認值為2048。如果標題的總長度超過
   header_size_limit(默認值為100k)postfix也是以同樣原則分段處理。最後,如果正文
   總長度超過body_checks_size_limit (默認值為50k),postfix不會檢查超過限制的部分.
   這項限制相當有用,因為可避免postfix去掃瞄整個文件。

   有些管理員運用header_checks來進行簡單的病毒過濾。例如,使用下列正則表達式可擋掉夾帶
   危險文件的郵件:

       /name ?="?.*\.{bat|scr|com|dll|exe|hta|pif|vbs}"?/       reject

   如果你的postfix系統要服務許多windows系統的計算機,上述模式或許能幫你的用戶群減少不
   少困擾,但同時也阻斷了「交流正常程序文件」的機會。請注意,這個模式的防毒效果有限,因為我
   們還漏掉了一些擴展名, 不足以阻擋所有windows可執行文件,況且有許多pc客戶端不用擴展名
   就可以直接運行文件。

   下面是一個典型的body_checks模式文件的內容:
   /increase your sales by/                    reject
   /in compliance (with|of) strict/            reject
   /lowest rates.*\!/                          reject
   /[:alpha:]<!--.*-->[:alpha:]/ reject suspicious embedded htm comments


   前兩個模式很簡單,不再解釋。第三個模式挑出任何含有「lowest rates」字樣且其後跟著任何
   文字(.*)以及一個感歎號(!)的字符串,例如「we have our lowest rates in 40
   years!」)。最後一個模式檢查是否有html註釋嵌在字句中間,例如「via<!--ooxx->gra「。
   垃圾郵件發送者常用這種技巧試圖通過過濾程序,但是,這也成為垃圾郵件的絕佳特徵,因為一般
   的正常郵件多半不包含html註釋,就算有,也不會刻意夾在字句中間。

   使用postmap工具可以測試寫好的正則表達式.假設msg.txt是一個垃圾郵件樣本文件,我們可用
   下列方式將它導入postmap:
       postmap -q - regexp:/etc/postfix/body_checks < msg.txt
   postfix會顯示出符合模式的字符串,以及對應該模式的動作。


   每個站點面臨的垃圾郵件源都不太一樣,你應當研究收到的垃圾郵件,根據你自己的研究結果來寫
   出適當的過濾模式.編寫正則表達式時一定要相當謹慎,如果設計不當,可能會嚴重降低服務器的效
   率。另一個潛在的問題在於沒有任何郵件可以繞過內容檢查,即使郵件已通過所有smtpd_*_res
   trictions過 濾規則的檢驗,甚至已被納入白名單,最後仍有可能被header_checks與body_
   checks擋在門外。

  在你設計判別垃圾郵件的過濾規則時,請留心用戶群之間需求與心態。有些人對垃圾郵件深惡痛絕,

甚至寧願承擔較高的誤判風險;有些人則寧可多收一些垃圾郵 件,也不願意錯失任何真實郵件。被你
擋掉的化妝品廣告郵件,有可能是某位女同事訂閱的電子報。如果無法兼顧所有人的要求,且必須分別
位不同用戶設定不同的過濾規則時, 則最好不要在mta做這件事, 應該考慮使用特殊的mda, 例如
procmail,maildrop,或任何能依用戶類別來選擇過濾規則的軟件。

  倘若你真的希望在postfix解決不同用戶的爭議,則postfix提供了分級機制,可針對不同收件人
使用不同的過濾規則。



四、自定義過濾條件組合

為了滿足不同層次的觀眾,政府設計了電影分級制度;同樣的,為了滿足不同用戶的需求,postfix
也提供了分級制度,讓你可依據用戶的身份來選擇適當的 過濾條件組合。postfix的分級機制稱為「
規範等級」(restriction class),這是非常強大的工具,讓你能更靈活運用postfix的垃圾郵
件過濾條件。如果你的用戶需要不同鬆緊程度的過濾條件組合,或是有一兩位用戶 需要與眾不同的過
濾規則,投資時間研究如何設定規範等級決定是值得的。

具體做法如下:
  1、 定義多組「規範等級」,每個等級都有自己的專屬名稱,不同的等級各由鬆緊不等的限制條件組
合而成。
  2、製作一個訪問表,索引鍵是用戶的標識信息(通常是郵件地址),對應值是該用戶適用的限制等
級的名稱。
  3、在一般的smtp_*_rrestrictions過濾規則中,加上一條檢查訪問表的條件。任何check_*
_access條件都可以用來檢查訪問表,換言之,你可以依據客戶端(check_client_access)、寄

件人(check_sender_access)或收件人(check_recipient_access)來執行分級過濾。


規範等級實例

為了舉例說明,假設我們有兩組用戶:一組是電信警察,以打擊垃圾郵件發送者為職責,研究垃圾郵件
是他們的專業;另一組人是八卦部隊,如果讓他們收到垃圾郵件,天下只會更亂而已。

很顯然,這兩組人不能共享相同的過濾規則,否則一定會出事。為了滿足這兩種極端的要求,我們擬定
了兩級規範,分別命名為「spamlover」與「spamhater」。所有規範等級的名稱都必須列在
smtpd_restriction_classes參數,像這樣:
       smptd_restriction_classes = spamlover, spamhater


接下來, 我們當初怎樣設定一般的smtpd_*_restrictions過濾規則,現在就可以怎樣定義我們的
規範等級。以下是spamhater的定義,其限制條件相當嚴格:
spamhater =
          reject_invalid_hostname
          reject_non_fqdn_hostname 
          reject_unknown_sender_domain
          reject_rbl_client    nospam.example.com
下面是spamlover的定義,只有一個簡單的permit(無條件批准)

          spamlover = permit
當然,現實環境中你應該視實際情況調整規範等級的定義,增加或減少某些限制條件。

現在,我們已經完成新規範等級的聲明與定義,下一步,我們要製作一個訪問表,讓postfix知道哪
些人適合哪些規範等級。由於我們的規範等級是針對不同用戶而設計的,所以訪問表的索引鍵是收件人
的郵件地址,而對應值是用戶適合的規範等級。假設這個訪問表的名稱是per_user_ube,它的內容看起來應該類似這樣:

#
#per_user_ube
#
a@example.com         spamhater
b@example.com         spamlover

最後,要求postfix在審核收件人限制時,檢查你指定的訪問表:
   smtp_recipient_restrictions =
       permit_mynetworks
       reject_unauth_destination
       check_recipient_access hash:/etc/postfix/per_user_ube
記得,postmap /etc/postfix/per_user_ube

一切就緒後,每當外界有人寫信給a@example.com,postfix先執行一遍正常的默認過濾規則,在
遇到check_recipient_access時,它會檢查指定的收件人訪問表,並查出a@example.com適用
的規範等級為spamhater,然後執行spamhater定義的限制條件。如果spamhater下的任何條件都

返回reject,postfix就拒收郵件;否則就將郵件交給適當的mda處理。外界寫給b@example.com
的郵件也是依照同樣的過程來處理,如果postfix所執行的規範等級為spamlover,會無條件收下任
何郵件。

反垃圾郵件實例
反垃圾郵件的main.cf配置文件樣本
smtpd_restriction_classes =
             spamlover     
             spamhater
spamhater =
             reject_invalid_hostname
             reject_non_fqdn_hostname
             reject_unknown_sender_domain
             reject_rbl_client   nospam.example.com
spamlover = permit
smtd_helo_required = yes
smtpd_client_restrictions =

          check_client_access  hash:/ect/postfix/client_access
smtpd_helo_restrictions =
       reject_invalid_hostname
       check_helo_access hash:/etc/postfix/helo_access
smtpd_sender_restrictions =
       reject_non_fqdn_sender
       reject_unknown_sender_domain
       check_sender_access hash:/etc/postfix/sender_access
smtpd_recipient_restrictions =
          permit_mynetworks
          reject_unauth_destination
          reject_non_fqdn_recipient
          reject_unknown_recipient_domain
smtpd_data_restrictions =
       reject_unauth_pipelining
header_checks = /etc/postfix/header_checks

body_checks = /etc/postfix/body_checks
 
  這個例子需要好幾個訪問表,你應該分析實際收到的垃圾郵件,收集垃圾郵件發送者的ip或郵件地
址,創建你自己的訪問表。不過,就經驗來說,check_helo_access和check_sender_access
的效果有限, 阻擋不了太多的垃圾郵件。基本上,垃圾郵件發送者有無限多的郵件地址與主機名稱可
以使用,每次你更新了訪問表之後, 他們又從別的地方冒出來,讓你疲於奔命。況且,主機名稱與發
信者地址太容易捏造了,而且他們時常假冒來自擁有大群合法用戶的大型網站,使你防不勝防。

 雖然擋不住精明的垃圾郵件發送者,但是阻擋垃圾郵件發送者的效果還挺不錯。有些傢伙不懂變化,
總是千篇一律的使用相同信息, 對付這種連幹壞事也沒有腦筋的垃圾郵件發送者,訪問表是最好的武器。
 有些在線營銷服務發送信息真實的廣告信,而且也遵守規定的提供真實的選退機制,讓你決定是否願
意繼續收到廣告信。然而,如果你不相信那些聽都沒有聽過的公司的選退機制,你可用mail from或
helo的信息來阻擋他們的廣告信,而不要冒著讓他們有機會證實你的郵件地址的風險。當然,有些站點
惡名遠揚,你完全不想再見到他們,不管他們是否誠實、提供選退機制,你都可以直接擋掉它們的垃
圾郵件。

此外,有許多垃圾郵件假冒它們來自某些小國家。如果你確定不可能會收到來自馬爾代夫共和國的合法
郵件,你可以將該國的頂層網域名稱填入訪問表,一舉阻斷所有假冒來自該地址的垃圾郵件。然而,如
果你的郵件系統服務很多用戶,你或許不應該如此武斷,將你個人的獨斷意識強加在每位用戶身上。
焉知你的用戶沒有住在馬爾代夫的親戚?或是特別喜歡到該國出差?



原文出處:
Postfix 反垃圾挡信机制 - jsl99@mig的日志 - 网易博客
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15637
[轉貼]常用的RBL服務器列表、介紹及Postfix配置

常用的RBL服務器列表、介紹及Postfix配置  

目前RBL服務器一般採用DNS查詢或DNS區域傳輸的方法.國內的RBL服務器比較少,而且數據庫比較小.國外的RBL服務器維護的數據庫比較大,但使用起來由於國際網絡原因經常有超時現象發生.企業應該根據自己收到的垃圾郵件的種類來選擇合適的RBL.下面說幾個常用的:

國內的:
國內的實時黑名單服務(RBL)做的最大的就是anti-spam. 它的官方網站是: www.anti-spam.org.cn
它提動的實時黑名單服務(RBL)主要包括四個部分:CBL、CDL和CBL+、CBL-。
CBL包含近期中國國內的主要垃圾郵件發送源。
CDL包含中國國內動態分配地址。
CBL+為CBL和CDL的合集。
CBL-是CBL+中去除了中國郵件服務運營商白名單服務(CML)的內容後的黑名單,該黑名單方便於既想使用實時黑名單,而又要保證在任何情況下都能收到來著他們的郵件的用戶。

我們可以根據自己的實際情況選擇下面的四種模式中的任意一種。
CBL: cbl.anti-spam.org.cn
CDL: cdl.anti-spam.org.cn
CBL+: cblplus.anti-spam.org.cn
CBL-: cblless.anti-spam.org.cn

我們可以使用黑名單列入查詢服務,驗證本企業是否被誤列入anti-spam的CBL:

http://www.anti-spam.org.cn/services/rblquery.php
如果被Anti-spam列入CBL,可以在此申訴:
http://www.anti-spam.org.cn/services/getout.php

注:anti-spam是免費的,但用戶只能採用DNS查詢的方法,它是不對用戶開放DNS區域傳輸的.


國外的:
ORDB-RBL-------------------------------relays.ordb.org
spamhaus-------------------------------sbl.spamhaus.org
spamcop--------------------------------bl.spamcop.net
Infinite-Monkeys-----------------------proxies.relays.monkeys.com
NJABL----------------------------------dnsbl.njabl.org
osirusoft.com--------------------------relays.osirusoft.com
MAPS-RBL-------------------------------blackholes.mail-abuse.org

MAPS-DUL-------------------------------dialups.mail-abuse.org
MAPS-RSS-------------------------------relays.mail-abuse.org
MAPS-RBL+------------------------------rbl-plus.mail-abuse.ja.net
Easynet-DNSBL--------------------------blackholes.easynet.nl
Easynet-Proxies------------------------proxies.blackholes.easynet.nl
Easynet-Dynablock----------------------dynablock.easynet.nl
OSIRUSOFT-SPEWS------------------------spews.relays.osirusoft.com


咱們說幾個比較大的:
(一)首先是spamhaus.org
最厲害,影響最大的要數Spamhaus項目組,網址 http://www.spamhaus.org 。只要被它列入黑名單,你的郵件服務器就算癱瘓了,因為據說全球80%以上的服務器會拒收從你的郵件服務器發去郵件。

它提供4種服務:PBL,XBL,SBL,ROKSO。
   (1)PBL(The Policy Block List):它主要是包含動態IP及哪些允許未經驗證即可發送郵件的SMTP服務器的IP地址段。這一個列表最明顯的特點就是提供了一個IP地址移除的自助服務,IP它列入後,可以自己申請移除。所以就算是被PBL列入,影響並不大,請要使用移除功能移除即可,方法請看:spamhaus的PBL申訴圖解
http://www.5dmail.net/bbs/viewth ... p%3Bfilter%3Ddigest
    (2)XBL(Exploits Block List)其實是它聯盟成員的,主要封堵裸IP(沒有相應域名),主要是由病毒劫持發送(如NetSky病毒),IP被禁後,沒有解禁的可能。
  (3)SBL(The Spamhaus Block List)是Spamhaus的強項,它封堵那些蓄意發送spam的IP(IP擁有者或其客戶),不管發送者是誰,背景多深,它一視同仁,因此個人覺得它比較公正。國內兩大商務網站——阿里巴巴和慧聰都不能倖免。
其它小商務網站和企業網站就更多了,大家可以登陸該組織網站查詢。這些被封堵的IP的ISP主要是中國電信和中國網通,總體而論,網通比電信嚴重。
 一旦你的IP被SBL後,切莫置之不理,試圖更換IP繼續發信是愚蠢的,Spamhaus會擴大封堵範圍,比如你原來被封的IP是 202.168.1.21,現在你換到202.168.1.87,被它發現後,可能從202.168.1.21到202.168.1.87的IP全部被封,這就會殃及池魚。你應該及時與它的工作人員溝通,承認錯誤,保證不再明知故犯。
    (4)ROKSO(The Register of Known Spam perations)那些屢教不改,明知故犯的SBL"死硬分子"和危險分子(販毒,犯槍)有可能被打入ROKSO,如果這樣,那恭喜你成為全球知名人士(網絡世界的通緝犯)。Spamhaus會要求全球的ISP終止對你的一切服務(包括域名解析,網站服務),否則,這些ISP會連坐,Spamhaus會毫不猶豫地封它幾個C段(6萬多IP),甚至B段(1600多萬IP)。想從ROKSO除名比登天還難!
 


查詢本企業是否被誤列Spamhaus的PBL並請求Remove:
http://www.spamhaus.org/pbl/index.lasso
查詢本企業是否被誤列Spamhaus的SBL並請求Remove:
http://www.spamhaus.org/sbl/index.lasso
查詢本企業是否被誤列Spamhaus的XBL並請求Remove:
http://www.spamhaus.org/xbl/index.lasso
查詢是否被列入Spamhaus的ROKSO:
http://www.spamhaus.org/rokso/


 由於中國部分ISP的漠視,中國的大量客戶都遭受池魚之災,特別是一些企業用戶,比如跟國外客戶突然失去聯繫等,但他們被蒙在鼓裡,因為ISP不願告訴他們真相.


(二)第二名Spamcop,網站 http://www.spamcop.net
。國內做郵件服務的,幾乎都會撞到它槍口上。它封堵那些不符合國際的標準的郵件服務IP地址,每次封堵數小時到數日。它會影響至少40%的郵件。你屢發,它就屢封,除非你不發。我測試過sina.com,126.com,163.com,sohu.com,它們三天兩頭在spamcop上掛號。 126.com,163.com,sohu.com比較誠實,在退信中寫明原因——被spamcop記錄了,但sina.com比較齷齪,竟然欺騙用戶,說是對方服務器的原因。總之,在一天之內,上述郵件服務器能夠正常發送的沒有幾個小時。

Spamcop要求全部郵件服務器都要雙向解析,即正向解析和反向解析。但國內絕大部分郵件服務商僅僅做正向解析,而沒有反向解析。比較離譜的又是sina.com,它把郵件服務器域名正向解析到某個IP,但該IP竟然反向解析到其它域名。Spamcop經常向Spamhaus提交一些IP,被Spamhaus列入SBL。

(三)動態IP記錄。IP靜態和動態兩種,提供主機托管的單位擁有靜態IP。雖然通過動態IP(主要是XDSL撥號)也能發送電子郵件,但真正能夠使對方接收到的,僅僅10%不到,那些群發組織或個人經常聲稱發送幾十萬個只要一點點錢,其實它們通過動態IP發送(它們不敢用靜態IP,怕列入Spamhaus黑名單),再說,他們的郵件地址有多少是有效的呢?

  這主要是國際上大量的組織在封堵動態IP,比較有名的有 http://www.gjabl.org http://www.sorb.org
http://dsbl.org

另外:
spamhaus.org 的RBL是
SBL: sbl.spamhaus.org
XBL: xbl.spamhaus.org
SBL+XBL: sbl-xbl.spamhaus.org
而且spamhaus.org提供DNS區域傳輸,可以讓用戶把RBL內容同步到本地的DNS Server上,但這個功能不是免費的.價格根據你單位的郵箱用戶數量和單位性質而不同.官方網站提供一個30天的試用.有興趣的話可以試用一把.

spamcop.net的RBL是
bl.spamcop.net
-------------------------------------------------------------------

Postfix中配置使用CASA RBL

  CBL、CDL與CBL+、CBL-採用的都是DNS方式的實時黑名單技術,在Postfix中都使用RBL參數來配置。Postfix1.x和Postfix 2.x在使用RBL的配置上是不同的。

  Postfix 1.x:

  要先用maps_rbl_domains來定義RBL表,可以用「,」分隔依次使用多個RBL:

maps_rbl_domains = cblless.anti-spam.org.cn

, 然後在過濾條件中(如smtpd_recipient_restrictions )使用reject_maps_rbl來拒絕黑名單連接:


要先用maps_rbl_domains來定義RBL表,可以用「,」分隔依次使用多個RBL:

maps_rbl_domains = cblless.anti-spam.org.cn

smtpd_recipient_restrictions = ... reject_maps_rbl,...

smtpd_recipient_restrictions = ... reject_maps_rbl,...

smtpd_recipient_restrictions = ... reject_maps_rbl,...

  Postfix 2.x:

  直接在過濾條件中(如smtpd_recipient_restrictions )使用reject_rbl_client來拒絕黑名單連接,可以用多個 reject_rbl_client  分隔依次使用多個RBL:

smtpd_recipient_restrictions =... 
  reject_rbl_client cblless.anti-spam.org.cn
,...

  smtpd_recipient_restrictions =... 
  reject_rbl_client cblless.anti-spam.org.cn,...

如果您想先測試一下RBL服務是否工作正常,可以在reject_maps_rbl指令和reject_rbl_client指令前加上warning_if_reject來改變默認的拒絕動作為警告(警告信息會在郵件日誌中看到)。等確認工作正常後再去掉警告指令。

===============
smtpd_recipient_restrictions =  check_sender_access hash:/etc/anti-spam,
        check_sender_access hash:/etc/local_senders ,
        check_sender_access hash:/etc/whitelist ,
        check_recipient_access hash:/etc/local_rcpt ,
        check_recipient_access hash:/etc/local_group ,
        permit_mynetworks,

        permit_sasl_authenticated,
#       reject_non_fqdn_hostname,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unauth_destination,
        reject_unauth_pipelining,
        reject_invalid_hostname,
#       reject_rbl_client bl.spamcop.net ,
#        reject_rbl_client cbl.anti-spam.org.cn=127.0.8.2,
       reject_rbl_client cblless.anti-spam.org.cn=127.0.8.5,
#        reject_rbl_client cblplus.anti-spam.org.cn=127.0.8.6

        check_policy_service inet:127.0.0.1:10030
##############

原文出處:常用的RBL服务器列表、介绍及Postfix配置 - jsl99@mig的日志 - 网易博客
前一個主題 | 下一個主題 | 頁首 | | |



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