当前位置:首页 > 文章列表 > 文章 > 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 tables、list 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推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    765次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    764次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    845次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    815次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    642次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码