Postfix (3) 反垃圾郵件的措施(2)

本系統接着Postfix (3) 反垃圾郵件的措施(1)繼續



Postfix共有6種限制條件,

1) 訪問表

2) 客戶端參數

3)嚴格語法檢查

4)DNS檢查

5)實時黑名單

6)通用限制條件


1. 訪問表

任何涉及客戶端資格檢查的限制條件,都需要提供一個訪問表, 由一系列的key-value組成。

check_client_access maptype:mapname
             Check_client_access指向一個含有 IP地址、網絡地址、主機名稱、從屬網絡名稱的訪問表。

             Postfix先從DNS系統中反查出客戶端的IP地址的完整主機名(PTR),並自己分析出主機名與網絡,然後以這些信息與訪問表中的每一個索引鍵對比,如果發現相同的,就採取對應的動作。 如果沒有就是DUNNO

Check_helo_access maptype:mapname
             用於對比客戶端在HELO命令中顯示的主機名

Check_recipient_access maptype:mapname
              check_recipient_access指向一個包含郵件地址,網絡名、人名的訪問表, 用於對比客戶端在RCPT TO命令中提供的收件地址。 如果發現相同的鍵,就採用相同的動作。

check_sender_access maptype:mapname
            check_sender_access指向一個包含郵件地址,網絡名、人名的訪問表, 用於對比客戶端在MAIL FROM命令中提供的收件地址。 如果發現相同的鍵,就採用相同的動作。


2. 客戶端參數

permit_auth_destination

如果收件地址位於Postfix的轄域內,則批准請求。 包括mydestination, inet_interfaces, virtual_alias_map或者 virtual_mailbox_maps 以及relay_domains

如果recipient不符合 permit_auth_destination它會返回DUNNO,而不是REJECT

permit_mynetwork

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

reject_unauth_destination

如果收件人不在Postfix的轄域內,則拒絕請求。 默認值是554



3. 嚴格的語法條件

reject_invalid_hostname: 如果客戶端在HELO命令提供的主機名不是有效的主機名,返回invalid_hostname_reject_code(501)

reject_non_fqdn_hostname:如果客戶端在HELO命令提供的主機名不符合RFC的要求,返回non_fqdn_reject_code(504)

reject_non_fqdn_recipient:如果客戶端在RCPT TO命令提供的收件地址的網絡部分,不是RFC要求的, 返回non_fqdn_reject_code(504)

reject_non_fqdn_sender: 如果客戶端在MAIL FROM命令提供的收件地址的網絡部分,不是RFC要求的, 返回non_fqdn_reject_code(504)

reject_unauth_pipeline


4. DNS限制條件

reject_unknow_client:如果Postfix DNS通過反查不出PTR記錄,則會拒絕服務 ,拒絕碼unknown_client_reject_code 450

reject_unknow_hostname:如果HELO提供的主機名沒有A記錄,也沒有MX記錄,則拒絕服務, 拒絕碼unknown_client_reject_code 450

reject_unknow_recipient_domain:如果 RCPT TO提供的收件人的網絡,查不出有效的A或者是MX記錄,則拒絕服務,拒絕碼unknown_client_reject_code 450

reject_unknow_sender_domain:如果 MAIL FROM提供的收件人的網絡,查不出有效的A或者是MX記錄,則拒絕服務,拒絕碼unknown_client_reject_code 450


5. 實時黑名單(RBL)

專爲抵制垃圾郵件而設計的網絡服務,讓SMTP Server通過 DNS系統實時查詢客戶端是否爲垃圾源。 

reject_rbl_client rblprovider.domain

將客戶端的Ip地址(例如1.2.3.4)顛倒順序(4.3.2.1),搭配RBL的網絡名,構成一個主機名稱,然後以此主機名向DNS系統查詢, 如果能查出一個A記錄,表示該IP已被列入黑名單, 則Postfix會拒收郵件。

reject_rhsbl_client rblprovider.domain

如果客戶端的主機名在rblprovider.domain內有一筆A記錄,則拒絕服務

reject_rhsbl_sender rblprovider.domain

如果寄件人的郵件地址的網絡部分在rblprovider.domain內有一筆A記錄,則拒絕服務


6. 通用限制條件

Postfix還提供了下面的限制條件

permit:批准收下郵件,Postfix不再繼續當前的過濾規則,但是會跳到下一組規則

reject:無條件拒收

defer:婉拒請求,客戶端被告知稍後再試。


舉個例子, 對HELO,我們有如下的檢查

smtpd_helo_restrictions =
              check_helo_access hash:/usr/local/etc/postfix/helo_access
              reject_invalid_hostname

其中 helo_access的內容如下:

             a.com reject
             b.com OK


現在有下面的幾個連接實例

1)HELO test

 首先檢查check_helo_access,在helo_access中找不以test的記錄

 於是再檢查hostname 是否valid, 由於 test不是標準的完整的主機名,所以Postfix拒收。

2) HELO a.com

 首先檢查check_helo_access,在helo_access中找到了a.com的記錄,REJECT, Postfix當場拒收。

3) HELO b.com

 首先檢查check_helo_access,在helo_access中找到了b.com的記錄,OK

Postfix跳過helo_restrictions的檢查, 如果有其他的檢查,就轉到其他的檢查去(比如:sender_restrictions)

4) HELO c.com

 首先檢查check_helo_access,在helo_access中找不以c.com的記錄

於是再檢查hostname 是否valid, 由於 c.com是標準的完整的主機名,所以postfix繼續下面的檢查(如果還有的話,比如:sender_restrictions)



Postfix的最後一道防線就是內容檢查

Postfix提供了4郵件內容檢查的參數

header_checkes

mime_header_checks

nested_header_checks

body_checks

內容檢查是全面的, 要麼都檢查,要麼都不檢查,沒有辦法讓特定的寄件人或者是收件人繞過。 

header_checks = regexp:/usr/local/etc/postfix/header_checks

模式表的索引鍵是正則表達式,所以必須放在一對分隔符“/"之間, 例如

/match pattern/ REJECT

內容檢查的動作:


REJECT Message txt 拒收郵件,並將message傳給客戶端
WARN message txt 模擬拒收動作,還會真的拒收,只將message記錄在日誌文件中,
IGNORE 刪除符合模式的標題字段或整行文字
HOLD message text 將整封郵件放在保留隊列中
DISCARD message 要求Postfix假裝接收郵件,其實偷偷丟掉

對於模式匹配,想要測試的話,可以使用postmap命令,

postmap -q -regexp:/usr/local/etc/postfix/header_checks <msg.txt
這樣的話,postmap會顯示出符合模式的字符串,以及對應該模式的動作。



最後上傳一個筆者測試環境的一個配置文件的內容如下 :






發佈了72 篇原創文章 · 獲贊 4 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章