
凌晨三点,手机疯狂震动。
“网站打不开了。”“502 Bad Gateway。”“服务器CPU 100%。”
你睡眼惺忪地打开电脑,看到监控面板上那条几乎垂直向上的红线——带宽打满了,连接数爆了,机器卡得连SSH都敲不动。
恭喜你,被DDoS了。
别慌。这套流程我帮朋友处理过不下十次,从个人博客到电商网站,从几分钟的小打小闹到几小时的持续攻击。今天全部分享给你,存下来,真遇到事能救命。
第一步:3分钟内确认是不是真的被攻击
很多人看到流量暴涨就慌了,但有时候只是正常的业务高峰,或者某个页面被分享了。
先问自己三个问题:
- 流量曲线是什么形状? 正常业务高峰是平滑上升,攻击往往是垂直起飞。
- 来源IP有没有规律? 同一IP段疯狂请求?还是来自不同国家的分散IP?
- 访问日志里有没有特征? 比如全是同一个UA(User Agent),或者都在请求同一个不存在的URL。
用命令快速验证:
bash
# 看实时网络连接,找出占用最多的IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
# 看带宽占用
iftop
# 看系统负载和CPU
top
如果发现几百个IP在疯狂连你的80端口,CPU不高但网络爆了——大概率是流量型攻击。如果CPU和数据库负载飙升,但网络正常——可能是CC攻击(应用层攻击)。
工具地址:
- iftop:http://www.ex-parrot.com/~pdw/iftop/ (一般直接用包管理器安装:apt install iftop)
第二步:判断攻击类型——流量型还是CC?
这两种攻击的处理方式完全不同,先分清楚。
流量型攻击(Layer 3/4)
特征:带宽打满,进出流量巨大,服务器CPU可能不高但网络瘫痪。攻击目标是堵死你的网络管道。
CC攻击(Layer 7)
特征:CPU和内存飙升,数据库连接数爆增,但网络流量可能并不夸张。攻击目标是耗尽你的应用资源。
怎么分?
- 看带宽监控:如果进出流量远超正常值 → 流量型
- 看进程:
top里看到大量php-fpm或httpd进程 → CC型 - 看日志:access.log里同一IP大量请求同一个页面 → CC型
第三步:流量型攻击的应急处理
流量型攻击最棘手,因为你的带宽就那么点,对方只要比你大,就能把你打趴下。
3.1 联系机房或云厂商开启黑洞/清洗
如果你用的是云服务器,控制台里一般都有“DDoS防护”入口。紧急情况下,直接提工单或打电话,让他们开启黑洞牵引。就是把你的流量引到清洗中心,过滤掉恶意流量再送回给你。
记住: 别自己硬扛,你扛不住。云厂商的清洗能力是以T为单位的,你的服务器最多几百M。
3.2 临时启用高防IP
如果你提前买了高防IP(或者云厂商送的),马上把域名解析切过去。高防IP自带清洗能力,能扛住大部分流量型攻击。
3.3 在防火墙上临时封IP段
如果攻击来源有规律(比如都是某个国家的IP,或者某个运营商的IP段),可以用防火墙临时封掉。
bash
# 用iptables封一个IP段 iptables -A INPUT -s 123.456.0.0/16 -j DROP # 或者用ipset封一批IP ipset create blacklist hash:ip ipset add blacklist 1.2.3.4 iptables -A INPUT -m set --match-set blacklist src -j DROP
但这一招只对“笨”的攻击有效,如果对方用了全球僵尸网络,IP分散,封不过来。
第四步:CC攻击的应急处理
CC攻击更狡猾,它模仿正常用户请求,但量极大,让你的应用服务器累死。
4.1 临时限流——最直接有效
Nginx里可以限制单IP的连接数和请求频率:
nginx
# 限制每个IP的并发连接数 limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_conn conn_limit 10; # 限制每个IP的请求频率 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; limit_req zone=req_limit burst=20;
这行配置的意思是:每个IP每秒最多10个请求,超过的排队,队列最多20个。瞬间能把攻击者的请求挡在外面,正常用户不受影响(因为正常用户不会每秒刷10次)。
4.2 开启防CC模块
fail2ban可以监控日志,发现某个IP短时间内大量请求,自动封掉。
bash
# 安装fail2ban apt install fail2ban # 配置nginx-cc jail vim /etc/fail2ban/jail.d/nginx-cc.conf
配置内容:
ini
[nginx-cc] enabled = true port = http,https filter = nginx-cc logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600
意思是一分钟内请求超过100次的IP,封一小时。
工具地址:
- fail2ban:https://www.fail2ban.org
4.3 静态化——釜底抽薪
如果攻击针对的是某个动态页面(比如搜索页、API),临时把这个页面改成静态HTML返回。或者用Nginx直接返回静态文件,不经过PHP。
nginx
location /search {
# 临时返回静态文件
alias /var/www/html/static/search.html;
# 或者直接返回状态码
# return 200 "Service temporarily unavailable";
}
虽然牺牲了功能,但保住了服务器。
第五步:攻击中如何保住核心业务
有时候攻击一时半会儿停不下来,但业务不能全挂。
降级处理: 关闭图片、附件、大文件等非核心资源,只保留核心API和页面。可以在Nginx里临时注释掉静态资源的location。
启用CDN: 如果你平时没用CDN,现在马上加。Cloudflare免费版就能缓存静态资源,减轻源站压力。虽然挡不住所有攻击,但至少能分担一部分流量。
扩容: 如果预算允许,临时加几台服务器,用负载均衡分担压力。攻击总会过去,这几小时的机器钱就当交学费。
第六步:攻击结束后做什么
攻击停了,别以为完事了。这时候要做的事更重要。
分析日志: 找出攻击的特征——源IP段、请求的URL、User Agent、请求频率。把这些特征写入防火墙和WAF规则,下次再来直接挡。
bash
# 从日志里提取攻击IP
grep "2026-03-10" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
加固配置: 根据这次攻击的经验,调整限流参数、优化应用代码。比如如果发现某个API特别容易被攻击,可以加缓存或限流。
写复盘报告: 记下这次攻击的时间、类型、处理过程、耗时、改进点。下次再遇到,直接照着复盘的流程走,不用临时想。
第七步:日常防护建议(别等被打才准备)
最后说几句不中听但重要的话:
1. 基础防护必须做。 防火墙、限流、WAF,这些不是摆设,是真能挡住小打小闹的攻击。
2. 监控告警要配好。 带宽突增、CPU突增、连接数突增,只要有一个超过阈值就告警。早一分钟发现,多一分主动。
3. 备好预案。 高防IP的联系方式存手机里,云厂商的工单入口存书签,应急命令记在本子上。被攻击的时候,每一分钟都是钱。
4. 接受一个事实:你不可能防住所有人。 真正的大流量攻击,全世界没几个公司能硬扛。所以更重要的是“快速响应”和“快速恢复”,而不是幻想永远不被攻击。
上个月一个朋友的电商站被打了四个小时,他按这套流程一步步走,最后保住了核心交易,损失的只是图片加载慢了点。
事后他跟我说:“被打的时候,最怕的不是攻击本身,是不知道该怎么办。”
现在你有这份指南了。存下来,发给你的运维同事,或者就存在手机备忘录里。
哪天凌晨三点手机响,你打开它,就知道该从哪一步开始。




