nftables set timeout 自动清理临时地址的配置
如果临时封禁地址直接写进一条永久规则,最容易出现两个问题:封禁结束后忘记删除,或者为了清理地址再额外维护一套定时任务。nftables 的命名集合可以把地址从规则中拆出来,再用 timeout 给集合元素设置寿命。元素到期后不再参与集合匹配,清理动作由 nftables 的集合机制负责。
官方地址:https://wiki.nftables.org/
本文只讨论 IPv4 临时地址集合:集合默认存活时间、单个地址的覆盖时长、输入链引用、生命周期观察,以及如何把静态规则和动态地址分开。示例中的地址与时长都是说明值,不代表已经在某台机器上执行。
先分清 timeout、expires 和规则匹配
timeout 是集合或元素使用的时长配置;expires 是当前元素还剩多久的倒计时。创建集合时可以设置一个默认 timeout,添加某个地址时也可以显式指定该地址的 timeout。规则只负责引用集合,例如 ip saddr @temporary_block;它不负责逐个删除到期地址。
| 对象 | 作用 | 生产上要关注什么 |
|---|---|---|
| 命名集合 | 保存可动态更新的地址 | 名称和类型要稳定,供规则引用 |
| 集合 timeout | 为未单独指定时长的元素提供默认值 | 控制临时地址的最长预期寿命 |
| 元素 timeout | 覆盖某个地址的默认时长 | 用在不同风险等级或不同来源的临时封禁上 |
| expires | 展示当前倒计时 | 它会减少,不能当成固定配置保存回配置文件 |
需要特别注意:重新加载一份只包含静态集合定义的规则文件,可能会改变或覆盖运行时动态元素。动态地址与静态防火墙骨架最好分开管理,并在发布前决定是否允许重载清空临时状态。

创建带 timeout 的 IPv4 命名集合
先创建一个可命名、可更新的集合。集合类型写成 ipv4_addr,flags timeout 表示元素允许带超时;timeout 10m 是未单独指定时的默认寿命。集合名要短且稳定,因为后续规则会使用这个名字。
# 创建独立表,避免把示例集合混入已有业务表。
nft add table inet temporary_guard
# 用分号结束集合属性;默认元素 10 分钟后失效。
nft 'add set inet temporary_guard temporary_block { type ipv4_addr; flags timeout; timeout 10m; }'
# 验证集合的静态定义,重点看 type、flags 和 timeout。
nft list set inet temporary_guard temporary_block
如果系统已经有同名表或集合,不要盲目重复执行创建命令。生产脚本应先明确“首次安装”和“更新已有规则”两条路径:首次安装可以创建对象,更新路径则应使用预期的配置管理方式,避免把重复对象错误解释成地址清理失败。
集合的默认 timeout 只影响之后添加且没有单独指定时长的元素。它不是“每十分钟清空整个集合”的定时器,也不会改变输入链本身的匹配语义。
把集合接入输入链,再添加临时地址
集合创建后,还需要一条规则引用它。下面的示例创建一个输入链,并让集合中的源地址被丢弃;随后添加一个使用默认 10 分钟寿命的地址,再添加一个只保留 90 秒的高优先级临时地址。
# 建立带 input hook 的链;priority 设为 0,便于在示例中明确顺序。
nft 'add chain inet temporary_guard input { type filter hook input priority 0; policy accept; }'
# 集合命中时丢弃来源地址,未命中流量仍按链的默认策略处理。
nft add rule inet temporary_guard input ip saddr @temporary_block counter drop
# 未指定时长的元素使用集合默认 timeout=10m。
nft add element inet temporary_guard temporary_block { 192.0.2.10 }
# 为单个地址设置更短的 90 秒寿命,覆盖集合默认值。
nft add element inet temporary_guard temporary_block { 192.0.2.11 timeout 90s }
这里的 counter 只是帮助观察规则是否被命中,不是 timeout 的实现依赖。若临时地址来自自动化系统,应让自动化系统只负责提交地址和业务原因,集合本身负责到期删除;不要同时再启动一个“按分钟扫描并删除”的清理器。
临时封禁前要确认地址来源是可信的内部判定结果。示例使用文档保留地址,避免把真实用户地址或敏感网络拓扑写进文章和配置。
用 list 观察元素是否正在倒计时
查看集合时,元素通常会同时展示它的 timeout 和 expires。前者是加入时采用的寿命配置,后者是当前剩余时间。不要把一次 list 输出中的 expires 值复制回持久化文件,因为它是随时间变化的运行时状态。
# 查看集合与元素倒计时;输出中的 expires 会随时间减少。 nft list set inet temporary_guard temporary_block # 需要脚本消费时使用 JSON 输出,避免依赖普通文本的列对齐。 nft --json list set inet temporary_guard temporary_block
静态说明上可以这样判断:如果元素仍在集合里,输入链引用它时仍会命中;倒计时结束后,元素会被移出集合,后续同一来源地址不再因为这条集合规则命中。这个过程不等于连接跟踪表的超时,也不等于 TCP 会话被主动断开。

