UFW防火墙删除旧规则,批量清理IP黑名单
服务器运行久了,UFW 里会积累不少手动添加的封禁规则。
这些旧规则不仅占用资源,还可能误封正常 IP。
本文面向零基础用户,讲清如何查看、删除和批量清理 UFW 旧规则与 IP 黑名单,跟着命令做就能完成。
为什么要清理 UFW 旧规则
UFW 是 Ubuntu/Debian 上常用的防火墙前端工具,规则多了以后有两个明显问题。
- 规则编号会变:删除一条规则后,后面的编号自动前移,按旧编号操作容易删错。
- 黑名单会过期:临时封禁的 IP 如果没及时清理,可能一直挡着正常访客。
清理前建议先确认 UFW 状态:
sudo ufw status numbered
这条命令会列出所有规则并带编号,编号是后续删除操作的依据。
删除单条规则的正确姿势
假设要删除编号为 3 的规则,执行:
sudo ufw delete 3
系统会提示确认,输入 y 回车即可。每删除一条规则后,务必重新执行 sudo ufw status numbered 查看最新编号,不要连续按旧编号删除。
如果知道规则的具体内容,也可以用完整规则删除,避免编号错乱:
sudo ufw delete deny from 192.168.1.100
这种方式更稳妥,适合规则数量不多的情况。
批量清理 IP 黑名单
当黑名单有几十上百条时,逐条删除效率太低。
可以借助脚本批量处理。
先导出当前规则到临时文件:
sudo ufw status numbered | grep 'DENY' > /tmp/ufw_deny.txt
cat /tmp/ufw_deny.txt
确认输出里都是要清理的规则后,用循环从最大编号开始倒序删除,这样编号前移不会影响未删除的规则:
for i in $(sudo ufw status numbered | grep 'DENY' | awk -F'[][]' '{print $2}' | sort -rn); do
sudo ufw --force delete $i
done
--force 参数会跳过确认提示,适合脚本环境。
执行完再次查看状态,确认目标规则已消失。
如果只想清理某个网段的黑名单,可以先用 grep 过滤再删除:
sudo ufw status numbered | grep '192.168.1.'
确认无误后,把上面循环里的 grep 'DENY' 换成对应过滤条件即可。
避坑指南
- 不要删掉允许 SSH 的规则:清理前先确认哪条是
ALLOW 22/tcp,误删会导致自己连不上服务器。 - 操作前备份规则:执行
sudo ufw status numbered > ~/ufw_backup.txt,出问题可对照恢复。 - 倒序删除是关键:正序删除会让编号错位,导致漏删或误删。
- 确认 UFW 已启用:如果
ufw status显示inactive,规则不会生效,先排查是否被其他防火墙(如 iptables、firewalld)接管。
验证清理结果
删除完成后,用以下命令复查:
sudo ufw status verbose
重点关注 DENY 规则数量是否减少到预期值。
如果还有残留,重复上面的过滤和删除步骤。
最后测试一下服务器端口是否正常访问,比如用另一台机器 ssh 登录或 curl 请求业务端口,确认没有被误封。
清理 UFW 旧规则和批量删除 IP 黑名单的核心就是:先看编号、再倒序删、删完必复查。
养成操作前备份的习惯,可以避免绝大多数误删问题。