高频流量应提前放行,已建立连接(ESTABLISHED/RELATED)占入向流量70%–80%,需将状态检查规则置于input/forward链最顶端;用map替代线性规则实现O(1)匹配;分fastpath/policy/fallback三层链隔离处理逻辑;慎用log与counter,生产环境应限制或移除。

把高频流量提前放行,别让它跑完整条链
已建立的连接(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
快速剔除非法状态包,避免它们继续消耗匹配资源。
用 map 替代线性规则链,把“遍历 N 条”变成“查一次哈希表”
当 IP 黑名单超过几百条、端口白名单达百级,硬编码规则会触发 O(N) 线性扫描,延迟随条目数直线上升。换成 map 后,匹配耗时基本恒定:
- 创建带 verdict 映射:
nft add map inet filter ip2verdict { type ipv4_addr : verdict \; size 65536 \; } - 批量注入策略:
nft add element inet filter ip2verdict { 192.0.2.10 : drop, 203.0.113.5 : accept } - 在链中调用:
nft add rule inet filter input ip saddr @ip2verdict
注意:
size参数需预估容量,避免运行时扩容引发抖动;键值对类型要与字段匹配(如ipv4_addr对应ip saddr)。
分层拆解 fastpath / policy / fallback 链,按意图隔离处理粒度
不要把所有逻辑堆在一条 input 链里。按流量生命周期分三层,每层只承担明确职责:
-
fastpath 链:仅做 conntrack 状态检查、本地回环(
iifname lo)、管理网段放行(如10.10.0.0/16)。80% 流量在此终结。 -
policy 链:挂载
map、concat、命名set等结构化策略,专注租户、服务或接口维度控制,不掺杂基础放行逻辑。 -
fallback 链:只保留兜底动作(如
drop或limit rate 10/second burst 5 packet),确保干净、轻量、无分支判断。
通过 jump 调用实现链间跳转,保持主链极简。
慎用 log 与 counter,它们是性能隐形杀手
log 和 counter 在高并发下频繁触发软中断、写内存、刷 cache,开销远超表面看起来:
- 日志仅用于临时调试,生产环境若必须保留,务必加严格条件限制,例如:
nft add rule inet filter input tcp dport 22 ct state new log prefix "SSH_NEW: " counter accept
- 计数器除非用于限速(如
limit)或告警联动(如配合nft monitor),否则一律移除。nft list ruleset默认不显示计数,但运行时仍消耗资源。 - 长期统计需求应绕过 netfilter 规则路径:改用 eBPF map 统计,或读取
/proc/net/nf_conntrack接口获取连接态数据。
不复杂但容易忽略


















