本系統接着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會顯示出符合模式的字符串,以及對應該模式的動作。
最後上傳一個筆者測試環境的一個配置文件的內容如下 :