网站突然卡成PPT,打都打不开?先别重启服务器,很可能是被CC了
你正改着首页文案,客户发来截图:“点进去转圈两分钟”;运维群弹出告警:“Nginx连接数破3000”;自己刷一下后台,连登录页都要等半分钟——别急着查数据库、别慌着扩容,这大概率不是程序bug,是有人在用“假人”把你服务器薅秃了。
如何第一时间判断是不是CC攻击?
先看监控面板:CPU和内存是不是双双飙到95%以上,但带宽曲线却平得像条直线?如果是,基本可以锁定了。
再翻Web日志(Nginx的access.log或Apache的access_log):用tail -1000 | awk '{print $1}' | sort | uniq -c | sort -nr快速扫一眼,有没有十几个IP反复刷同一个地址?比如每秒几十次地GET /api/v1/submit,或者疯狂POST /login?
一个真实场景:上周帮一家本地教育机构排查,他们网校后台崩得厉害,但课程视频加载正常。一查日志,发现/api/auth/token接口被23个IP轮着调用,每个IP每分钟发起400+次请求,全卡在JWT签发环节——后端PHP进程直接被拖死,真用户连不上课。
紧急情况下,5个能快速上手的缓解手段
确认是CC后,按顺序做,目标就一个:让服务器先喘口气。
立刻打开你正在用的云WAF里的CC防护开关
阿里云WAF、腾讯云WAF、又拍云防火墙……这些你备案时就配好的服务,现在就进控制台,找到“CC防护”或“爬虫管理”,把阈值设成“单IP每秒请求超15次即拦截”。不用调太细,先拦住最野的那波流量。没有WAF?直接改Nginx配置限流
进服务器,打开你的站点配置文件(通常是/etc/nginx/conf.d/your-site.conf),在server{}块里加两行:limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/s; location /login { limit_req zone=login_limit burst=10 nodelay; }改完执行
nginx -t && nginx -s reload,30秒搞定。这个规则专治登录页被刷。从日志里揪出最狠的几个IP,马上封
比如发现192.168.123.45一小时刷了8000次搜索接口,直接在云厂商安全组里加一条“拒绝该IP所有入向流量”,或者在服务器跑:iptables -I INPUT -s 192.168.123.45 -j DROP
封不了全部,但能砍掉30%以上的攻击流量。把被盯上的动态页面,临时切到静态缓存
如果攻击集中在首页或活动页,别硬扛。用CDN后台(比如Cloudflare或又拍云)给这个URL加个“强制缓存10秒”的规则;或者干脆用cp index.php index.html生成一个静态快照,DNS暂时指向它——用户看到的是旧内容,但至少能打开。对关键入口加一道验证码
WordPress就装Wordfence插件,勾选“登录页启用reCAPTCHA”;自己写的后台,在登录表单提交前加一行JS判断(用腾讯防水墙或极验的免费版就行)。别怕影响体验,这时候宁可让用户多点一次,也不能让机器占满线程。
为什么单纯的封IP效果不好?
因为攻击者早就不靠单个IP硬刚了。他们手里攥着几百个被黑的家用路由器、几千个代理IP池,甚至用正常用户的Chrome浏览器插件当跳板。你刚封完一批,新IP已经顶上来了。
更麻烦的是“慢速CC”:每个IP每分钟只刷10次,但1000个IP一起上,照样把数据库连接池耗光。这种流量混在真实用户里,肉眼根本分不清——你不可能把所有访问过登录页的IP都拉黑。
长期防御,需要哪几层防护?
救火只是开始,接下来得把门加固:
把WAF当成网站“保安”,而不是备胎
别等被打爆了才开CC防护。现在就去你用的云平台,把“自动学习模式”打开,让它自己抓异常行为;把“登录/注册/下单”这些路径的防护等级调高一级。让网站自己少干活
全站接CDN(哪怕用免费版Cloudflare),静态资源扔OSS;动态接口加Redis缓存,比如用户信息查一次缓存5分钟;数据库慢查询日志定期扫,把SELECT * FROM orders WHERE status=1这种没索引的语句揪出来优化。设置会叫的监控
在宝塔面板、云监控或Zabbix里,给“Nginx活跃连接数>1000”“PHP-FPM进程占用超90%”设微信告警。别等用户投诉才发觉——真出事时,你比客户早3分钟知道。藏好你的服务器IP
检查域名解析:CNAME必须指向CDN或WAF地址,绝对不能填你ECS的公网IP;检查代码里有没有硬编码的服务器地址;连测试环境都别用真实IP暴露在外。
被攻击时,如何与主机商或安全团队沟通?
别发一句“我网站挂了”,他们得花5分钟问你基础信息。直接甩这五条:
- 攻击开始时间(例:今天下午2:17左右)
- 域名 + 服务器公网IP(阿里云/腾讯云后台就能抄)
- 具体现象(例:“前台能打开,但点击‘立即报名’按钮无响应,F12看Network里
/api/enroll一直pending”) - 你已做的操作(例:“已封3个IP,Nginx加了登录页限流”)
- 一段原始日志(从
access.log里复制10行典型攻击记录,删掉Referer里的敏感参数)
有这五条,支持工程师3分钟内就能定位攻击特征,说不定已在全局规则里帮你封了整个IP段。
今天下班前就能完成的一个具体操作
打开你电脑上的终端(Mac/Linux)或PuTTY(Windows),连上你的服务器,然后:
执行这三步,给登录接口加个“防刷锁”
nano /etc/nginx/conf.d/your-site.conf(把your-site.conf换成你实际的配置文件名)- 在
server{}块开头粘贴:
limit_req_zone $binary_remote_addr zone=auth_limit:10m rate=3r/s;
- 在
location /login {或location ~ \.php$ {这类区块里,加上:
limit_req zone=auth_limit burst=5 nodelay;
保存退出,运行 nginx -t && nginx -s reload。
Done。这个规则会让每个IP每秒最多发3次登录请求,超了直接返回503——挡不住高级攻击,但能筛掉90%的脚本工具。你喝杯咖啡的时间,网站就多了一道自动闸门。