Linux nftables 集合如何动态维护封禁地址
Linux 上需要临时封禁某个来源地址时,不必每次都修改整条防火墙规则。更合适的做法是创建一个可命名、可更新的 nftables 集合,让规则只引用这个集合;封禁动作变成向集合添加元素,解除封禁则删除元素。临时事件还可以给元素设置超时时间,到期后由 nftables 自动清理。
官方资料:https://wiki.nftables.org/wiki-nftables/index.php/Sets
动态封禁的关键是“规则稳定、集合变化”:先让 input 链引用@blocked_v4,再用nft add element、nft delete element和元素级timeout管理地址。运行时状态确认无误后,再决定是否写入持久化规则文件。
- 匿名集合绑定在规则上,不能独立增删;动态场景应使用命名集合。
flags timeout允许添加带过期时间的地址,集合级timeout是默认值。- 更新后用
nft list set检查实际集合,持久化配置则要单独维护并测试加载。
先把 nftables 集合和封禁规则拆开
匿名集合通常直接写在规则里,例如把多个端口写进一条匹配表达式。它随着规则创建和删除,不能作为独立对象接受运行时更新。命名集合则有自己的名称和类型,规则可以用 @集合名 引用,集合内容也能单独添加或删除。封禁地址这类会随事件变化的数据,应优先使用后者。
| 对象 | 职责 | 动态维护方式 |
|---|---|---|
| 命名集合 | 保存 IPv4 地址及可选超时时间 | add/delete element |
| input 链规则 | 匹配源地址并执行 drop | 低频变更,保持稳定 |
| 持久化文件 | 定义重启后应恢复的策略 | 改文件后再按系统方式加载 |

创建可被规则引用的 IPv4 封禁集合
下面的示例使用 inet 表,集合只接收 IPv4 地址。集合名应简短;nftables 文档说明命名集合最长为 16 个字符。blocked_v4 还会启用超时能力,后续才能对单个地址设置过期时间。
# 建立承载网络过滤对象的表;重复执行时应由调用方先判断对象是否已存在
sudo nft add table inet edge_filter
# 创建可独立更新的 IPv4 命名集合,并允许元素携带 timeout
sudo nft 'add set inet edge_filter blocked_v4 { type ipv4_addr; flags timeout; timeout 1h; }'
# 让 input 链引用集合;规则稳定后,封禁动作只改集合元素
sudo nft 'add chain inet edge_filter input { type filter hook input priority 0; policy accept; }'
sudo nft add rule inet edge_filter input ip saddr @blocked_v4 counter drop
生产脚本不应无条件重复创建表、集合、链和规则,否则重复执行可能返回对象已存在。可以把初始化与运行时更新分成两个阶段:初始化阶段负责加载完整规则集,事件处理阶段只允许操作集合元素,并把操作者、原因和过期时间写入自己的审计日志。
用 add、delete 和 get element 动态维护地址
集合建立后,封禁一个地址只需要添加元素。解除封禁使用删除命令;查询命令则适合放在自动化任务的回执或人工复盘中。地址来自日志或接口时,先验证 IPv4/CIDR 格式,再拼接 nft 命令,不能把未经校验的字符串直接交给 shell。
# 添加一个临时封禁地址;timeout 只对已启用 timeout 的集合有效
sudo nft add element inet edge_filter blocked_v4 '{ 203.0.113.7 timeout 15m }'
# 查询单个地址是否存在,用于生成明确的更新回执
sudo nft get element inet edge_filter blocked_v4 '{ 203.0.113.7 }'
# 解除封禁;删除元素不会改变 input 链规则
sudo nft delete element inet edge_filter blocked_v4 '{ 203.0.113.7 }'
# 查看集合全量状态,确认地址和剩余超时是否符合预期
sudo nft list set inet edge_filter blocked_v4
如果自动化系统同时收到多次相同封禁事件,应把“已存在”当作可记录的幂等结果,而不是反复改写规则。删除前也要区分地址不存在和命令本身失败。这样才能在告警风暴时保持清晰的成功、忽略和失败三种结果。
临时封禁的 timeout 如何选择
timeout 1h 是集合的默认存活时间;添加元素时写 timeout 15m 可以为单个地址覆盖默认值。gc-interval 用于设置超时元素的垃圾回收检查间隔,只有启用超时能力时才有意义。短暂的爆破拦截适合元素级超时,长期黑名单则不应只依赖临时状态。
| 场景 | 建议 | 需要留意 |
|---|---|---|
| 短时异常流量 | 添加元素并设置 5–30 分钟超时 | 回源任务必须记录过期时间 |
| 重复攻击来源 | 延长元素超时或转入长期名单 | 避免自动续期掩盖误封 |
| 业务白名单误封 | 先删除元素,再确认集合查询结果 | 不要只删除持久化文件中的一行 |

