要实现nftables硬件卸载需满足:内核≥5.10且启用CONFIG_NF_FLOW_TABLE_HW、网卡驱动支持flow offload(如Mellanox CX-4+、Intel E810)、flowtable显式配置flags offload并挂载ingress hook、forward链用flow offload @name引导established/related连接,且避免NAT/payload修改等禁用动作。

要利用 nftables 的硬件卸载加速技术实现高并发低延迟转发,核心是让数据包绕过内核协议栈,在网卡硬件层面直接完成转发决策。这需要软硬协同:内核支持、驱动兼容、nftables 配置正确,并且流量模式匹配卸载条件。
确认硬件与内核是否支持卸载
不是所有网卡都支持 flowtable 硬件卸载。目前主流支持的有 Mellanox ConnectX-4 及以上、Intel E810、Broadcom BCM57414 等带 SR-IOV 或 Flow Director 功能的 NIC。需验证以下三点:
- 内核版本 ≥ 5.10(推荐 ≥ 6.1),且编译时启用了 CONFIG_NF_FLOW_TABLE_HW
- 网卡驱动已加载并报告支持 offload,例如运行 ethtool -k eth0 | grep flow 显示 flow-based-tcp-offload: on
- 检查 sysfs:读取 /sys/class/net/eth0/device/feature_support,确认含 flow_table_offload
配置支持硬件卸载的 flowtable
flowtable 必须显式启用 flags offload,且挂载在 ingress hook 上。注意接口必须双向参与转发(如网关场景中的内外网口都要列入):
- 定义 flowtable 时指定 flags offload,不可省略
-
devices 列表必须包含该流进出的所有物理接口(例如
devices = { eth0, eth1 }) - priority 建议设为 -200(比常规 ingress chain 更早执行),确保硬件查表优先于软件规则
- 避免在 flowtable 同一设备上混用软件 flowtable 和硬件 flowtable
匹配并触发硬件卸载的流量规则
仅有 flowtable 不够,还需在 forward 链中用 flow offload @<name> 明确引导符合条件的连接进入该表。关键约束如下:
- 只对 ct state established, related 的连接生效;新建连接(new)仍走慢路径
- 协议限制:当前硬件卸载主要支持 IPv4/TCP 和 IPv4/UDP 流量(部分厂商支持 IPv6)
- 不能含任何需内核深度解析的扩展动作(如 payload 修改、nat、log、counter),否则自动 fallback 到软件 flowtable
- 建议搭配 conntrack 调优:增大 net.netfilter.nf_conntrack_max,避免因连接数满导致无法建流
验证与调优实际效果
配置完成后,不能仅看规则是否加载成功,要确认硬件真正接管了流量:
- 查看卸载统计:nft list flowtable inet filter fastpath 中应显示 offload: enabled 且 entries 数持续增长
- 检查硬件计数器:ethtool -S eth0 | grep -i offload(如 rx_flow_rule_create, tx_flow_rule_remove)
- 压测对比:使用 iperf3 或 pktgen 发起多流 TCP/UDP 并发,观察 CPU 占用下降幅度与吞吐提升(典型提升 3–10 倍,延迟抖动显著收窄)
- 若未触发卸载,用 tcpdump -i eth0 抓包确认是否真有 established 流量到达,再检查 ct state 是否被其他规则提前 drop

















