判断服务器限流是攻击还是正常流量激增,核心看三个维度:流量特征是否反人性、访问行为是否异常集中、以及资源消耗是否符合业务规律。如果流量在几分钟内从低谷冲到峰值,且清一色来自陌生IP、相同UA或特定接口,那多半是攻击;如果是缓慢爬坡、伴随真实业务转化、来源分布合理,则大概率是正常流量,下面从特征、排查、实战三个层面拆开讲。
正常流量激增的典型特征:先看它的“人味儿”
正常流量再猛,也带着真实用户的行为惯性,判断的第一步,是看流量有没有“人类痕迹”。
来源构成是否多元
真实用户来自天南海北,运营商、地域、设备、浏览器高度分散,你可以登录服务器,随便取一段Nginx访问日志,按IP段和UA做聚合统计,正常流量激增时,前十个IP的请求占比通常不会超过总请求量的5%,如果某个IP独占了三成以上,就需要高度警惕。
访问路径是否符合业务漏斗
真实用户进入网站,会沿着页面层级走:先首页,再列表页,再详情页,最后触发转化,攻击流量则不然,它往往直接怼着某个API接口或搜索页疯狂打,路径单薄得像一条直线,你去看访问日志里的URL分布,如果一个接口的请求量占了80%以上,而其他页面纹丝不动,这不叫激增,这叫集火。
频率是否符合人类极限
正常人一秒钟最多点几次鼠标,一个IP一秒钟发出几十个请求,这就不是人手能办到的事,行业共识认为,单个IP的请求频率超过每秒10次,且持续数分钟,基本可以判定为非人类行为,如果你们公司刚好搞了秒杀活动,那另说秒杀场景下,人和机器的界限会模糊,但也挡不住清一色相同时间戳的请求。
时间线是否匹配业务周期
正常流量激增,通常跟业务动作绑定:大促、上新、投放、热点事件,如果你什么都没干,流量突然翻了三倍,那这流量自己长了腿,大概率是跑错门了。
攻击流量的判断特征:几个关键画像
攻击流量的核心逻辑是“用最小成本耗尽你的资源”,所以它的行为模式跟真实用户有根本性冲突。
请求的“目的性”过强
攻击者清楚你的薄弱点在哪,他会直接瞄准消耗CPU、数据库连接、带宽的接口,比如一个查询接口,正常业务每次查一张表,攻击者构造的请求可能让这个接口做多表联查,或者反复触发缓存穿透。攻击流量的URL结构高度重复,参数变化极小,这种“机械感”是最大的破绽。
速率分布是“垂直拉升”而非“平滑爬坡”
正常流量激增是渐进的用户看到消息、点进来、转发,总有个过程,攻击流量是脚本控制的,可以在几十秒内把并发数从100打到5000,直接给你拉成一条垂直线,你去看监控图,如果曲线像心电图骤停又骤起,而不是像山坡一样缓缓抬高,那基本是攻击无疑。
请求头存在低级错误
很多攻击脚本用的是固定的User-Agent,比如某个Python库的默认UA,或者直接留空,高端的攻击者会伪造UA,但伪造的UA往往跟真实浏览器环境不匹配比如UA写着Chrome 120,但HTTP版本却是1.0,这种不协调,就是机器人的尾巴。
攻击的“不达目的不罢休”
正常用户遇到页面卡顿,会刷新一两次然后离开,攻击脚本不会,它会踹着固定的频率一直打,哪怕你返回503,它照打不误。如果限流后流量依旧持续,甚至攻击频率更高,就可以确认是恶意行为,因为真人早就被挡在门外了。
实操排查:五步锁定真凶
判断不能靠猜,得靠数据,下面这套步骤,你在服务器上就能直接操作,不需要额外装任何商业软件。
第一步:拉取实时连接数,看IP分布
登录服务器,执行以下命令,查看当前TCP连接数的TOP10来源:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n -r | head -20
如果发现某个IP的连接数超过总连接数的30%,或者前十个IP占了60%以上,那攻击的可能性就很大,正常流量不会有这么夸张的头部聚集效应。
第二步:比对业务转化率
去数据库里拉一下这个时间段的“有效会话数”或“下单数”,假设流量涨了三倍,但下单量没涨,甚至跌了,那这些流量就是虚的,正常用户淹没服务器时,转化率可能会降,但不会归零只要有真人进来,就有成交。流量涨、转化持平或下降,是攻击流量的黄金判据。
第三步:检查请求日志的时间戳间隔
用下面的命令,看连续请求的URL和出现时间:
tail -100 /var/log/nginx/access.log | awk '{print $4, $7}' | head -50
人类访问的时间戳有随机性有人停留10秒,有人停留2分钟,攻击脚本的时间戳间隔精确到毫秒级,而且规律一致,你看日志里如果连续几十条请求的秒数完全一样,那就是脚本在并发轰炸。
第四步:去看带宽和CPU的比例关系
正常流量激增,CPU和带宽同步增长,但比例是协调的有多少PV,烧多少CPU,攻击流量不同,尤其是CC攻击,带宽消耗不大,但CPU直接打满,因为每个请求都带着密集的数据库查询或正则匹配,你按top看一下,如果CPU占用率接近100%,而带宽只用了20%,那多半是逻辑层被打穿了。
第五步:直接拉黑测试反应
挑一个嫌疑最大的IP段,在防火墙里临时封禁它,然后观察整体流量变化,如果封掉这个IP后,限流状态立刻缓解,流量直接掉了一大截,那就说明它贡献了攻击的大头真实用户的IP封了,该来的还是会来,不会如此立竿见影。
正常流量激增的常见误判场景
不是所有翻倍的流量都是黑客,有几种业务场景特别容易跟攻击混淆,下手前务必排除。
- 搜索引擎爬虫更新:百度、Google的爬虫在算法更新时会集中抓取,尤其是新站或内容大改的站点,你可以在日志里搜
Baiduspider或Googlebot的UA,如果流量主体是它们,那就安心。 - 推广落地页的即时反馈:如果你刚好在某平台投了信息流广告,那么广告点击进来的流量会在几秒内集中打爆服务器,去检查推广后台的消费记录,看时间点是否对得上。
- 老用户回访的“脉冲”:比如你们给用户发了推送,用户看到通知后会统一戳进来,形成一波集中访问,但频次不会超过每用户每秒一个请求这一点用IP+UA的组合分析就能判断。
高防服务器的现实选择
如果确实是攻击,而且频次高、规模大,那就得考虑上防御手段了,这里说点实际的。
云WAF先顶住
在DNS层面接入云WAF(比如简米云、酷番云的Web应用防火墙),按QPS(每秒查询数)购买套餐,它能帮你挡掉特征明显的CC攻击和SQL注入。成本较低,但遇到大流量攻击(比如超过50Gbps的DDoS)容易被打满,因为WAF本质上是代理,流量一高,它自己先瘫。
高防IP和源站分离
把服务器的真实IP隐藏起来,接一个高防IP作为转发层,市面上主流高防服务商的价格,防护峰值在50Gbps到100Gbps的套餐,年费大概在数万元到十几万元之间,具体要看机房线路和清洗能力,行业内成熟的做法是“高防IP+CDN+源站三层架构”,源站只允许CDN节点和白名单IP访问,从而彻底隔离攻击。
应用层的限流策略要有弹性
别硬抗,要懂软着陆,在Nginx层面,按IP、按会话ID做漏桶限流;在应用层,对核心接口设置熔断降级。让代价最小的请求先被丢弃,保住有真实业务价值的流量存活这是应对限流攻击的基本生存法则。
服务器被攻击限流常见问题解答
问:攻击流量和正常流量混在一起,特征不明显怎么办?
答:用“多条件交叉验证”,单看IP分布可能犹豫,那就叠加UA检查、路径分析、转化率三个维度,三个条件中有两个指向异常,就按攻击处理,先封IP再复盘,稳妥的实操方案是,把可疑IP的请求全量打印到日志文件里,先观察15分钟,如果期间这些请求的失败率、响应码分布与正常流量有明显偏差,就果断封禁,宁可误伤一点边缘流量,也不能让核心服务不可用。
问:被限流后,最快的恢复操作是什么?
答:第一步,在防火墙层面封锁攻击来源IP段,第二步,把动静分离做起来静态资源走CDN,动态请求原站处理,第三步,给当前的Nginx Worker进程数减半,降低单机负载,同时把超时时间调短,让慢请求快速断开,据业内专家指出,多数情况下这三步操作能在一分钟内缓解限流状态,为后续排查争取时间。
问:低价的云防护产品靠谱吗?
答:看你的业务体量,如果日活只有几千,几十块钱一个月的云WAF足够用;如果日活过百万,价格太低的防护产品很可能在流量高峰期出现误判或漏防,行业里的共识是:防御成本大概是服务器成本的30%到50%之间,低于这个比例,多半是共享清洗带宽,攻击一来,清洗能力先被耗尽,先搞清楚自己是“怕打垮”还是“怕打贵”,再决定买什么档位。
说到底,判断攻击还是流量激增,靠的不是玄学,而是习惯,你要做的就是把上面的排查步骤变成肌肉记忆流量一抖,先看IP分布,再看转化率,最后看时间戳,这套组合拳打下来,绝大多数情况都能在两分钟内有明确结论,限流不可怕,可怕的是流量翻了三倍,你还不知道它是怎么来的。