nftables 处理大规模连接池状态的关键在于善用 conntrack 机制与状态化匹配,而非堆砌规则;它依赖 nf_conntrack 子系统管理状态,规则仅做轻量位域判断,配合限速、分离链职责、命名集合和内核参数调优实现高性能。

nftables 处理大规模连接池状态,关键不在“堆规则”,而在于善用连接跟踪(conntrack)机制与状态化匹配,配合高效的数据结构和合理的钩子优先级。它本身不维护连接池,而是依赖内核的 nf_conntrack 子系统做状态管理,nftables 规则只需轻量引用这些状态即可实现高性能过滤。
利用 ct state 实现无状态开销的连接放行
对已建立或相关连接(established/related),nftables 只需一条规则即可跳过后续匹配,大幅降低每包处理路径长度:
nft add rule inet filter input ct state { established, related } accept
这条规则实际不触发 conntrack 查表——内核在进入 input 钩子前已完成连接查找并标记 ct status,nftables 仅做位域判断,毫秒级无感。相比逐条匹配源IP+端口+协议,性能提升一个数量级。
限制新建连接速率,防 SYN 泛洪或扫描器压垮 conntrack 表
连接跟踪表有容量上限(默认通常 65536),大量新建连接会耗尽条目,导致合法连接失败。应主动限速:
nft add rule inet filter input tcp flags & (fin | syn) == syn \
limit rate 20/second burst 100 packets \
counter \
accept
nft add rule inet filter input tcp flags & (fin | syn) == syn \
counter drop
- 第一条:允许每秒最多 20 个新 SYN 包,突发允许 100 个(应对短时业务高峰)
- 第二条:超出即丢弃,不记录日志避免 IO 拖累
-
flags & (fin | syn) == syn精准匹配 SYN 包,比tcp dport 80更早介入,减少无效解析
按连接方向分离策略,避免 input 链过载
不要把所有逻辑塞进 input 链。例如:
- 入站服务访问控制(如只允特定 IP 访问 SSH)放在
input - 出站连接控制(如禁止某进程外连)放在
output - 内网转发策略(如容器间通信)走
forward
这样每条链职责单一,规则数可控,conntrack 状态查询路径更短。
使用命名集合(set)管理动态白名单,替代长列表匹配
当需放行数千个可信客户端 IP,不用写几千条 ip saddr 192.168.1.1 accept。改用带超时的动态集合:
nft add set inet filter trusted_ips { type ipv4_addr; flags timeout; }
nft add element inet filter trusted_ips { 192.168.1.10 timeout 1h, 10.0.5.22 timeout 30m }
nft add rule inet filter input ip saddr @trusted_ips ct state { established, related, new } accept
- 集合查表为 O(1) 哈希查找,不受元素数量影响
-
timeout自动清理陈旧条目,无需外部脚本轮询 -
new状态允许首次建连,配合前面的限速规则形成闭环
调优 conntrack 内核参数,匹配业务规模
nftables 规则再优,若内核 conntrack 表太小或回收太慢,照样卡顿。检查并按需调整:
# 查看当前使用情况 sysctl net.netfilter.nf_conntrack_count sysctl net.netfilter.nf_conntrack_max # 临时增大(示例:支持 20 万连接) sudo sysctl -w net.netfilter.nf_conntrack_max=2097152 # 加入 /etc/sysctl.conf 持久化 echo "net.netfilter.nf_conntrack_max = 2097152" | sudo tee -a /etc/sysctl.conf
同时建议开启 nf_conntrack_tcp_be_liberal=1(对 TCP 状态更宽容),避免因时间戳/窗口异常误删连接。
nftables 本身不处理连接池,它靠的是精准调用内核已有能力。真正决定大规模状态处理效率的,是规则是否绕过冗余匹配、集合是否替代线性扫描、参数是否匹配真实负载——而不是规则条数多寡。











