nftables 的 timeout 集合机制可实现规则元素自动过期,如黑名单 ip 或限速标记在指定时间后由内核自动删除,无需脚本干预或重启;创建时需声明 flags timeout,添加元素时指定 timeout 值,已存在则刷新剩余时间。

nftables 本身没有“自我消亡”这种拟人化能力,但它的 set 元素 timeout 机制,能让黑名单、限速标记、临时封禁等规则在指定时间后自动失效——不需脚本清理、不需人工干预、不依赖外部调度。这种“到期即删”的行为,就是最贴近“自我消亡”的实用实现。
利用 timeout 集合实现自动过期封禁
nftables 原生支持带超时的命名集合(flags timeout),元素加入时可指定存活时长,超时后内核自动移除,无需重启或重载规则。
创建一个 IPv4 黑名单集合,所有元素默认 10 分钟后自动消失:
sudo nft add set ip filter tempban { type ipv4_addr; flags timeout; }在 input 链开头插入匹配规则(越靠前优先级越高):
sudo nft add rule ip filter input ip saddr @tempban drop封禁某个 IP 并设定 30 分钟有效期(原子操作,毫秒级生效):
sudo nft add element ip filter tempban { 203.0.113.45 timeout 30m }
✅ 优势:超时由内核直接管理,即使系统重启,只要规则集加载,该集合仍保持 timeout 属性;添加/删除元素不会影响其他规则运行。
构建“自我消亡”的速率限制标记
单纯限速(如 limit rate 5/minute)无法记忆状态,但结合 meter + timeout set 可实现带记忆的自动衰减防护。
创建一个带超时的 meter 标记集合(用于记录触发过限速的源 IP):
sudo nft add set ip filter ratehit { type ipv4_addr; flags timeout; }定义限速器并关联标记动作:
sudo nft add rule ip filter input tcp dport 22 meter ssh_mtr { ip saddr limit rate 5/minute burst 10 } @ratehit add @ratehit { ip saddr } timeout 5m后续规则可基于
@ratehit进行强化拦截:sudo nft add rule ip filter input ip saddr @ratehit tcp dport 22 drop
⚠️ 注意:
meter触发后往@ratehit添加元素,该元素 5 分钟后自动消失,封禁随之解除——整个过程无外部依赖,纯内核驱动。
配合日志实现“感知—响应—自毁”闭环
自动过期不是孤立功能,它需要与日志联动才能形成动态闭环。
给可疑连接打日志标签:
sudo nft add rule ip filter input tcp dport 22 ct state new log prefix "ssh-new: " level warn用 ulogd2 或轻量 Python 脚本监听 nflog,检测连续失败后执行:
nft add element ip filter tempban { 198.51.100.12 timeout 1h }不写定时任务清理,因为
timeout 1h已确保 1 小时后该 IP 自动从集合中消失,规则自然失效。
? 效果:一次封禁 = 一次写入 + 内核倒计时 + 到期静默清除,全程无人值守。
关键细节提醒
- timeout 最小单位是秒,支持
s/m/h/d,例如timeout 90s、timeout 2h - 集合必须声明
flags timeout,否则timeout参数会被忽略 -
add element时若元素已存在,会刷新其剩余存活时间(即“续命”) -
nft list set ...可查看当前存活元素及剩余时间,便于调试
不复杂但容易忽略。











