nftables 通过 expr 驱动架构与协议感知能力实现复杂协议过滤,支持 osi 2–4 层原生字段解析、多层嵌套匹配、conntrack 深度集成、动态协议识别及 inet 双栈统一处理。

nftables 支持的复杂网络协议过滤与解析机制,核心在于其表达式(Expr)驱动的匹配架构和协议感知能力,而非像 iptables 那样依赖大量协议专用扩展模块。它通过统一的内核引擎 nf_tables 解析数据包各层字段,实现灵活、可组合、低冗余的协议处理。
协议字段的原生解析能力
nftables 内置对常见协议头部字段的直接访问支持,无需加载额外模块。解析基于数据包在协议栈中的实际结构,按 OSI 第2–4层逐层提取:
- 链路层:支持 ether type、ether saddr/daddr(MAC 地址)、vlan id/priority 等
- 网络层:IPv4/IPv6 头部字段完整可用,如 ip protocol、ip saddr/daddr、ip ttl;ipv6 hoplimit、ipv6 nexthdr、ipv6 saddr/daddr
- 传输层:TCP/UDP/ICMP/ICMPv6 字段直接可匹配,例如 tcp dport/sport、tcp flags、udp dport、icmp type/code、icmpv6 type
-
扩展头支持:IPv6 的 hop-by-hop、routing、fragment、destination options 等扩展头可通过
exthdr表达式访问
多层嵌套匹配与协议状态协同
规则可跨协议层组合条件,且能与连接跟踪(conntrack)深度集成,实现语义级过滤:
- 一条规则可同时匹配
ip protocol tcp+tcp dport 443+ct state established,精准识别已建立的 HTTPS 连接 - 支持
payload表达式进行任意偏移解析,适用于自定义协议或应用层特征(如 TLS ClientHello 中的 SNI 域名前缀) -
ct表达式不仅支持 basic state(new/established/related),还可匹配 conntrack 层级元数据:ct mark、ct label、ct original src/dst、ct expiration - 结合
meta表达式,可关联网络接口(iif/oif)、路由信息(ip route oifname)、甚至 socket 层属性(skuid、skgid)
动态协议识别与映射机制
面对非标准端口或协议混淆场景,nftables 提供超越端口匹配的识别手段:
- 协议映射(map):将端口→协议类型做动态映射,例如把 8080 映射为 http,再基于该标签施加 http 特定策略
- 集合(set)+ lookup:构建包含协议指纹的 IP:PORT → proto 映射集,配合 payload 提取 TCP/UDP 载荷特征进行哈希查找
-
ct helper 关联:启用 FTP/SIP/IRC 等 ALG(Application Layer Gateway)后,conntrack 可自动识别并标记辅助连接,nftables 规则可直接匹配
ct helper "ftp" -
字节级 payload 匹配:用
payload ip protocol 0x06或正则式@nh,12,16 == 0x48545450("HTTP" ASCII)实现简单应用层识别
inet 家族统一双栈与协议抽象
通过 inet 协议族,nftables 在单条规则中自然兼容 IPv4 和 IPv6,避免重复配置:
- 同一 chain 可同时处理 ip 和 ip6 流量,例如
nft add chain inet filter input '{ type filter hook input priority 0; }' - 地址匹配自动适配:
ip saddr 192.168.1.0/24仅作用于 IPv4,ip6 saddr fe80::/10仅作用于 IPv6,而ip saddr或ip6 saddr可混用在同一规则集中 - 协议字段统一命名:tcp、udp、icmp、icmpv6 等关键字在 inet 表中均有效,无需切换表或链
- 避免协议分裂导致的规则膨胀,显著简化双栈防火墙维护











