天天看點

Milter-limit控制postfix發信頻率

要在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,如需轉載請自行聯系原作者

繼續閱讀