Milter-limit控制postfix发信频率
>要在postfix 中限制一个用户发信的数量,发到某个域的数量,和频率需要一种控制机制!
milter-limit 是Sendmail 的一个filter,用于限制用户发邮件的数量,以防止邮件服务器 被非法用于发送垃圾邮件,它可以实现对指定的客户端IP、收件人、发件人进行限制。该 filter可以不做任何修改即可用于Postfix中 到www. 下载 (需要注册) http://www. 安装 注意,在安装操作系统的时候安装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 build # 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掉了,这样发送任务终止了,需要等待时间再次发送,但是这戏都是系统自动进行的,一旦断掉就终止发信了 会不会有一种机制将超过的信保持在发送队列中,等到过了罚值继续发送?? 我还没有找到这个解决的方法,希望有哪位高人知道怎么做,那多谢指导啊 呵呵,这对发信量少的企业邮件有很大帮助,免去了被利用发送垃圾邮件的危险 |
|