网站被DDoS攻击怎么办?服务器应急处理全流程

网站被DDoS攻击怎么办?服务器应急处理全流程

凌晨三点,手机疯狂震动。

“网站打不开了。”“502 Bad Gateway。”“服务器CPU 100%。”

你睡眼惺忪地打开电脑,看到监控面板上那条几乎垂直向上的红线——带宽打满了,连接数爆了,机器卡得连SSH都敲不动。

恭喜你,被DDoS了。

别慌。这套流程我帮朋友处理过不下十次,从个人博客到电商网站,从几分钟的小打小闹到几小时的持续攻击。今天全部分享给你,存下来,真遇到事能救命。


第一步:3分钟内确认是不是真的被攻击

很多人看到流量暴涨就慌了,但有时候只是正常的业务高峰,或者某个页面被分享了。

先问自己三个问题:

  1. 流量曲线是什么形状? 正常业务高峰是平滑上升,攻击往往是垂直起飞。
  2. 来源IP有没有规律? 同一IP段疯狂请求?还是来自不同国家的分散IP?
  3. 访问日志里有没有特征? 比如全是同一个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攻击(应用层攻击)。

工具地址:


第二步:判断攻击类型——流量型还是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,封一小时。

工具地址:

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. 接受一个事实:你不可能防住所有人。 真正的大流量攻击,全世界没几个公司能硬扛。所以更重要的是“快速响应”和“快速恢复”,而不是幻想永远不被攻击。


上个月一个朋友的电商站被打了四个小时,他按这套流程一步步走,最后保住了核心交易,损失的只是图片加载慢了点。

事后他跟我说:“被打的时候,最怕的不是攻击本身,是不知道该怎么办。”

现在你有这份指南了。存下来,发给你的运维同事,或者就存在手机备忘录里。

哪天凌晨三点手机响,你打开它,就知道该从哪一步开始。

网站安全

超越单点智能:2026年,如何编织你的“韧性架构”网络?

2026-2-3 14:16:14

实操指南知识库

云原生数据库与服务器整合

2024-12-31 15:11:04

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