nftables性能优化核心是让conntrack状态匹配尽早、从轻、不拖慢其他包:将established/related规则置于input/forward链首位,紧接invalid drop;对dns等无状态流量用raw表notrack跳过;禁用非必要ct扩展并避免在状态规则后混入log/counter等高开销操作。

nftables 处理复杂连接追踪逻辑时,性能瓶颈往往不在规则数量本身,而在于 conntrack 状态判断路径是否冗余、是否被高频流量反复触发、以及是否与非必要操作耦合。优化关键不是“怎么写状态匹配”,而是“让状态匹配这件事尽可能早、尽可能轻、尽可能不拖慢其他包”。
把 ESTABLISHED/RELATED 放在链最顶端,且只放这一类规则
已建立连接通常占实际流量 70%–90%,它们不需要策略决策,只需快速放行。这条规则必须是 input 和 forward 链的第一条:nft add rule inet filter input ct state established,related accept
紧随其后可加一条快速过滤非法状态的规则:nft add rule inet filter input ct state invalid drop
这样,绝大多数包在第 1–2 步就结束匹配,后续所有端口、IP、协议、日志等规则完全跳过。
对无需状态跟踪的流量,直接绕过 conntrack
DNS 响应、健康探针、内部服务间无状态通信等场景,根本不需要 conntrack 参与。用 raw 表 notrack 显式跳过:nft add rule ip raw PREROUTING udp dport 53 notracknft add rule ip raw PREROUTING ip daddr @local_nets notrack
这能显著降低 conntrack 表压力,避免哈希冲突、内存争用和超时清理开销。
慎用 ct helper、ct timeout 和 ct label 等扩展功能
这些特性虽增强语义表达能力,但每启用一个,conntrack 条目就要多维护一份上下文、多一次回调、多一次内存分配。生产环境若无明确需求(如 SIP/FTP 协议穿透),建议禁用:echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper
同时调小非关键连接的超时值,例如:sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=600
避免在 conntrack 触发路径中混入高开销动作
log、counter、limit、payload 深度匹配(如 @th,4,2)等操作一旦出现在 ct state established 规则之后或同一链中,会强制所有已建立连接包都执行这些动作——哪怕只是计数一次,高并发下也会引发软中断风暴。正确做法是:
- log 仅用于调试,且严格限定条件(如
tcp dport 22 ct state new log prefix "SSH_NEW") - counter 仅保留在限速或告警链路中,其余一律移除
- 真实统计需求改用 eBPF map 或
/proc/net/nf_conntrack接口轮询,不走规则路径
不复杂但容易忽略










