linux 基于ipset+iptables 保护api接口被暴力访问

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不执行的坑。

参考了一些文章,请大神见谅。

展开阅读全文

没有更多推荐了,返回首页