网站突然打不开时,先看三件事:带宽和包量有没有暴涨、服务器还能不能登录、访问日志里有没有大量请求。
- 带宽和每秒包数(pps)暴涨,SSH 连不上或很卡,Nginx/Apache 日志反而很安静:大概率是网络层/传输层 DDoS(SYN Flood、UDP Flood、反射放大等)。
- 带宽没怎么涨,服务器能登录但 CPU 长时间接近 100%,访问日志疯狂增长:大概率是 CC 攻击,也就是应用层(L7)的 HTTP/HTTPS Flood。
- 两种特征同时出现:按混合攻击处理。
先分清类型再动手,因为两者的处置方向不同:网络层 DDoS 在源站服务器上加规则基本无效,需要上游清洗;CC 攻击单纯扩带宽没用,要在 7 层做识别和限频。

第一步:看监控里的带宽和 QPS
打开云厂商、机房或网关的监控,把 4 层带宽(bps)、包量(pps)和 7 层 QPS、并发连接数放在一起看:
- 网络层 DDoS:bps 和 pps 断崖式上涨,规模常以 Gbps 计;7 层 QPS 却可能没有明显变化,甚至下降,因为很多连接连握手都完成不了。
- CC 攻击:总带宽变化不大,通常只在几 Mbps 到几百 Mbps 之间;但 QPS、并发连接数和每秒新建 HTTP 请求数出现异常尖峰。
没有看板的话,可以在服务器上用 sar -n DEV 1 5(需安装 sysstat)或 iftop 看网卡实时流量。
第二步:试一下能不能登录服务器
这一步最快,也很直观:
- 带宽被打满时,SSH 或远程桌面常常连不上,或者输入后很久才有反应。这时服务器本身可能并不忙,只是网络被堵了。
- CC 攻击时,SSH 一般能正常登录。用
top或htop能看到 php-fpm、java、python、nginx 或 mysql 进程把 CPU 或内存吃满。
如果完全登录不上,就跳过下面两步,直接联系机房或云厂商,确认是否触发了流量清洗或黑洞。
第三步:看 TCP 连接状态
能登录的话,统计一下各状态的连接数:
# 连接状态汇总
ss -s
# 按状态计数
ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn- 出现大量
SYN-RECV(netstat 里显示为SYN_RECV)半开连接:典型的 SYN Flood,属于传输层攻击。 - 大量
ESTAB(ESTABLISHED)或TIME-WAIT全连接,而且远超平时水平:握手已经完成,请求打到了应用层,更像 CC。
第四步:看 Web 访问日志
这是区分两者最有说服力的证据。网络层 DDoS 的报文大多到不了应用层,access.log 里几乎看不到攻击记录;CC 攻击的日志会在短时间内急剧膨胀。
以 Nginx 默认的 combined 日志格式为例(日志路径以你的配置为准):
# 请求最多的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# 被请求最多的 URL
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20
# 出现最多的 User-Agent
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -10CC 攻击常见的迹象包括:
- 请求集中在搜索、分页、登录、结账等计算量大的动态接口;
- 同一个 URL 被高频刷新;
- User-Agent 高度一致,或 Referer 明显是伪造的;
- IP 分散但行为一致,说明攻击方在用代理池轮换。
容易误判的几种情况
已经接入了 CDN 或高防。 这时网络层攻击多半已在边缘节点被吸收,源站只能看到回源流量;日志里的 IP 也都是节点地址,要按服务商传递的真实 IP 请求头统计。判断应以 CDN 控制台的流量和日志为准,具体看法可参考CDN控制台怎么看流量和网络日志。
慢速攻击(Slowloris 一类)。 它属于应用层攻击,但 QPS 不高。请求迟迟不发完,而日志通常在请求结束后才写入,所以 access.log 不一定暴涨。表现是 ESTABLISHED 连接长时间占满,Web 服务的 worker 耗尽,CPU 却未必很高。
混合攻击。 攻击者先用 4 层流量打底,同时发起 CC 压垮应用,上面几项指标会同时异常,单条命令的结果也会很混杂。这种情况最好结合 4 层和 7 层的聚合日志交叉判断。
正常业务高峰。 活动、推送或被大号转发也会让 QPS 和 CPU 同时上升。可以和平时的基线对比:来源地区是否符合你的用户分布,访问路径是否像真实用户(先打开页面,再请求静态资源和接口),而不是反复只打同一个接口。
判断之后怎么处置
如果是网络层 DDoS: 流量在到达服务器之前就已经堵住了线路,在服务器上装防火墙、改内核参数都解决不了带宽被打满的问题。需要把业务接入具备清洗能力的高防 IP 或高防 CDN,并把源站 IP 收口隐藏,否则攻击者可以绕过防护直接打源站。接入顺序可参考网站正在被大流量攻击:快速挂载CDN的接入顺序与收口要点。
如果是 CC 攻击: 可以先在源站做临时止血:
- 封禁请求最多的 IP;
- 对被刷的动态接口临时加缓存,或暂时下线非核心功能(如站内搜索);
- 用 Nginx 限频:
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
location /search {
limit_req zone=perip burst=20 nodelay;
}注意,源站前面有 CDN 或反向代理时,$binary_remote_addr 拿到的是节点 IP,需要先配置 real_ip 模块,否则会误伤整个节点背后的用户。另外,攻击方用代理池轮换 IP 时,封 IP 的效果很有限。要持续挡住 CC,得靠 WAF 或高防 CDN 在 7 层做 JS 验证、Cookie 校验、动态限频和特征规则拦截。
如果攻击还在持续,自己排查和止血跟不上,可以直接联系 RockCloud 应急接入。RockCloud 的高防 CDN 在同一条链路上同时处理网络层 DDoS 和应用层 CC,不需要分开采购;想先了解方案,可以看 DDoS 与 CC 防御。
评论(0)