nftables硬件卸载需软硬协同分层配置,核心是让稳定流量绕过内核协议栈由网卡直转:先验证驱动/固件与内核支持(ethtool、config检查),再启用网卡底层offload(tx/rx/tso/gso/gro/lro),接着定义ingress钩子上带flags offload的flowtable并指定物理接口,然后在forward链中对TCP/UDP established连接精准匹配flow offload规则,最后通过nft list、perf top和iperf3交叉验证卸载效果。

nftables 硬件卸载加速不是简单开个开关,而是需要软硬协同、分层配置的系统性优化。核心目标是让稳定流量绕过内核协议栈,由网卡直接完成转发,从而大幅降低延迟、提升并发吞吐。实际效果取决于硬件支持程度和配置精度,不能只靠“flags offload”这一行。
确认并启用网卡硬件卸载能力
不是所有网卡都支持 flowtable 硬件卸载,需先验证驱动与固件版本:
- 查看网卡是否支持 nftables flow offload:
ethtool -k eth0 | grep "flow",重点关注 hw-tc-offload 和 rx-flow-hash 是否为 on - 检查内核是否启用相关功能:
cat /boot/config-$(uname -r) | grep -i "NF_TABLES_FLOW",应返回 y 或 m - 加载带卸载支持的模块(如使用 mlx5):
modprobe nf_flow_table_inet offload=1,部分厂商驱动需额外参数(如mlx5_core flow_steering_mode=2) - 启用网卡底层 offload 功能(必须):
ethtool -K eth0 tx on rx on tso on gso on gro on lro on,缺失任一环节都会导致 flowtable 降级为纯软件模式
构建支持卸载的 flowtable 结构
flowtable 必须挂载在 ingress 钩子上,且 devices 列表要覆盖完整转发路径——进和出接口都得写全,否则硬件无法建立双向流表项:
- 定义 flowtable 时明确指定 flags offload,并绑定物理接口(不能用 bond0/vlanX 等虚拟设备,除非底层网卡原生支持):
flowtable fastpath { hook ingress priority -200; devices = { eth0, eth1 }; flags offload; } - priority 必须足够高(数值更小),确保早于其他 ingress 处理逻辑(如 tc qdisc、xdp 程序),否则流量根本到不了 flowtable
- 若使用双端口网卡做线速转发,建议将两个物理口设为同一 devices 列表;若跨网卡(如 eth0→eth1),需确认主板 PCIe 通道和驱动是否支持跨设备流卸载(多数仅支持单卡内卸载)
精准匹配可卸载的连接类型
并非所有 established 连接都能进硬件 flowtable。当前主流支持限于 IPv4/IPv6 的 TCP/UDP 四层无状态流,且需满足 conntrack 完整跟踪:
- 在 forward 链中添加 offload 规则前,必须先放行新连接,并确保其能被 conntrack 正确识别:
ct state invalid dropct state new,established,related accept - offload 规则本身要限定协议与方向:
ip protocol { tcp, udp } ct state established flow offload @fastpath
避免对 ICMP、SCTP 或分片包启用,它们不被硬件流表支持 - 禁用 conntrack 对非必要协议的跟踪(减少干扰):
sysctl -w net.netfilter.nf_conntrack_untracked=1,并配合规则跳过 untracked 流量
验证与调优关键指标
配置完成后不能只看规则是否存在,要从三个层面交叉验证是否真正卸载成功:
- 查硬件流表容量与命中数:
nft list flowtable inet filter fastpath,观察 entries 数值是否随流量增长,pkts 和 bytes 是否持续上升 - 对比 CPU 占用:运行
perf top -e 'skb:consume_skb' -p $(pgrep -f 'nft'),若该事件显著下降,说明大量数据包已绕过协议栈 - 实测延迟变化:用 iperf3 多流并发测试(如 64 并发 TCP 流),对比开启前后 p99 延迟,典型提升在 30%–70%,若无明显变化,大概率仍走软件路径
- 注意 conntrack 表压力:flowtable 加速后,conntrack 负担反而减轻,但若原始表过小(如默认 65536),仍可能因新建连接失败导致首包丢弃,需同步调大
nf_conntrack_max与hashsize

















