当前位置:首页 > 文章列表 > 文章 > linux > nftables set 地址怎么配置或排查

nftables set 地址怎么配置或排查

来源:17golang原创 2026-09-13 13:24:21 0浏览 收藏

我在 nftables 里处理一组白名单地址时,最容易误判的不是命令本身,而是“集合已经存在”和“规则真的引用了它”被混成了一件事。地址集合要先挂在正确的 table 上,元素类型要和匹配表达式一致,规则里还要用 @集合名 引用。

最稳妥的排查顺序是:先看 table 和 set 的定义,再看元素,再看规则引用,最后才查防火墙链路。IPv4 地址集合通常定义为 type ipv4_addr,规则匹配则写成 ip saddr @trusted_hosts
要点速览
  • named set 可以独立增删元素;匿名集合只能跟随规则改写。
  • 集合所在的 family、元素类型和规则表达式必须对齐。
  • nft list set 看定义和内容,nft get element 适合核对一个地址。

先把地址集合定义在正确的 table 中

下面用 inet 表承载一组 IPv4 白名单。它只是配置示例,不代表已经在某台机器上执行;生产环境应先确认现有规则不会被覆盖。

# 创建一个同时支持 IPv4/IPv6 规则的表,并定义 IPv4 地址集合
nft add table inet filter
nft add set inet filter trusted_hosts { type ipv4_addr\; comment "可信来源地址"\; }

# 查看集合的定义、类型和当前元素
nft list set inet filter trusted_hosts

这里的 trusted_hosts 是 named set,所以后续可以独立添加和删除地址。type ipv4_addr 只接受 IPv4 地址或 IPv4 网段;如果规则写的是 ip6 saddr,就应另建 type ipv6_addr 的集合。若系统已存在同名 table 或 set,先用 list tableslist sets 确认,不要盲目重复创建。

nftables inet filter 中 trusted_hosts IPv4 地址集合定义关系示意图
图1:nftables 地址集合定义的静态关系示意图,不是实际运行截图。

添加地址并确认规则确实引用了 set

定义完成后,元素管理和规则引用分开处理。一个地址、多个地址和网段都可以放进同一个集合;规则侧使用 @ 而不是把集合名当普通字符串。

# 向 named set 添加单个地址和一个网段
nft add element inet filter trusted_hosts { 192.0.2.10 }
nft add element inet filter trusted_hosts { 198.51.100.0/24 }

# 将集合引用到输入链;注释说明这条规则保护的范围
nft add chain inet filter input
nft add rule inet filter input ip saddr @trusted_hosts accept comment "允许可信来源"

排查时先看三处输出:nft list set inet filter trusted_hosts 是否有地址,nft list chain inet filter input 是否出现 @trusted_hosts,以及规则是否位于实际经过的链。只看到集合存在,并不能说明数据包已经命中它。

现象优先检查常见原因
添加时报类型错误set 的 typeIPv4、IPv6 或端口类型写错
集合有地址但规则不生效规则表达式和链没有使用 @set,或流量没有经过该链
想删一个地址却删不掉地址的精确写法添加的是网段,删除时却写成单个主机

用 list、get 和 flush 缩小排查范围

list set 适合看整体,get element 适合核对一个元素。需要清空集合时用 flush set,它会保留集合定义但移除其中元素;误用 delete set 则会连集合本身一起删除。

# 精确查询一个地址是否位于集合中;地址必须符合集合类型
nft get element inet filter trusted_hosts { 192.0.2.10 }

# 删除一个元素,保留 set 和引用它的规则
nft delete element inet filter trusted_hosts { 192.0.2.10 }

# 清空元素但保留集合结构;执行前确认这不是线上白名单
nft flush set inet filter trusted_hosts

如果 get element 查不到地址,先修元素而不是改规则;如果能查到而规则仍无效,再检查地址族、源地址是否被 NAT 改写、链的 hook/优先级和前面的终止性规则。这个顺序能避免把集合问题误诊成网络问题。

nftables list set get element flush set 与规则引用的排查边界示意图
图2:nftables 集合排查中定义、元素和规则引用的静态边界图。

interval、timeout 和持久化配置别混用

需要保存连续地址范围时,可以在集合创建时声明 flags interval;需要让元素自动过期时使用 flags timeout。两者解决的是不同问题,不要为了“功能更全”随意叠加 flag;也不要把动态更新场景和只读常量集合混在一起。

table inet filter {
    # interval 适合表达连续地址范围,元素仍按 IPv4 解析
    set office_ranges {
        type ipv4_addr
        flags interval
        elements = { 192.0.2.0/24 }
    }

    # 规则使用 @ 名称引用集合;配置可由 nft -f 文件加载
    chain input {
        type filter hook input priority filter; policy drop;
        ip saddr @office_ranges accept
    }
}

把配置写进文件后,可用 nft -c -f firewall.nft 做语法检查,再按发行版的 nftables 服务方式加载。最后再次执行 nft list ruleset,确认 set 和规则都出现在预期的 family/table 下。

常见问题

nftables set 地址能不能直接写在规则里?

可以,花括号里的匿名集合适合一次性规则;需要后续增删地址时使用 named set,维护更清晰。

为什么 set 里有地址,匹配仍然失败?

重点看规则是否写成 ip saddr @set名、流量是否经过该链,以及地址是否在 NAT 后发生了变化。

删除元素前要不要先 flush?

不需要。删除单个地址用 delete element;只有要清空全部元素并保留集合定义时才使用 flush set

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Lovart只输入一句活动需求能生成到什么程度?Lovart只输入一句活动需求能生成到什么程度?
上一篇
Lovart只输入一句活动需求能生成到什么程度?
Go container/list 出错时怎么排查删除操作
下一篇
Go container/list 出错时怎么排查删除操作
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    112次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    32次使用
  • OpenCompass大模型评测体系详解:功能、使用指南与应用场景
    OpenCompass
    OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
    50次使用
  • AGI-Eval大模型评测平台:权威榜单、数据集与人机协同评测方案
    AGI-Eval
    AGI-Eval是由上海交大等高校联合发布的大模型评测社区,提供公正透明的LLM能力榜单、多领域评测集及Data Studio数据服务,助力AI模型性能评估与NLP科研开发。
    31次使用
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    266次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码