香港/韩国云服务器、独立服务器租用

使用 ipset+iptables封禁大量IP

自营机房/高防服务器/高防VPS/美国高防/洛杉矶VPS/洛杉矶高防服务器

配置过程

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是否重新生效了

本站QQ群:683851361,联系我:zrblog@qq.com

分享到
便宜VPS/10美元VPS/洛杉矶、圣何塞等多个机房