被DDoS攻击了怎么办?先判断流量类型再按四步缓解
被DDoS攻击后最忌讳直接关机或重启,这既不能停止攻击,还会丢失排查线索。
正确做法是先确认攻击类型,再按“联系服务商→启用清洗→应用层限速→源站加固”的顺序处理,同时保留访问日志和流量图。
先判断攻击打在哪一层
DDoS不只有一种形态。
打开云控制台的流量监控或服务器上的 iftop、nload,看带宽是否被打满;
用 ss -s 看连接数是否异常暴涨;
再翻Nginx访问日志,看是否集中在某个接口或搜索参数上。
- 流量型攻击:带宽曲线瞬间冲高,服务器CPU可能不高,但外部访问全部超时。常见是UDP Flood、ICMP Flood。
- 连接型攻击:
ss -s显示大量 SYN_RECV 或 ESTAB 连接,单个IP并发极高,典型是SYN Flood。 - 应用层攻击:带宽和连接数不算夸张,但Nginx日志里同一URL被高频请求,数据库CPU被拖高,接近CC攻击。
判断清楚后再选手段,否则容易把清洗策略配错方向。
联系服务商并启用流量清洗
如果带宽已被打满,源站侧做任何配置都很难生效,因为流量在到达服务器前就已经堵死。
此时应第一时间提交工单给云服务商或机房,说明遭受DDoS攻击、目标IP和受影响业务。
多数云厂商提供基础DDoS防护,超过阈值后可手动或自动触发清洗。
操作路径通常在控制台的“DDoS防护”或“安全中心”中,将源站IP加入清洗策略,观察清洗后的流量图是否回落。
如果攻击持续且超过清洗阈值,可临时升级高防IP或接入CDN,让用户访问节点而不是直接回源。
需要注意:切换高防或CDN后要修改DNS解析,生效需要时间,提前把TTL调低可以减少切换等待。
在Nginx层做限速和连接控制
当攻击以应用层请求为主、源站还能响应时,可以在Nginx配置中限制单IP频率和并发连接。
以下片段放在 http 块内:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location / {
limit_req zone=req_limit burst=20 nodelay;
limit_conn conn_limit 20;
proxy_pass http://127.0.0.1:8080;
}
}
修改后执行 nginx -t 检查语法,再 nginx -s reload 平滑生效。
参数需要按业务实际调整,rate=10r/s 对普通页面够用,但对API接口可能过严,建议先在测试环境验证。
如果日志中攻击源集中在少数IP段,可用防火墙临时封禁,例如 iptables -I INPUT -s 攻击IP -j DROP,但要注意别把自己的管理IP误封。
加固源站并验证恢复情况
清洗和限速生效后,从外部网络访问网站,确认页面能否正常打开、响应时间是否恢复。
检查 ss -s 连接数是否回落,Nginx日志中异常请求是否减少。
同时把攻击时段的访问日志、流量截图和工单记录保存下来,便于后续分析攻击来源和调整防护阈值。
源站加固还包括:关闭不必要的端口、限制管理后台访问来源、给登录接口加验证码或频率限制。
如果业务允许,长期方案是接入CDN并隐藏真实IP,避免攻击直接打到源站。
常见疑问
攻击停了还需要继续开清洗吗?
建议观察一段时间再关闭,攻击者可能二次试探。清洗策略可以保持开启,但注意调整阈值避免误伤正常用户。
限速会不会影响正常访客?
会。rate 和 burst 设置过严时,正常用户快速刷新也可能被限制。上线前用真实访问量估算,并观察Nginx错误日志中的 limiting requests 记录。
没有高防IP怎么办?
先联系服务商确认基础防护能力,同时用CDN做一层缓冲。如果攻击持续超过业务承受范围,再评估是否需要购买高防服务,不要等业务完全中断才处理。