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 tcp 或 tcp |
匹配传输层协议,可直接用协议名简写 |
| 源/目标端口 | 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 |
从当前链返回上一级链 |
总结与使用建议
- 匹配优先级:基础协议匹配 → 接口匹配 → 状态匹配 → 元数据匹配 → 高级匹配,按数据包处理流程从快到慢排列
- 性能优化 :优先使用集合 替代多个
or条件,使用连接状态匹配减少规则遍历 - 调试技巧 :结合
log语句和counter模块,快速定位规则匹配问题 - 兼容性:nftables 兼容大部分 iptables 匹配逻辑,但语法更简洁优雅
nftables 的匹配体系覆盖网络协议栈全层级,从链路层到应用层,从静态字段到动态状态,为构建高效、灵活的防火墙规则提供了全面支持。