Linux中ipset本身不支持自动过期,但可通过timeout参数与定期脚本实现:创建集合时需指定timeout类型(如ipset create banned_ips hash:ip timeout 300),添加条目可覆盖默认超时,已有集合须销毁重建;通过ipset list查看Timeout字段及剩余秒数验证生效,内核在访问或空闲时自动清理过期项,也可用ipset test或list触发;建议每1–5分钟运行脚本主动检查含Timeout的集合以确保及时清理。

Linux 中 ipset 本身不支持自动过期机制,但可以通过组合使用 timeout 参数 和 定期脚本检查 实现自动清理过期封禁记录。
启用 ipset 的 timeout 功能
创建集合时必须指定 timeout 类型,否则无法自动过期:
- 新建带超时能力的 hash:ip 集合:
ipset create banned_ips hash:ip timeout 300(单位为秒,此处设为 5 分钟) - 添加带超时的 IP 时可覆盖默认 timeout:
ipset add banned_ips 192.168.1.100 timeout 600(该条目存活 10 分钟) - 已有集合不支持直接追加 timeout 属性,需先销毁重建(确保规则未被 iptables 引用)
确认 timeout 是否生效
运行 ipset list banned_ips 查看输出中是否包含 Timeout: 300 字样,并观察条目右侧是否有剩余秒数(如 127 表示还剩 127 秒)。若显示 0 或无数字,则可能未启用 timeout 或已过期但尚未被内核自动清除(实际清除发生在下次访问或定时扫描时)。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
手动触发清理与验证
ipset 内核模块会在集合被访问、或系统空闲时自动清理过期项,但也可主动触发检查:
- 执行任意查询操作会触发清理:
ipset test banned_ips 192.168.1.100 &>/dev/null - 查看当前有效条目数:
ipset list banned_ips | grep -c "^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$" - 注意:
ipset flush是清空全部,不是清理过期项,慎用
设置定期维护脚本(推荐)
虽然 timeout 自动管理大部分场景,但为防止内核延迟清理或排查异常,建议每 1–5 分钟运行一次轻量检查:
- 写入脚本
/usr/local/bin/ipset-cleanup.sh:
#!/bin/bash
# 确保只对启用了 timeout 的集合操作
for setname in $(ipset list -n | grep -E '^(banned|block|deny)'); do
if ipset list "$setname" 2>/dev/null | grep -q "Timeout:"; then
# 触发一次 list 操作促使内核清理过期项
ipset list "$setname" >/dev/null 2>&1
fi
done- 加入 cron(例如每 3 分钟执行):
*/3 * * * * /usr/local/bin/ipset-cleanup.sh - 无需重启服务或重载规则,完全无感运行

















