nftables表达式直接读取内核预解析字段实现零拷贝匹配,支持IP地址、协议、端口、MAC、VLAN、ARP、连接状态、标记、时间及随机匹配等多维度结构化规则。

nftables 表达式本身不解析数据包,而是直接读取内核网络栈已解析并缓存的字段,实现零拷贝、低开销的匹配。它通过结构化语法访问链路层到传输层乃至连接跟踪状态的各类属性,覆盖地址、端口、协议、接口、时间、标记等维度。
协议与网络层字段匹配
这是最基础也最常用的匹配方式,字段由内核预填充,无需用户态解析:
-
IP 地址:用
ip saddr或ip6 daddr匹配源/目标 IPv4/IPv6 地址,支持 CIDR(如10.0.0.0/8)、范围(192.168.1.10-192.168.1.20)和单地址 -
协议类型:可写
ip protocol tcp,也可简写为tcp;ICMPv6 使用icmpv6 type nd-neighbor-solicit这类语义化关键字 -
端口与标志位:
tcp dport {22, 80, 443}支持集合;tcp flags & (syn | ack) == syn可精准识别 TCP 握手首包
链路层与 VLAN 属性匹配
在桥接或虚拟化场景中,需深入以太网帧层面:
-
MAC 地址:用
ether saddr aa:bb:cc:dd:ee:ff或ether daddr匹配源/目标 MAC;ether type ip可过滤 IPv4 帧 -
VLAN 标签:需确保接口启用
reorder_hdr off才能访问原始标签;支持vlan id 100、vlan pcp 5、vlan dei 1等字段,嵌套 VLAN 可用vlan id 10+inner vlan id 100 -
ARP 字段:如
arp saddr ip 192.168.1.1或arp operation request,适用于局域网地址解析控制
元数据与连接状态匹配
这类信息不来自数据包内容,而是内核附加的上下文:
-
接口信息:用
iifname "br0"或oiftype bridge区分物理/虚拟接口;iif/oif基于内核索引,更稳定但需查ip link -
连接跟踪状态:
ct state established放行已有连接;ct original ip saddr 172.16.0.5可追溯 NAT 前源地址 -
标记与优先级:
meta mark 0x100匹配路由或 QoS 标记;meta priority 1对应 TOS/DSCP 值(如 VoIP 流量常用ip tos 0xb8)
高级动态匹配能力
表达式支持运行时计算与策略联动,提升规则灵活性:
-
速率限制:结合
limit rate 10/minute burst 5防暴力扫描;rate 1 mbytes/second控制带宽 -
时间窗口:
time hour 9-17或time day {mon, tue, wed}实现时段管控 -
随机匹配:
meta random 0.1实现 10% 概率丢包,用于采样或灰度测试

















