要在postfix 中限制一個使用者發信的數量,發到某個域的數量,和頻率需要一種控制機制!
milter-limit 是Sendmail 的一個filter,用于限制使用者發郵件的數量,以防止郵件伺服器
被非法用于發送垃圾郵件,它可以實作對指定的用戶端IP、收件人、發件人進行限制。該
filter可以不做任何修改即可用于Postfix中
到www.snertsoft.com 下載下傳 (需要注冊)
http://www.snertsoft.com
安裝
注意,在安裝作業系統的時候安裝sendmail的所有元件,這個軟體的安裝需要用到sendmail 的相關檔案,如果沒有安裝下面的編譯安裝會出現錯誤!
下載下傳:如下的軟體:
db-4.8.26.tar.gz (可能不需要安裝)
milter-limit-0.14.tar.gz
libsnert-1.73.11.tar.gz
# tar -zxvf libsnert-1.73.11.tar.gz
# tar -zxvf milter-limit-0.14.tar.gz
#cd com/snert/src/lib
# ./configure --with-db=/usr # 檢查是否有Berkeley DB 支援
# make build
# cd ../milter-limit
# ./configure --enable-run-user=postfix --enable-run-group=postfix
# make install
安裝完畢:
下面設定postix
修改 /etc/postfix/main.cf
添加參數:
smtpd_milters = unix:/var/run/milter/milter-limit.socket
過濾規則:
milter-limit 的規則檔案寫在/etc/mail/access 中,然後用makemap 來生成
makemap hash /etc/mail/access.db < /etc/mail/acces
# 請注意access.db權限不能為可執行,并且可以讓postfix 使用者能夠讀取
/etc/mail/access 檔案的規則包括
milter-limit-Connect: # 用戶端連接配接IP
milter-limit-From: # 發件人位址
milter-limit-To: # 收件人位址
milter-limit-Auth: # 通過SMTP認證的發件人
支援以下比對規則
[network/cidr]limit 無類域間路由
!pattern!limit 簡單文本比對
/regex/limit POSIX正規表達式
limit:時間機關可以是秒(s)、分鐘(m)、小時(h)、天(d)、星期(w)
格式: messages ‘/’ time [unit]
# 發往sina.com域限制在1小時發送2封郵件
政策:
啟動參數: policy=reject
none 什麼都不做
tag 給郵件标題打标簽 啟動參數:subject-tag=[SPAM]
quarantine 将郵件送入隔離隊列(不發送,需要通過指令激活).
later 不接收郵件,提示發送端發送延遲消息,郵件仍舊在發送端的隊列中,稍候重試
reject 拒絕郵件(預設值)
discard 直接丢棄
啟動指令
/usr/local/sbin/milter-limit verbose=all policy=later -start
如果需要調試使用 verbose=all 在/var/log/maillog 中檢視日志
其他參數用 -help 參數檢視
postfix 基本參數設定
smtp_skip_4xx_greeting = yes
smtp_skip_5xx_greeting = yes
default_destination_concurrency_limit = 2 #同一IP并發連接配接
initial_destination_concurrency = 2
smtp_helo_name = mail.test.com # 本機對外真實域名
smtpd_milters = inet:localhost:8891,unix:/var/run/milter/milter-limit.socket
測試發送郵件,如果在一小時呢發送超過2封每秒,會被拒絕投遞
檢視日志:
tail /var/log/maillog
如下資訊
說明控制能正常功能工作了
Mar 11 19:20:18 mail milter-limit[5613]: 00004 NOQUEUE: limit max=2 seconds=3600
Mar 11 19:20:18 mail milter-limit[5613]: cache get {milter-limit-to:sina.com}
Mar 11 19:20:18 mail milter-limit[5613]: 00004 NOQUEUE: cache get key={milter-limit-to:sina.com} value={1268309916, 2} rc=0
Mar 11 19:20:18 mail milter-limit[5613]: 00004 NOQUEUE: isOverLimit(8d50100, 8d4fbe8) {milter-limit-to:sina.com, 2/1h, 2, 4b98df9c}
rc=1
Mar 11 19:20:18 mail milter-limit[5613]: 00004 NOQUEUE: reply 450 4.7.1 has exceeded 2 messages per 1 hour
Mar 11 19:20:18 mail postfix/smtpd[5618]: NOQUEUE: milter-reject: RCPT from unknown[192.168.1.109]: 450 4.7.1 has exceeded 2 messag
這個是其中的一個控制,還有很多其他的設定。
這其中有個問題,對于我們的發信系統來說,原因在于:發信一旦超過限制,就把信直接給reject掉了,這樣發送任務終止了,需要等待時間再次發送,但是這戲都是系統自動進行的,一旦斷掉就終止發信了
會不會有一種機制将超過的信保持在發送隊列中,等到過了罰值繼續發送??
我還沒有找到這個解決的方法,希望有哪位高人知道怎麼做,那多謝指導啊
呵呵,這對發信量少的企業郵件有很大幫助,免去了被利用發送垃圾郵件的危險
本文轉自andylhz 51CTO部落格,原文連結:http://blog.51cto.com/andylhz2009/284780,如需轉載請自行聯系原作者