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中每隔几分钟运行即可