linux 基于ipset+iptables 保护api接口被暴力访问
由于本公司平台注册获取短信接口被恶意访问,所以有了限制非法ip访问接口想法。在网上了解了很多,最终确定shell脚本分析nginx access日志,生成ipset 集合,然后iptables,过滤指定的ipset 集合。借助crontab定时执行,可以做到快速发现恶意ip,并且拦截之。
1、安装依赖软件
由于基于ipset+iptables,所以需要在对应的主机上配置ipset,iptabes
# 我们的系统版本为:CentOS6.5
yum install iptables
yum install ipset
2、配置ipset,创建ip集合
# 创建ip集合
ipset create yourblacklist hash:ip #默认大小黑名单;
ipset create yourblacklist hash:ip maxelem 1000000 #指定大小黑名单;
# 查看ip集合
ipset list [yourblacklist]
# 手动增加恶意ip至集合
ipset add yourblacklist 10.60.10.xx
# 手动删除集合中ip
ipset del yourblacklist 10.60.10.xx
3、配置iptables,过滤指定ip集合
# 通过命令过滤指定的ip集合
iptables -I INPUT -m set --match-set yourblacklist src -p tcp --destination-port 80 -j DROP
# 或者修改配置文件
-I INPUT -m set --match-set yourblacklist src -p tcp --destination-port 80 -j DROP
4、shell脚本,分析nginx access日志,确定恶意ip
我这里根据平台用户访问频率,指定访问超过100次/1分钟的为恶意性质ip
#!/bin/bash
# shell script find czj yourblacklist add to ipset
logpath=/imgData/nginx/log
lastminutes=1
# starttime
start_time=`date -d"$lastminutes minutes ago" +"%H:%M:%S"`
echo $starttime
# end_time
stoptime=`date +"%H:%M:%S"`
echo $stoptime
# find 200/1m ip
tac $logpath/yourlogfile.log | awk -v st="$starttime" -v et="$stoptime" '{t=substr($4,RSTART+14,21);if(t>=st && t<=et) {print $0}}' \
| awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/blackiptemp
ip_top=`cat $logpath/blackiplist | head -1 | awk '{print $1}'`
ip=`cat $logpath/blackiptemp| awk '{if($1>100)print $2}'`
# add to ipset
for line in $ip
do
ipset add yourblacklist $line
done
5、配置crontab,定时任务
*/1 * * * * root ./etc/profile; /bin/sh /your_shell_path/your_shell_script_file.sh
./etc/profile;不要省略,应为脚本运行环境的问题,不带这个,有可能会导致,脚本直接执行可以,crontab不执行的坑。
参考了一些文章,请大神见谅。