nftables 添加规则时支持的匹配条件与语句全解

nftables 的匹配体系以表达式(expressions) 为核心,支持从基础协议字段到高级连接状态、元数据、时间窗口等全维度匹配,配合集合、映射等高效结构实现复杂过滤逻辑。以下按类别系统梳理所有常用匹配条件与语句,附实操示例。


一、基础协议与地址端口匹配(核心匹配)

这是最常用的基础匹配,直接针对网络协议头字段进行过滤,无需额外模块加载。

匹配类型 关键字 示例 说明
地址族匹配 ip/ip6/inet/arp/bridge ip saddr 192.168.1.0/24 限定IPv4/IPv6/双栈/ARP/桥接流量
源/目标地址 saddr/daddr ip6 daddr 2001:db8::/32 匹配IP层源/目标地址,支持单个IP、CIDR、范围
传输协议 protocol/tcp/udp/icmp/icmpv6 ip protocol tcptcp 匹配传输层协议,可直接用协议名简写
源/目标端口 sport/dport tcp dport { 22, 80, 443 } 匹配TCP/UDP端口,支持单端口、范围、集合
ICMP类型 type/code icmp type echo-request 匹配ICMP消息类型(如ping请求/响应)

示例:放行来自192.168.1.0/24网段的SSH和HTTP流量

bash 复制代码
nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport { 22, 80 } accept

二、网络接口匹配(链路层上下文)

针对数据包的入站/出站接口进行匹配,适用于多网卡环境的流量分流。

匹配类型 关键字 示例 说明
入站接口名 iifname iifname "eth0" 精确匹配入站接口(如eth0、wlan0)
出站接口名 oifname oifname "eth1" 精确匹配出站接口
接口类型 iiftype/oiftype iiftype ethernet 匹配接口类型(ethernet、bridge、loopback等)
接口索引 iif/oif iif 1 匹配接口内核索引(通过ip link查看)

示例:仅允许lo接口的本地流量

bash 复制代码
nft add rule inet filter input iifname "lo" accept

三、连接状态匹配(ct 模块)

基于Netfilter连接跟踪(conntrack)系统,匹配数据包所属连接的状态,是状态防火墙的核心能力。

状态值 说明 示例
new 新连接的第一个数据包 ct state new
established 已建立连接的后续数据包 ct state established
related 与现有连接相关的辅助连接(如FTP数据连接) ct state related
invalid 无效连接(如无状态SYN-ACK) ct state invalid
untracked 未被连接跟踪的数据包 ct state untracked

示例:放行已建立和相关连接,拒绝无效连接

bash 复制代码
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop

四、元数据匹配(meta 模块)

匹配数据包的内核元数据,包括标记、优先级、数据包类型等系统级属性。

元数据类型 关键字 示例 说明
数据包标记 mark meta mark 0x1 匹配内核nfmark标记(用于策略路由/分类)
数据包优先级 priority meta priority 0 匹配服务类型(TOS)字段
数据包类型 pkttype meta pkttype host 匹配数据包类型(host/broadcast/multicast)
协议族 nfproto meta nfproto ipv4 匹配网络协议族(ipv4/ipv6)
用户ID uid meta uid 1000 匹配本地生成数据包的用户ID
组ID gid meta gid 100 匹配本地生成数据包的组ID

示例:标记所有HTTP流量并放行

bash 复制代码
nft add rule inet filter input tcp dport 80 meta mark set 0x1 accept

五、高级匹配条件(扩展功能)

5.1 时间匹配(time 模块)

按时间窗口过滤流量,支持绝对时间和周期性时间匹配。

时间类型 关键字 示例
绝对时间范围 time time "2026-04-28 09:00-18:00"
周期性时间 hour/minute/weekday hour "9-18" weekday "1-5"

示例:仅工作日工作时间允许SSH访问

bash 复制代码
nft add rule inet filter input tcp dport 22 hour "9-18" weekday "1-5" accept

5.2 集合匹配(set 结构)

高效匹配多个元素(IP/端口/协议等),支持动态更新,比多个or条件更高效。

集合类型 定义示例 匹配示例
匿名集合 { 22, 80, 443 } tcp dport { 22, 80, 443 }
命名集合 add set inet filter web_ports { type inet_service; elements = { 80, 443 } } tcp dport @web_ports

示例:使用命名集合管理常用Web端口

bash 复制代码
nft add set inet filter web_ports { type inet_service; elements = { 80, 443, 8080 } }
nft add rule inet filter input tcp dport @web_ports accept

