来源:王璐宇 | 发布日期:2025-08-29
TCP 连接数爆表:攻击还是 Bug 排查指南
当服务器 TCP 连接数飙升(如 10 万+)时,快速分辨是 DDoS/CC 攻击 还是 代码 Bug/配置错误,是应急响应的核心能力。
紧急响应:5 分钟快速定位
1. 连接状态分析
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
| 大量状态 | 初步判断 | 说明 |
|---|---|---|
| TIME_WAIT | 大概率业务 Bug | 应用频繁创建短连接,主动关闭后 OS 需保持 2MSL。常见于未使用连接池的 HTTP 客户端 |
| CLOSE_WAIT | 代码 Bug 实锤 | 对方关闭连接但应用未调用 close(),属资源泄漏。典型:DB/HTTP 连接未正确释放 |
| SYN_RECV | 极可能是 SYN Flood 攻击 | 服务器发 SYN-ACK 但未收 ACK,半连接队列被占满 |
| ESTABLISHED | 需进一步分析 | 可能正常业务、连接池过大、或长连接攻击 |
2. 源 IP 分析
netstat -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 20
- 攻击特征:源 IP 分散、随机,或零星外部 IP 大量请求 → CC/DDoS
- Bug 特征:源 IP 集中(127.0.0.1、内网 IP、自身)→ 程序 Loopback 调用或连接池配置错误
3. 端口/进程关联
# 哪个端口连接数最多
netstat -ant | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -n 10
# 根据端口查进程
lsof -i :80
快速定位到 Nginx、MySQL 或 Java 应用等具体进程。
攻防鉴别总表
| 特征指标 | 攻击 (Attack) | 代码/配置 Bug |
|---|---|---|
| 主要连接状态 | SYN_RECV、FIN_WAIT1 | TIME_WAIT、CLOSE_WAIT |
| 源 IP 分布 | 分散、随机 | 集中(本地、少数服务 IP) |
| 流量规律 | 瞬间爆发,与业务无关 | 持续增长,与发布/功能调用时间相关 |
| 资源消耗 | CPU、带宽 | CPU、内存、文件描述符 |
| 解决方案 | 防火墙、流量清洗、扩容 | 修改代码、调整配置、重启服务 |
实战案例
- CC 攻击:活动页 ESTABLISHED 飙高,源 IP 分散指向一个耗时查询 API → 启用 WAF CC 防护规则
- CLOSE_WAIT 泄漏:Java 应用发布后 CLOSE_WAIT 缓慢上升至爆表 → 异常处理中未关闭 MySQL 连接 → 修复代码后重启
落地解决
临时止损
| 场景 | 措施 |
|---|---|
| 攻击 | iptables 限制单 IP 并发(--connlimit-above 50);接入云厂商 DDoS 高防;临时扩容 |
| Bug | 重启服务释放资源;回滚新版 |
根因治理
代码层面:
- 所有 HTTP/数据库/Redis 客户端使用连接池,设置合理大小
- 在
finally块中确保连接释放 - 设置连接超时、读超时、写超时
系统层面:
- 调优
/etc/sysctl.conf内核参数(如net.ipv4.tcp_tw_reuse、net.core.somaxconn) - 建设常态化 WAF 和 DDoS 防护体系
- 核心 API 配置速率限制(Rate Limiting)
关联页面
| 页面 | 关联点 |
|---|---|
| server-performance-four-dimensions | 服务器性能五维排查总纲 |
| docker-production-pitfalls | Docker 生产环境 TCP 连接排坑 |
| network-troubleshooting-order | 网络排障顺序 |
| online-troubleshooting-checklist | 在线排障清单 |
| nginx-realtime-push-guide | Nginx 实时推送与长连接配置 |