延續昨天的文章主題,透過網友 Willie 的推薦,我決定替我的 Postfix 加上 Postgrey 機制,Postgrey 的運作機制是讓 SMTP 收到郵件後先回應 450 (Requested mail action not taken: mailbox unavailable) 給來源 SMTP 伺服器,若來源伺服器是標準的 SMTP 伺服器就會格一段時間自動重試,但如果對方是用發垃圾信的工具,就不會將信件重發一次 (因為他正忙著發上千萬封的垃圾郵件),也就達到有效阻擋垃圾郵件的目的。
在 Ubuntu 安裝 Postgrey 是在簡單不過的事,三個步驟就可完成安裝設定:
1. 先利用 apt-get install postgrey 安裝好,然後再看一下 /etc/default/postgrey 的設定 (基本上不用改)
2. 設定 Postfix 的 /etc/postfix/main.cf 設定檔
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
check_policy_service inet:127.0.0.1:60000
3. 重新載入 Postfix 設定
/etc/init.d/postfix reload
註: 預設 postgrey 是透過 daemon 運作的,預設會 LISTEN 本機網路(localhost) 的 Port 60000
---
不過我還有壹台 Fedora Core 3 的主機實在太舊了,只好從官網下載套件回來安裝,不過礙於說明文件太少,只好自己嘗試,以下是我整理的安裝步驟:
1. 安裝主機所缺少的 Perl 模組 ( 我機器剛好缺少 IO::Multiplex 模組 )
安裝示意圖如下:
2. 建立 postgrey 專用的使用者與群組
useradd -r -g postgrey postgrey
3. 下載程式並解壓縮
4. 將 postgrey 主程式複製到 /usr/sbin/ 目錄下 ( 註: postgrey 是用 Perl 寫的 )
5. 將預設白名單複製到 /etc/postfix/ 目錄下 ( 兩個檔案 )
cp postgrey_whitelist_* /etc/postfix/
6. 建立 /var/spool/postfix/postgrey 目錄
mkdir /var/spool/postfix/postgrey
chown postgrey /var/spool/postfix/postgrey
7. 啟動 postgrey 服務,並將以下指令加入 /etc/rc.local 檔案讓該服務可以在重開機時自動啟動
/usr/sbin/postgrey --pidfile=/var/run/postgrey.pid -d -i 60000 --user=postgrey --group=postgrey
8. 設定 Postfix 的 /etc/postfix/main.cf 設定檔
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
check_policy_service inet:127.0.0.1:60000
9. 重新載入 Postfix 設定
/etc/init.d/postfix reload
---
最後我們還是習慣檢查一下系統記錄,確保一切運作正常:
---
另外也可設定 PSMon 監控該服務是否正常運作
<Process postgrey>
spawncmd /usr/sbin/postgrey --pidfile=/var/run/postgrey.pid -d --inet=60000 --user=postgrey --group=postgrey
pidfile /var/run/postgrey.pid
killcmd killall postgrey
</Process>
補充說明
由於 Postgrey 預設拒收郵件的時間是 5 分鐘 ( 300 秒 ),如果有需要縮短暫時拒收的時間可以調整服務的啟動參數,加上 --dealy=秒數 即可,例如:
/usr/sbin/postgrey --pidfile=/var/run/postgrey.pid
-d -i 60000 --user=postgrey --group=postgrey --delay=120
成果效益
我今天啟用 Postgrey 之後,一天的垃圾信量已經低於 30 封,真是跟之前天差地遠阿! ^_^
相關連結