nftables set 地址怎么配置或排查
来源:17golang原创
时间:2026-09-13 13:24:21 449浏览 收藏
我在 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 确认,不要盲目重复创建。

添加地址并确认规则确实引用了 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 的 type | IPv4、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/优先级和前面的终止性规则。这个顺序能避免把集合问题误诊成网络问题。

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。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
233 收藏
-
344 收藏
-
文章 · linux | 4小时前 | Linux · systemd · 服务器运维 · 日志排查 · journalctl · journalctl启动筛选 journalctl查看上一次启动 journalctl -b -1 systemd日志按启动过滤 Linux启动日志排查222 收藏
-
402 收藏
-
197 收藏
-
345 收藏
-
420 收藏
-
186 收藏
-
245 收藏
-
456 收藏
-
435 收藏
-
492 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习