Nginx Stream模块不支持原生连接速率限流,但可通过三种方式实现:①用limit_conn_zone配合$binary_remote_addr限制每IP并发连接数;②用proxy_timeout等参数软性节流;③用iptables/nftables在系统层做连接速率控制。

Nginx Stream 模块本身不支持原生的连接速率限流(如每秒新建连接数限制)或并发连接数硬限制,它没有类似 HTTP 模块中 limit_conn、limit_req 这类指令。但可通过组合系统级控制与 Stream 模块的有限能力,实现对四层连接的有效并发约束和连接频率压制。
以下是在生产环境中切实可行的三种方式,按推荐优先级排序:
-
使用
limit_conn配合stream_geo或stream_map定义连接密钥
虽然 Stream 模块的limit_conn不能直接写在server块里(会报错),但它可在stream全局块中定义,并配合limit_conn_zone使用:stream { # 定义基于客户端 IP 的连接数限制区(共享内存) limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; upstream backend { server 192.168.1.100:22; } server { listen 2222; # 对每个客户端 IP 限制最多 5 个并发连接 limit_conn conn_per_ip 5; proxy_pass backend; } }✅ 支持 TCP/UDP;✅ 真实生效于连接建立阶段;⚠️ 注意:
$binary_remote_addr比$remote_addr更省内存,推荐使用。 -
用
proxy_timeout+proxy_responses实现“软性”连接节流
通过缩短空闲等待时间与响应确认窗口,间接抑制低效或恶意长连接泛滥:-
proxy_timeout 3s;—— 连接空闲超时设短,快速释放僵尸连接 -
proxy_responses 1;—— 强制等待首个响应包才认为连接就绪,避免 SYN 泛洪类攻击绕过 -
proxy_connect_timeout 1s;—— 控制与后端建连耗时上限(需 Nginx ≥ 1.19.5)
这些参数虽非限流指令,但在 Redis、MySQL 等短交互场景中,能显著降低连接堆积风险。
-
-
借助系统级工具做前置连接管控
当 Nginx 层无法满足精细策略(如每 IP 每秒新建连接 ≤ 10),建议在防火墙层拦截:- Linux
iptables+hashlimit(适用于 IPv4):iptables -A INPUT -p tcp --dport 6380 -m hashlimit \ --hashlimit-above 10/sec --hashlimit-burst 20 \ --hashlimit-mode srcip --hashlimit-name redis_conn \ -j DROP
-
nftables(更现代,推荐):nft add rule inet filter input tcp dport 6380 \ ct state new limit rate 10/second burst 20 packets \ counter drop
此法不依赖 Nginx,生效位置更靠前,且资源开销极低。
- Linux
不支持的操作请避开:
❌ limit_req(仅 HTTP 模块可用)
❌ limit_conn 写在 upstream 或 server 内部(语法错误)
❌ 基于域名、URI、TLS-SNI 的限流(Stream 不解析应用层)
实际部署时,通常组合使用第一种(Nginx 内置连接数限制)+ 第三种(系统级速率封顶),兼顾灵活性与安全性。











