配置过程
1.安装ipset
sudo apt update && sudo apt install ipset –y
2.创建 IP 集合(命名为 blocklist)
sudo ipset create blocklist hash:ip hashsize 65536 maxelem 500000
3.批量添加 IP 到集合(假设 IP 列表在 logs_ip.log 中):
while read ip; do sudo ipset add blocklist $ip; done < logs_ip.log
4.创建 iptables 规则引用集合:
sudo iptables -I INPUT -m set --match-set blocklist src -j DROP sudo iptables -I FORWARD -m set --match-set blocklist src -j DROP
5.持久化配置(重启后生效):
sudo ipset save blocklist > /etc/ipset.conf sudo apt install iptables-persistent -y sudo netfilter-persistent save
验证封禁是否生效
1.检查 ipset 内容
sudo ipset list blocklist | head -n 10 # 查看前10个IP
2.测试封禁效果
ping -c 1 被封禁的IP curl -v --connect-timeout 5 http://被封禁的IP
3.解锁IP
sudo ipset del blocklist 1.2.3.4 # 解除单个IP sudo ipset flush blocklist # 清空整个集合(慎用!)
4.性能监控
sudo ipset list blocklist | grep "Number of entries" #查看封了多少个IP watch -n 1 "sudo ipset list blocklist | grep 'Number of entries'"
后续追加封禁新IP
1. 查看当前已封禁的 IP 集合
sudo ipset list blocklist # 替换为你的ipset名称
确认现有集合的 名称、类型(如 hash:ip)和 已有IP列表。
2. 临时追加单个 IP
sudo ipset add blocklist 1.2.3.4 # 替换为要封禁的IP sudo ipset add blocklist 1.2.3.4 timeout 432000 -exist #加上过期时间
即时生效,无需重启服务。
3. 批量追加 IP(从文件导入)
假设新 IP 列表在 logs_ip.log 中(每行一个 IP):
while read ip; do sudo ipset add blocklist "$ip"; done < logs_ip.log #如果要加上过期时间: while read ip; do sudo ipset add blocklist "$ip" timeout 432000 -exist done < logs_ip.log
4. 验证新 IP 是否已加入集合
sudo ipset test blocklist 1.2.3.4 # 测试IP是否在集合中 sudo ipset list blocklist | tail -n 5 # 查看最后5个IP
5. 持久化保存(重启后依然有效)
sudo ipset save blocklist > /etc/ipset.conf sudo netfilter-persistent save # 适用于Debian/Ubuntu
或手动保存:
sudo ipset save > /etc/ipset.rules
6.更方便的大批量追加IP
直接编辑 /etc/ipset.conf 后重新加载(适合成千上万个IP):
sudo nano /etc/ipset.conf # 手动添加IP sudo ipset restore < /etc/ipset.conf
备份/导出规则
sudo iptables-save > ~/iptables_backup.txt sudo ipset save > ~/ipset_backup.txt
恢复/导入规则
sudo iptables-restore < ~/iptables_backup.txt sudo ipset restore < ~/ipset_backup.txt
注意:恢复会覆盖原来已有的规则,恢复规则重启后会失效,为了使规则在重启后仍然有效,需要将恢复后的规则保存到 /etc/ipset.conf 文件中。
sudo ipset save > /etc/ipset.conf
如果系统使用iptables-persistent或netfilter-persistent,则运行 sudo netfilter-persistent save 确保iptables规则也加载ipset集合
7.清空全部IP
sudo ipset flush blocklist
如果想重启后也是空的,那就也要上面的持久化来一次。
8.列出所有封禁IP/统计封禁IP数量
sudo ipset list sudo ipset list blocklist | grep -vE '^(Name|Type|Revision|Header|Size in memory|References|Members):' | grep -v '^$' | wc -l 或者下面的命令统计数量 ipset list blocklist | grep -c '^[0-9]'
使用ipset封C段
1.创建网段IP集合(命名为 blocknet)
sudo ipset create blocknet hash:net hashsize 65536 maxelem 200000
2.添加C段IP
sudo ipset add blocknet xx.xx.xx.0/24
3.iptables添加一个ipset
iptables -I INPUT -m set --match-set blocklist src -j DROP #原有 iptables -I INPUT -m set --match-set blocknet src -j DROP #添加
4.查看封了哪些网段
ipset list blocknet
给blocklist封禁的IP加上过期时间
加过期时间无法直接添加,需要备份-删除-重建-恢复的步骤:
1.备份原来封闭的IP
ipset save blocklist > /root/blocklist.bak
2.删除旧的blocklist
ipset destroy blocklist 提示无法删除,正在被使用,那么需要先在iptables删除规则 iptables -L INPUT -n --line-numbers | grep blocklist #找到规则记下行号 iptables -D INPUT 5 #这个5就是上面看到的行号 iptables -L FORWARD -n --line-numbers | grep blocklist #找到规则记下行号 iptables -D FORWARD <行号>
3.创建新的blocklist并加上过期时间比如5天=432000秒
sudo ipset create blocklist hash:ip timeout 432000 hashsize 65536 maxelem 500000
4.把之前的iptables规则加回去
sudo iptables -I INPUT -m set --match-set blocklist src -j DROP sudo iptables -I FORWARD -m set --match-set blocklist src -j DROP
4.恢复之前封禁的IP
ipset restore < /root/blocklist.bak
这里可能会遇到报错:Error in line 1: Set cannot be created: set with the same name already exists
#先检查第一行是不是真的有create blocklist ... head /root/blocklist.bak
那就把create行过滤掉,只执行 add
grep '^add ' /root/blocklist.bak | sed 's/$/ -exist/' | ipset restore
5.后续添加单个IP但是不准备5天过期,可以加上timeout参数,-exist是去除重复
ipset add blocklist 1.2.3.4 timeout 86400 -exist
6.检查下看封禁的IP是否带了timeout
ipset list blocklist iptables -L INPUT -n | grep blocklist #看iptalbes是否重新生效了