5.3 计数器与统计(counter 模块)

统计匹配数据包的数量和字节数,用于流量监控和调试。

示例:统计所有出站HTTP流量

bash 复制代码
nft add rule inet filter output tcp dport 80 counter accept

5.4 日志记录(log 模块)

记录匹配数据包的详细信息到系统日志,用于审计和故障排查。

示例:记录所有被拒绝的SSH连接尝试

bash 复制代码
nft add rule inet filter input tcp dport 22 log prefix "SSH REJECT: " drop

5.5 速率限制(limit 模块)

限制匹配流量的速率,防止DoS攻击或流量过载。

速率类型 示例 说明
每秒限制 limit rate 10/second 每秒最多10个数据包
每分钟限制 limit rate 600/minute 每分钟最多600个数据包
突发限制 limit rate 10/second burst 5 允许突发5个数据包

示例:限制ICMP请求速率防止ping泛洪

bash 复制代码
nft add rule inet filter input icmp type echo-request limit rate 10/second accept

5.6 FIB 路由匹配(fib 模块)

查询内核路由表(FIB)信息,基于路由结果进行匹配。

示例:匹配目标地址路由到eth0接口的流量

bash 复制代码
nft add rule inet filter forward fib daddr oif "eth0" accept

六、匹配组合与逻辑运算

nftables 支持丰富的逻辑运算,实现复杂匹配条件组合:

逻辑操作 关键字 示例 说明
逻辑与 空格分隔 tcp dport 80 ip saddr 192.168.1.0/24 同时满足多个条件
逻辑或 , 分隔 ct state new,related 满足任一条件
逻辑非 ! ! tcp dport 22 不满足指定条件
括号分组 () (tcp dport 80 or tcp dport 443) and ip saddr 192.168.1.0/24 改变运算优先级

示例:拒绝非SSH且非Web流量的新连接

bash 复制代码
nft add rule inet filter input ct state new ! (tcp dport { 22, 80, 443 }) drop

七、特殊匹配语句(动作类匹配)

这类语句兼具匹配和操作功能,用于修改数据包属性或执行特定动作:

语句类型 关键字 示例 说明
数据包标记 meta mark set meta mark set 0x1 设置数据包nfmark标记
NAT转换 dnat/snat/masquerade tcp dport 8080 dnat to 192.168.1.100:80 目标/源地址转换
重定向 redirect tcp dport 80 redirect to 8080 重定向到本地端口
跳转链 jump jump my_custom_chain 跳转到自定义链执行规则
返回 return return 从当前链返回上一级链

总结与使用建议

  1. 匹配优先级:基础协议匹配 → 接口匹配 → 状态匹配 → 元数据匹配 → 高级匹配,按数据包处理流程从快到慢排列
  2. 性能优化 :优先使用集合 替代多个or条件,使用连接状态匹配减少规则遍历
  3. 调试技巧 :结合log语句和counter模块,快速定位规则匹配问题
  4. 兼容性:nftables 兼容大部分 iptables 匹配逻辑,但语法更简洁优雅

nftables 的匹配体系覆盖网络协议栈全层级,从链路层到应用层,从静态字段到动态状态,为构建高效、灵活的防火墙规则提供了全面支持。

相关推荐
V我五十买鸡腿1 小时前
网安基础 Windows 和 Linux 那些常用命令
linux·运维·windows
ShineWinsu1 小时前
对于Linux:进程间通信IPC(匿名管道)的解析
linux·c++·面试·进程·通信·管道·ipc
日取其半万世不竭1 小时前
用云服务器部署 Hexo 博客,Nginx 托管静态页面全流程
运维·服务器·nginx
handler011 小时前
进程状态流转的本质:Linux 内核队列与底层数据结构解密
linux·运维·c语言·数据结构·c++·笔记·学习
freshman_y1 小时前
Linux开发中DTS和/proc/device-tree讲解
linux·嵌入式
wang09072 小时前
Linux性能优化之文件系统基础介绍
java·linux·性能优化
F_D_Z2 小时前
【解决办法】Claude报错Unable to connect to Anthropic services无法连接Anthropic
linux·服务器·claude·anthropic
xjxijd2 小时前
无风扇 AI 服务器成主流:英伟达 NVL72 系统引领静音算力革命
大数据·服务器·人工智能
龙智DevSecOps解决方案2 小时前
深度:Perforce P4 MCP 服务器开源解析——当版本控制遇见 AI Agent
运维·服务器·人工智能