提升nftables性能的关键是压缩匹配路径、减少内核遍历:首置ESTABLISHED/RELATED放行规则,次置INVALID丢弃;用哈希set替代线性规则;分层拆解fastpath/policy/fallback链;对无状态流量notrack,慎用log与counter。

提升 nftables 在大数据量场景下的过滤性能,关键不是堆规则数量,而是压缩数据包的匹配路径、减少内核遍历开销、绕过不必要的处理环节。真正影响吞吐和延迟的,往往不是单条规则多复杂,而是“一个包要走多少步、比多少次”。
高频连接提前放行
已建立连接(ESTABLISHED/RELATED)通常占实际流量 70%–80%,这类包完全不需要参与策略判断。必须把状态检查规则放在 input/forward 链最顶端:
- nft add rule inet filter input ct state { established, related } accept —— 所有后续规则跳过,CPU 不再做任何匹配
- 紧随其后加:nft add rule inet filter input ct state invalid drop —— 快速清理非法状态,避免污染 conntrack 表
- 不要混在中间或靠后;哪怕只晚一条,每秒百万包就会多做百万次无谓扫描
用集合(set)替代线性规则
当 IP 或端口列表超过百条,硬编码规则会触发 O(N) 线性扫描,延迟随条目数直线上升。哈希集合可将匹配压到接近 O(1):
- 创建 IPv4 地址集合:nft add set inet filter blacklist { type ipv4_addr \; size 65536 \; }
- 批量注入:nft add element inet filter blacklist { 192.0.2.10, 203.0.113.0/24, 198.51.100.100-198.51.100.200 }
- 链中调用:nft insert rule inet filter input ip saddr @blacklist drop(用 insert 确保位置合理)
- 支持 timeout 和 interval,适合动态封禁、网段管理、自动过期等场景
分层拆解链结构
别把所有逻辑塞进一条 input 链。按处理意图分三层,让不同流量走不同路径:
- fastpath 链:只做 conntrack 状态检查 + lo 接口 + 管理网段放行,80% 流量在此终结
- policy 链:挂载 set/map/concat,专注租户、服务、接口维度控制,不掺杂基础放行逻辑
- fallback 链:仅保留 drop 或限速规则,兜底干净,不拖慢主路径
- 通过 jump 跳转串联,而非全部堆在一条链里——结构清晰,更新局部化,加载更快
绕过 conntrack 与慎用日志
conntrack 是高并发下的性能热点,尤其对 UDP 健康检查、DNS、转发流量;log 和 counter 在高负载下会频繁触发软中断:
- 对明确无状态的流量打 notrack:nft add rule ip raw PREROUTING udp dport 53 notrack
- 调小超时值:sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=300
- log 仅用于临时调试,且加严格条件:tcp dport 22 ct state new log prefix "SSH_NEW: "
- 计数器除非用于限速或告警,否则一律移除;长期统计改用 eBPF map 或 conntrack 接口
不复杂但容易忽略



