生产配置的权限、日志与持久化边界
生产环境建议把“谁能修改集合”和“谁能修改完整防火墙策略”分开。能执行 nft add element 的身份原则上也能改变临时封禁范围,因此不要把该权限无条件授予普通业务进程;更稳妥的是由一个受控服务接收经过鉴权的事件,再由最小权限的执行单元更新集合。
日志方面,集合元素自身的到期不天然等于一条业务审计事件。如果需要追溯“为什么封禁、由谁添加、何时解除”,应在调用 nft 命令的自动化入口记录事件 ID、地址、原因、申请者和预期时长;不要把 expires 的展示值当作审计时间戳。
持久化时,把静态规则骨架和运行时临时集合分成两层:
- 静态层保存表、链、策略和集合定义,变更前做文本审阅。
- 运行时层只添加或删除临时元素,保留调用记录和幂等键。
- 重载静态层前先说明是否保留运行时集合;不要用一次全量 flush 代替有范围的变更。
- 回滚时先恢复静态规则,再决定是否清空临时地址,避免把安全策略和业务状态混成一次操作。
# 发布前先列出目标表,避免在错误的 family 或 table 上操作。
nft list table inet temporary_guard
# 发布脚本只做有范围的元素删除,不把整张表作为清理目标。
nft delete element inet temporary_guard temporary_block { 192.0.2.10 }
# 回滚前保留规则快照;这里的输出应由发布系统写入受控审计目录。
nft list ruleset
发布前检查清单与常见问题
上线这类临时集合时,可以用下面的顺序减少误操作:
- 确认集合类型是
ipv4_addr,且规则引用的集合名称完全一致。 - 确认集合启用了
flags timeout,默认 timeout 与业务封禁时长匹配。 - 对一个测试地址使用短 timeout,观察
expires是否出现并自然消失。 - 确认删除集合元素不会误删表、链或其它业务集合。
- 确认持久化重载策略不会在没有告警的情况下清空仍需保留的运行时状态。
为什么添加了地址,却没有看到 expires?
常见原因是集合没有开启 flags timeout,或者实际添加的不是预期集合。先用 nft list set 查看集合定义,再确认添加命令使用了相同的 family、table 和 set 名称。
把 expires 写入配置文件能让倒计时继续吗?
不能把它当作固定配置。expires 是观察时刻的剩余时间;配置文件应记录业务允许的 timeout,运行时元素则由自动化入口重新添加。需要跨重启保留临时状态时,应明确记录原始加入时间和剩余策略,再由受控程序恢复,而不是直接复制一次 list 输出。
timeout 到期会主动断开已经建立的连接吗?
不会把集合元素 timeout 等同于连接跟踪或已建立连接的生命周期。它控制的是该地址是否仍在集合中、是否继续命中引用集合的规则;连接是否结束取决于其它防火墙规则和协议状态。
小结:用命名集合承载临时 IPv4 地址,用 flags timeout 开启元素寿命,用集合默认 timeout 覆盖常规场景,再用单元素 timeout 处理例外。输入链只引用集合,自动化入口负责鉴权和审计,发布系统负责把静态规则与运行时状态分层管理,这样临时地址到期后能自然失效,也不容易被一次重载或误删操作扩大影响。
tar 保留 xattr 与 ACL 的归档迁移清单
- 上一篇
- tar 保留 xattr 与 ACL 的归档迁移清单
- 下一篇
- rsync --partial 保留中断文件并控制重传的方法
-
- 文章 · linux | 24分钟前 |
- /proc/self/fd 读取进程已打开文件的排查方法
- 494浏览 收藏
-
- 文章 · linux | 26分钟前 |
- udev 规则按硬件属性固定设备名称的实现
- 287浏览 收藏
-
- 文章 · linux | 26分钟前 | ssh · Linux SSH 连接复用 ControlMaster ControlPath ControlPersist
- SSH ControlMaster 复用连接并限制共享范围的方法
- 176浏览 收藏
-
- 文章 · linux | 48分钟前 |
- journalctl --after-cursor 从指定位置继续读取日志
- 358浏览 收藏
-
- 文章 · linux | 48分钟前 | Linux · 服务管理 · systemd Linux服务 Restart=on-failure SuccessExitStatus
- systemd.service SuccessExitStatus 自定义正常退出码的配置方法
- 289浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 1015次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 1019次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1144次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1119次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 960次使用
-
- Go HTTP 出站请求如何防 SSRF:URL 解析、内网地址拦截与重定向复核
- 2026-08-10 275浏览
-
- Go tls.ClientHelloInfo.Conn 该放在哪里:QUIC 握手连接的取值边界
- 2026-09-03 498浏览
-
- Go crypto/tls设置最低 TLS 版本的配置边界
- 2026-09-15 321浏览
-
- Go x509.CertPool.AppendCertsFromPEM 怎样加载 PEM 证书
- 2026-10-28 193浏览
-
- Mac 启动go run main.go 总是弹出警告
- 2023-01-08 273浏览

