tc不能直接限连接,需用iptables connlimit限并发、limit控新建速率,或nginx limit_conn控http连接;三者作用层不同,不可混用。

tc 不能直接对连接本身限速,它控制的是流量(字节/秒),不是连接数或连接建立频率。真要限制“连接”,得用 iptables 的 connlimit 和 limit 模块,或者 Nginx 的 limit_conn —— 三者作用层不同,别混用。
用 iptables connlimit 限制单 IP 并发连接数
这是最常用的底层连接数防护方式,适用于 SSH、HTTP、数据库等所有 TCP 服务,不依赖应用层。
-
connlimit匹配的是「当前 ESTABLISHED 状态的连接数」,不是请求数,也不是新建连接速率 - 规则必须加在
INPUT链,目标端口明确(如--dport 22),否则无效 - 常见写法:
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP,表示单 IP 超过 3 个 SSH 连接就丢包 -
--connlimit-mask 24可按网段统计(如限制整个192.168.1.0/24最多 20 连接),掩码值对应子网位数 - 注意:该规则不记录日志,调试时建议先用
-j LOG替代-j DROP,避免锁死自己
用 iptables limit 控制新建连接频率
当你要防暴力破解或扫描行为(比如每秒建 100 个新连接),limit 比 connlimit 更合适——它管的是「单位时间内的 SYN 包数量」。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
limit基于令牌桶,参数--limit 5/sec表示每秒最多放行 5 个匹配包,超出则按策略处理 - 典型组合:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/sec --limit-burst 10 -j ACCEPT,再跟一条-j DROP拦截超额请求 -
--limit-burst是初始令牌数,设太小(如 1)会导致合法用户首连就被拒;设太大(如 100)等于形同虚设 - 该规则只对
NEW状态生效,不影响已有连接的通信
用 Nginx limit_conn 限制 HTTP 连接数
如果你的服务走 HTTP,且已用 Nginx 做反向代理或 Web 服务,limit_conn 是更精准的选择——它能区分 keepalive、WebSocket 等场景。
-
limit_conn必须和limit_conn_zone配合使用,后者定义共享内存区,必须放在http{}块顶层,否则 Nginx 启动失败 - 写成
limit_conn_zone $binary_remote_addr zone=perip:10m;比$remote_addr更省内存,64 位系统下每个 IP 占约 128 字节 -
limit_conn perip 5;放在server{}块里,表示每个客户端 IP 最多维持 5 个未关闭的 TCP 连接(含 keepalive) - CDN 场景下,
$binary_remote_addr拿到的是 CDN 节点 IP,需配合set_real_ip_from+real_ip_header X-Forwarded-For修正源地址 - HTTP/2 下单连接复用多 stream,
limit_conn容易失效,建议补一层limit_req控制请求频次
tc 不适合做“连接限速”,但可间接影响连接体验
tc 的本质是整形出站流量,它无法感知 TCP 连接状态,也不能拦截 SYN 包。但它可通过限速让慢速连接更慢、重传更多,间接抬高建连成本。
- 例如用
tbf把出口带宽压到极低(如rate 64kbit),会导致三次握手 ACK 延迟增大,客户端超时概率上升 - 若搭配
htb + u32 filter对特定目的 IP 限速,可能让某客户端反复重连失败——但这属于副作用,不是设计目标 - 真正想控连接,请勿尝试用
tc filter match ip protocol 6去匹配 TCP,tc的 filter 不支持按 TCP 标志位(如 SYN)过滤,iptables才是正确工具
connlimit 和 limit 经常组合使用:前者防资源耗尽,后者防暴力试探;Nginx 层的 limit_conn 则负责业务逻辑侧的精细控制。三者不在同一层,也不冲突,但配置位置和生效时机差异很大,容易误以为“写了就起作用”。










