天天看點

Postfix反垃圾郵件技術

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位址來比對。關于通路資料庫請參閱下面的附錄。

例子:

smtd_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位址。

搜尋名為mapname的maptype類型的通路資料庫。可以根據HELO/EHLO發送的主機名、父域來比對。關于通路資料庫請參閱下面的附錄。

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

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

通過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中位址發送的郵件 

Postfix預設接收最終投遞目标符合如下條件的郵件: 

目标在$inet_interfaces 

目标在$mydestinations 

目标在$virtual_alias_domains 

目标在$virtual_mailbox_domains 

reject_unauth_destination

拒絕不是發往預設轉發和預設接收的連接配接。

relay_domain_reject_code指定了拒絕的傳回狀态碼(預設是554)。 

permit_mx_backup

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記錄的連接配接。

reject_rhsbl_recipient domain.tld

拒絕接收者郵件的域屬于RHSBL黑名單的連接配接。通過檢查一個域名是否存在于domain.tld的RHSBL中,可以判斷該用戶端是否被列入了domain.tld的實時黑名單,進而決定是否接受連接配接。

reject_non_fqdn_recipient

拒絕接收者郵件的域不是FQDN格式的連接配接。 

permit_sasl_authenticated

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

本文轉自Deidara 51CTO部落格,原文連結:http://blog.51cto.com/deidara/190375,如需轉載請自行聯系原作者