nftables可通过conntrack状态跟踪与limit、ct count组合实现按IP源、连接速率、会话持续时间三维度动态拦截中间件端口,如8080/TCP限单IP每秒新建≤10连接,6379/TCP限单IP并发≤25,并需同步调优somaxconn、tcp_max_syn_backlog等内核参数保障承载能力。

用 nftables 对企业核心中间件端口(如 Tomcat 的 8080、Spring Boot 的 8000、Redis 的 6379)做动态连接数红线拦截,关键不是“一刀切限总数”,而是按 IP 源、连接速率、会话持续时间三个维度分层控制,避免误伤正常业务流量。
明确要保护的端口与连接特征
先确认中间件实际监听的端口和协议。例如:
- Java 应用常监听 8080/TCP(HTTP)、8443/TCP(HTTPS)或自定义端口如 8000/TCP
- Redis 默认是 6379/TCP,且多数连接短时高频、无状态
- 数据库如 MySQL(3306)或 PostgreSQL(5432)则倾向长连接、低频新建
不同中间件的连接行为差异大,不能统一设“每个 IP 最多 10 连接”。应结合其典型负载模式设定阈值,比如 Redis 可设每秒新建连接 ≤15,而 Tomcat 全连接数上限可设为 200,单 IP 并发 ≤30。
用 nftables connlimit + limit 实现双控红线
nftables 本身不直接支持 connlimit 扩展(这是 iptables 的模块),但可通过 nf_conntrack 状态跟踪 + limit 和 ip saddr 匹配组合实现等效效果。推荐写法如下:
在 nftables 规则中添加:
# 创建名为 "middleware" 的表和链
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; }
<h1>允许已建立连接(保障回包)</h1><p>nft add rule inet filter input ct state established,related accept</p><h1>对 8080 端口:单 IP 每秒新建连接 ≤10,超限丢弃(防爬虫/扫描)</h1><p>nft add rule inet filter input tcp dport 8080 ct state new ip saddr @trusted_ips counter limit rate 10/second burst 20 packets drop</p><h1>对 6379 端口:单 IP 并发连接 ≤25,超限拒绝(防暴力探测)</h1><p>nft add rule inet filter input tcp dport 6379 ct state new ip saddr @redis_clients counter ct count over 25 drop
说明:
-
@trusted_ips 是预定义的 IP 集(可用
nft add set inet filter trusted_ips { type ipv4_addr\; }创建),把运维、监控、API 网关等可信源加进去,绕过限制 -
ct count over N 是 nftables 原生支持的并发连接数检查,依赖 nf_conntrack 记录,需确保
net.netfilter.nf_conntrack_max足够大(建议 ≥65536) - limit rate X/second burst Y 控制新建连接频率,比单纯限并发更能防突发扫描
配合内核参数加固底层承载能力
仅靠规则拦截不够,若内核连接队列溢出,合法请求也会被丢。必须同步调优:
- 增大全连接队列:
sysctl -w net.core.somaxconn=4096(默认常为 128) - 增大半连接队列:
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 - 启用快速回收(对短连接有效):
sysctl -w net.ipv4.tcp_tw_reuse=1 - 提升文件描述符上限:
echo "* soft nofile 65535" >> /etc/security/limits.conf,并重启对应服务
这些参数写入 /etc/sysctl.conf 持久化,避免重启失效。
验证与灰度上线方法
不要直接全量启用拦截规则:
- 先用
counter替代drop,观察 24 小时日志(nft list ruleset -a查 counter 编号,再nft monitor trace抓样例) - 对新规则加注释并标记版本,例如:
# v2.1-redis-conn-limit-20260518 - 优先在非核心中间件(如测试环境的 8081 端口)试运行,确认无误后再切生产端口
- 配置 Prometheus + node_exporter + nftables exporter,将
ct count和limit命中数纳入告警看板

















