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,如需轉載請自行聯系原作者