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><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/ai/881" title="Luminal"><img
src="https://img.php.cn/upload/ai_manual/001/503/042/68b6d51ebc357953.png" alt="Luminal" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/ai/881" title="Luminal" class="overflowclass">Luminal</a>
<p class="overflowclass">Luminal是一款通过自然语言清洗、转换、分析和可视化电子表格的 AI 数据工具。</p>
</div>
<a rel="nofollow" href="/ai/881" title="Luminal" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><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
</p>
说明:
-
@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命中数纳入告警看板










