给邮件服务器加了一个白名单功能.
邮件服务器环境:用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` ");//优化表
?>
附件 | 大小 |
---|---|
anheng_qmail_whitelist.tar.gz | 5.06 千字节 |