一、软件及安装
- ptables 包含几个表,每个表由链组成。默认的是 filter 表,最常用的也是 filter 表,另一个比较常用的是 nat 表。一般封 IP 就是在 filter 表的 INPUT 链添加规则。
- 在进行规则匹配时,是从规则列表中从头到尾一条一条进行匹配。
ubuntu:apt-get install ipset
centos:yum install ipset
简单的流程
ipset create peter hash:ip
iptables -I INPUT -m set --match-set peter src -j DROP
ipset add peter 4.5.6.7
ipset add peter 1.2.3.4
ipset add peter ...
ipset list peter # 查看 peter 集合的内容
另外几条常用命令
ipset del peter x.x.x.x # 从 peter 集合中删除内容
ipset list peter # 查看 peter 集合内容
ipset list # 查看所有集合的内容
ipset flush peter # 清空 yoda 集合
ipset flush # 清空所有集合
ipset destroy peter # 销毁 peter 集合
ipset destroy # 销毁所有集合
ipset save peter # 输出 peter 集合内容到标准输出
ipset save # 输出所有集合内容到标准输出
ipset restore # 根据输入内容恢复集合内容
二、ipset的使用详解
1、查看ip集的列表信息
ipset list
2、创建ip集
ipset create XXXX hash:ip,port hashsize 4096 maxelem 100000 timeout 3600
ipset add XXXX 3.4.5.6,3306
ipset add xxxx 1.1.1.1
ipset add xxxx 1.1.1.0/24
ipset save xxxx>ipset_list.txt
ipset restore <ipset_list.txt
三、自动封禁和解封细节说明
存储类型
ipset create r2d2 hash:net
ipset add r2d2 1.2.3.0/24
ipset add r2d2 1.2.3.0/30 nomatch
ipset add r2d2 6.7.8.9
ipset test r2d2 1.2.3.2
ipset create c-3po hash:ip,port
ipset add c-3po 3.4.5.6,80
ipset add c-3po 5.6.7.8,udp:53
ipset add c-3po 1.2.3.4,80-86
自动过期,解封
ipset create peter hash:ip timeout 300
ipset add peter 1.2.3.4
ipset add peter 6.6.6.6 timeout 60
ipset -exist add obiwan 1.2.3.4 timeout 100
ipset create luke hash:ip
ipset add luke 5.5.5.5 timeout 100
# 得到报错信息 kernel error received: Unknown error -1
举例
ipset create XXXX hash:ip timeout 172800
iptables -A INPUT -p tcp -m set --match-set XXXX src -m multiport --dports 443,80 -j DROP
iptables -A INPUT -p tcp -m set --match-set XXXX src -m multiport -j DROP
#!/bin/bash
FILES="/data/nginx_log/xxxxx/access.log"
DATE=`date -d '1 minutes ago' +%Y:%H:%M`
grep ${DATE} ${FILES}|awk -F'|' '{print $3}'|sort -n|uniq -c |sort -nr|head -1>/tmp/ips
grep ${DATE} ${FILES}|grep -i passwd|awk -F'|' '{print $3}'|sort -n|uniq>/tmp/ippwd
NUM=`awk '{print $1}' /tmp/ips`
IP=`awk '{print $2}' /tmp/ips`
IP2=`cat /tmp/ippwd`
threshold=1000
if [[ $NUM -gt $threshold ]];then
/sbin/ipset -! add forbidip $IP timeout 3600
fi
if [ -s /tmp/ippwd ];then
for i in $IP2
do
/sbin/ipset -! add forbidip $i
done
fi
*/1 * * * * bash /path/to/script.sh
来源作者:peter-zou