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

相关推荐
茉莉玫瑰花茶11 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
kidwjb12 小时前
信号量在进程中的使用
linux·进程间通信
南京码讯光电技术有限公司13 小时前
工业无线AP选型指南:从WiFi 5到WiFi 6+5G CPE,如何构建全覆盖、零漫游、高可靠的智能工厂网络?
服务器·网络·5g
sulikey14 小时前
个人Linux操作系统学习笔记2 - gcc与库的理解
linux·笔记·学习·操作系统·gcc·
二宝哥14 小时前
Linux虚拟机网络配置
linux·运维·服务器
陳103014 小时前
Linux:进程间通信 和 简单进程池
linux·运维·服务器
jimy115 小时前
改.bashrc,直观地判断本地repo是否有改动
linux·服务器
zt1985q15 小时前
本地部署网页监控工具 Webmonitor 并实现外部访问
运维·服务器·网络·网络协议
愚昧之山绝望之谷开悟之坡15 小时前
什么是Linter?什么是沙箱!
linux·笔记
babytiger15 小时前
Gitea 重安装 + Snap 数据迁移完整流程总结
linux·elasticsearch·gitea