milter-limit 是Sendmail 的一个filter,用于限制用户发邮件的数量,以防止邮件服务器被非法用于发送垃圾邮件,它可以实现对指定的客户端IP、收件人、发件人进行限制。该filter可以不做任何修改即可用于Postfix中

到 www.snertsoft.com 下载 
http://www.snertsoft.com/download/milter-limit-0.13.tar.gz
http://www.snertsoft.com/download/libsnert-current.tar.gz
shell> tar -zxvf libsnert-current.tar.gz
shell> tar -zxvf milter-limit-0.13.tar.gz
shell>cd com/snert/src/lib
shell> ./configure --with-db=/usr            # 检查是否有Berkeley DB 支持
shell> make build
shell> cd ../milter-limit
shell> ./configure --enable-run-user=postfix --enable-run-group=postfix
shell> make build
shell> make install

修改 /etc/postfix/main.cf
smtpd_milters = unix:/var/run/milter/milter-limit.socket  # 如果有多个milter 用逗号分隔
milter_protocol = 2  (对新版本的postfix需要这一行,至少postfix 2.6.5需要)

过滤规则:
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]

过滤规则例子:
milter-limit-Connect:80.94              [80.94.96.0/20]-1/1   500/3d          # 冒号之间不能有空格

# 80.94开头的网段:从地址80.94.96.0/20 (80.94.96.0- 80.94.111.255) 不受限制,其他地址限制在 3天内最多发送500封邮件
milter-limit-To:163.com                                        100/1h

# 发往163.com域限制在1小时发送100封邮件
策略:
启动参数: policy=reject
none            什么都不做
tag              给邮件标题打标签   启动参数:subject-tag=[SPAM]
quarantine     将邮件送入隔离队列(不发送,需要通过命令激活).
later            不接收邮件,提示发送端发送延迟消息,邮件仍旧在发送端的队列中,稍候重试
reject           拒绝邮件(默认值)
discard         直接丢弃

启动命令
/usr/local/sbin/milter-limit  verbose=all policy=later access-db=/etc/mail/access.db -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   
#使用sendmail 的milter-limit 插件来实现对指定的客户端IP、收件人、发件人进行限制

官方文档:http://www.snertsoft.com/sendmail/milter-limit/
http://www.postfix.org/MILTER_README.html