把运行时状态和重启后的配置分开管理
命令行添加的集合元素属于当前规则集;服务器重启后是否恢复,取决于系统加载的 nftables 配置文件和服务方式。若封禁是临时响应,就应把事件记录到外部审计或工单系统,而不是把每个短期地址永久写入配置。若地址需要长期生效,则应更新声明式配置,先在隔离环境加载,再按系统约定启用。
排查“命令成功但流量仍然通过”时,按这份清单缩小范围:第一,确认访问流量进入的是同一个 inet edge_filter input 链;第二,用 nft list set 确认地址类型和集合元素;第三,检查规则计数器是否增长;第四,确认前置规则没有提前 accept,也没有把地址解析成另一种族类型。nftables 集合解决的是匹配数据的维护,不会替代整套链路策略设计。
常见问题
为什么直接修改匿名集合不能动态封禁?
匿名集合绑定在规则上,规则移除后集合也随之释放,不能作为独立对象更新。需要运行时增删时,应先创建命名集合,再让规则引用它。
元素 timeout 到期后还要手动 delete 吗?
正常情况下不需要,超时元素会被清理;但业务审计仍应记录原始事件和过期时间。若要立即解除封禁,仍可显式删除元素。
只改 nftables.conf 能马上解除当前封禁吗?
不一定。配置文件是持久化来源,当前内核规则集可能仍保留旧元素。解除后应直接检查当前集合,并按系统方式重新加载配置。
把封禁地址放进命名集合,规则就能保持稳定,自动化任务也只需要维护集合元素。真正上线前,再补上输入校验、幂等回执、审计记录和持久化加载测试,动态封禁才不会变成另一套难以排查的临时规则。
Python importlib.resources.as_file 的临时路径何时失效
- 上一篇
- Python importlib.resources.as_file 的临时路径何时失效
- 下一篇
- 用 iter.Seq2 统一处理键值对过滤与转换
-
- 文章 · linux | 7小时前 | Linux · memory.events Linux cgroup v2 memory.events.local cgroup内存事件 OOM定位
- Linux cgroup v2 的 memory.events.local 怎样区分本组事件
- 180浏览 收藏
-
- 文章 · linux | 9小时前 | Linux · 性能监控 · Pressure Stall Information poll Linux PSI POLLPRI 资源压力
- Linux PSI 触发器如何在压力超过阈值时通知进程
- 331浏览 收藏
-
- 文章 · linux | 11小时前 |
- systemd socket 的 Accept=yes 如何启动实例化服务
- 386浏览 收藏
-
- 文章 · linux | 13小时前 | Linux · 最小权限 StateDirectory systemd 服务 systemd DynamicUser 动态用户
- systemd DynamicUser 如何运行无固定账号的服务
- 261浏览 收藏
-
- 文章 · linux | 16小时前 | cgroup v2 memory.max Linux OOM OOM Killer oom_score
- OOM Killer 选择了哪个进程:分数、限制与证据收集
- 233浏览 收藏
-
- 文章 · linux | 19小时前 |
- ext4 与 XFS 在线扩容前后分别要核对什么
- 179浏览 收藏
-
- 文章 · linux | 21小时前 | 容器 · Linux · 容器隔离 mount namespace PID namespace linux namespace network namespace
- 用 namespace 理解容器进程、网络与挂载隔离
- 268浏览 收藏
-
- 文章 · linux | 23小时前 | Linux · 文件描述符 ·
- 日志轮转后服务仍写旧文件,文件描述符发生了什么
- 490浏览 收藏
-
- 文章 · linux | 1天前 | 运维 · SSH Linux安全 sshd_config 服务加固 密钥登录
- SSH 只允许密钥登录后还要收紧哪些服务边界
- 297浏览 收藏
-
- 文章 · linux | 1天前 | Linux ·
- Linux 负载高但 CPU 空闲,怎样区分 I/O 等待与锁等待
- 398浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 387次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 468次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 475次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 419次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 243次使用
-
- Linux vmstat 如何分辨内存抖动与磁盘等待:si、so、wa 与复测顺序
- 2026-08-30 501浏览
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览

