debian下qmail的白名单功能

给邮件服务器加了一个白名单功能.
邮件服务器环境:用debian的4.0r1  邮件系统是qmail_1.03-44 用mysql方式来管理邮件账号.

白名单功能是在debian带的黑名单补丁的基础上做的.

qmail_omt.sh 从mysql的lastauth表格获取文本格式的白名单文件:/etc/qmail/okmailto

disable_mail.sh是从白名单取消邮件地址, 但不删除邮件账号, 在账号进行下一次pop3收信后会自动进入白名单.

anheng_qmail.diff是在debian的qmail源码qmail_1.0.3-44的基础上进行的修补.

 

今天增加了白名单防火墙联动机制 2步操作

1.inotail 监视mail.info日志文件,然后把发送badmail的ip地址放进数据库vpopmail/badip

2.定时整理badip数据库, 建立封堵列表

具体的实施:

1.badip入库

 建表 2个字段  ip (varchar), time (datetime) ,都建上索引


下面这条命令就不停的把badip入库了.

inotail -n 0 -f /var/log/mail.info  |sed -n -u "s/.*badmailto:.*at \(.*$\)/insert into badip set ip='\1',time=now();/p" \
|mysql -u vpopmail -pxxxxxx vpopmail &

2.整理ip地址,更新iptables规则

首先修改iptables规则增加一个链:smtp专门用于放置smtp的规则. 方便清理和更新

iptables -n smtp

iptables -A  INPUT -p tcp --dport 25 -j smtp

修改防火墙规则的命令行脚本:放入 /etc/crontab 每10分钟执行一次

-----------------badmail_iptables.sh

#!/usr/bin/php
<?php
mysql_connect("localhost",'root','xxxxxx')
or die("Could not connect: " . mysql_error());
mysql_select_db('vpopmail') or die("selectdb error:".mysql_error());
$beftime=date('Y-m-d H:i:s',time()-3600*4); // 4小时
//查找4小时内,发过badmail的ip,按发送次数倒序排列
$re=mysql_query("select ip,count(*) as count from badip where  time>'$beftime' group by ip order by count desc limit 1000")
  or die(mysql_error());
system("iptables -F smtp"); //清smtp链
while($ip=mysql_fetch_array($re))
{
if($ip[count]<2) break; //2次以上的才封堵
system("iptables -A smtp -s $ip[ip] -j REJECT"); //添加规则
}
mysql_query("delete from badip where time<'$beftime'");//清理4小时以外的badip
mysql_query("OPTIMIZE TABLE `badip` ");//优化表
?>