nftables 不支持 shell 变量,但提供 define 命名常量、集合(sets)和表达式实现安全复用与精细控制;define 用于固定值替换,sets 支持动态多值匹配,表达式组合匹配与动作。

nftables 规则编写中不支持传统 Shell 变量(如 $PORT)的直接展开,但提供原生、安全、可维护的变量机制——通过 命名常量(定义为变量)和集合(sets) 实现复用与动态表达,配合丰富表达式完成精细匹配与动作控制。
变量:用 define 定义命名常量,提升可读性与一致性
nftables 脚本支持 define 语句声明符号常量,仅在脚本解析阶段替换,不涉及运行时求值,无安全风险。
- 语法简洁:
define ssh_port = 22,后续可用$ssh_port引用 - 适用场景:端口号、IP 地址段、协议名等固定值复用
例如:define lan_net = 192.168.10.0/24,再写ip saddr $lan_net accept - 注意:变量必须在使用前定义;不能在命令行交互模式中定义,仅限 nft 脚本文件(.nft)或
nft -f加载方式
表达式:组合匹配条件与动作,构成规则核心逻辑
每条规则由一个或多个 表达式(expressions) 组成,分为匹配类(左值)和动作类(右值),按顺序执行。
-
匹配表达式:提取数据包字段并比对,如
tcp dport 22、ip protocol icmp、meta iifname "eth0" -
关系操作符 支持
==、!=、&(位与)、~(掩码匹配),例如:tcp flags & (fin | syn) == (fin | syn) -
动作表达式(statements) 可链式书写,如一条规则可同时
counter计数 +log prefix "SSH:"+accept - 特殊表达式如
ct state established,related依赖连接跟踪,ip saddr @trusted_hosts引用集合
集合(sets):实现高效、可更新的多值匹配
集合是 nftables 中最实用的“动态变量”,支持运行时增删元素,且底层使用高效数据结构(hash / rbtree),匹配性能远超多条重复规则。
- 定义集合:
add set inet filter trusted_ips { type ipv4_addr\; } - 添加元素:
add element inet filter trusted_ips { 10.0.1.5, 192.168.0.0/16 } - 在规则中引用:
ip saddr @trusted_ips accept - 支持带超时的匿名集合(timeout)、映射(maps)做 NAT 或标记,例如:
ip daddr . tcp dport @service_map dnat to ip addr . port
实际编写建议:脚本化 + 类型明确 + 分层组织
避免零散命令拼凑,推荐使用 .nft 脚本统一管理:
- 开头用
#!/usr/sbin/nft -f声明解释器 - 用
define抽离配置项,用set管理 IP/端口列表 - 区分表用途(filter / nat / inet),链内规则按“信任优先→服务开放→限制放行→默认拒绝”顺序排列
- 所有表达式尽量显式指定类型(如
ip protocol tcp而非仅tcp),避免歧义











