firewalld: 抓取cc攻击ip用firewalld封禁

一,用firewalld添加ipset

创建新的ipset

[root@blog ~]# firewall-cmd --permanent --new-ipset=nginxcc --type=hash:ip

重新加载到内存

[root@blog ~]# firewall-cmd --reload
success

查看所有的ipset

[root@blog ~]# firewall-cmd --get-ipsets
nginxcc 

用ipset,添加禁止访问的规则:

[root@blog ~]# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source ipset="nginxcc" drop'
success

添加富规则后查看效果:

[root@blog ~]# firewall-cmd --zone=public --list-rich-rules
rule family="ipv4" source ipset="nginxcc" drop

在ipset中测试添加一条ip:

[root@blog ~]# firewall-cmd --ipset=nginxcc --add-entry=13.57.12.210
success

 测试结果:

[root@blog ~]# firewall-cmd --ipset=nginxcc --query-entry=13.57.12.210
yes

从被加ip地址的机器访问已无法访问

删除ip:

[root@blog firewalld]# firewall-cmd --ipset=nginxcc --remove-entry=13.57.12.210
success

测试结果:

[root@blog firewalld]# firewall-cmd --ipset=nginxcc --query-entry=13.57.12.210
no

从被加ip地址的机器访问已可以正常访问

 

二,用bash脚本抓取目标ip添加到集合中

#!/bin/bash
# 得到前一分钟的时间
time=`env LC_ALL=en_US.en date -d '1 minute ago' '+%e/%b/%G:%H:%M'`

# 文件的日志路径
log='/data/logs/nginxlogs/file_meet.access_log'

# 前一分钟出现的次数多于此阀值则会被block
maxCount=30


for line in `grep "$time" "$log" | awk '{print $1}' | sort -n | uniq -c | sort -rnk 1 | awk '{if ($1>'$maxCount') print $2}'`; do
    echo "ip:$line" 
    firewall-cmd --ipset=nginxcc --add-entry="${line}";
done;

把脚本放到crontab中每隔几分钟运行即可 

 

posted @ 2024-08-28 15:35  刘宏缔的架构森林  阅读(19)  评论(0编辑  收藏  举报