最近遇到一個問題,有人利用 cmlab 的電子郵件發送垃圾郵件,導致許多外部郵件伺服器將我們加入黑名單。因此,我們認為有必要設定一個寄件上限來防止這種情況。雖然 Postfix 本身已經具有許多可設定的功能,包括防止垃圾郵件等,但它無法設定寄件的配額,所以我們打算嘗試使用 Policyd。
Policyd(又名 Cluebringer)是一個類似於中間件的軟體,它可以為郵件伺服器設定一些規則。這可以幫助我們更靈活地管理郵件流量,提高郵件伺服器的安全性和效率。通過使用 Policyd,我們可以制定更細緻的郵件策略,有效地對抗垃圾郵件和其他濫用行為。
安裝
在 cluebringer 2.0 以前的版本不支援 IPv6,所以基本上只能從官網下載最新版,又,官網安裝說明充滿錯誤,我在弄得時候十分不開心….,所以決定自己整理安裝流程。
下載並解壓縮
1 | $ wget http://download.policyd.org/v2.0.14/cluebringer-v2.0.14.zip |
初始化資料庫
在 database/
下,執行這段 shell script
1 | for i in core.tsql access_control.tsql quotas.tsql amavis.tsql checkhelo.tsql checkspf.tsql greylisting.tsql |
這邊產出的 .sql 會有語法錯誤,用 vim 開啟並下 :%s/TYPE=innondb/ENGINE=innondb/g
指令修改全部。
建立新資料庫並匯入 policyd.sql
:
1 | $ mysql -u root -p -e 'CREATE DATABASE policyd' |
複製檔案到該放的地方
1 | $ cp -r cbp /usr/local/lib/cbpolicyd-2.1/ |
啟動
1 | $ /usr/bin/perl /usr/local/sbin/cbpolicyd --config /etc/cluebringer.conf |
如果啟動時遇到類似: you may need to install the Mail::SPF module
等等 error,就安裝這個: sudo aptitude install libmail-spf-perl
要查看是否有啟動成功,可以下 ps aux | grep policyd
指令。
要查看 port 10031 是否有在 listen,可以下 netstat -pln | grep :10031
指令檢查。
設定 Postfix 使用 Policyd
去 Postfix config 檔設定 check_policy_service
:
1 | smtpd_sender_restrictions = |
在 smtpd_recipient_restrictions
中,check_policy_service
需要在 permit_mynetworks
上面才有用。
若要設定外寄 Quota 的話則 smtpd_sender_restrictions
也要加上 check_policy_service
。
另外提醒註解不要亂放,會讓設定檔整個壞掉….
可以透過 postconf
指令來列出真正 postfix 吃到的設定值
設定 Policyd Web UI
policyd 有提供一個 web 的設定介面,讓我們比較方便設定 policyd。
複製解壓縮檔裡的 webui/
到 web server
1 | $ cp -r webui /var/www/ |
需要把擁有者改成 www-data
1 | $ chown -R webui |
就可以直接連上 web 介面: http://your.domian/webui/
這 web 介面預設不用登入,大家都可以隨意更改,所以必須利用其他方式加個密碼保護。
這邊是用 lighthttpd
設定密碼
1 | $ cd /etc/lighthttpd |
詳細可以參考: Lighttpd setup a password protected directory (directories)
設定 Rate Limit
到這邊就簡單了,藉由 web 介面按按按鈕就可以設定各種 Quota,詳細可參考這篇圖文教學:
How To Configure Rate Limit Sending Message on PolicyD
驗證
想確定是不是有成功,可以去 mySQL > policyd > quota_tracking 查看是不是真的有在追蹤大家的流量。
或者也可以看 mail.log ,會有流量的 log 資訊,包含還剩多少用量等等資訊。
1 | $ tail /var/log/mail.log | grep cbpolicyd |