带宽被盗刷是 CC 攻击里最容易被忽略、账单却最贵的一种:攻击者不访问页面,只对图片、视频、安装包这类大文件高频发起请求,带宽和 CDN 流量一起飙升。本文用 10 个问答讲清流量盗刷与盗链、爬虫的区别,以及识别方法、Nginx 限速配置、CDN 流量封顶与应急处置顺序。
Q:流量盗刷和盗链、恶意爬虫到底有什么区别?
- 三者都在消耗带宽,但目的和请求形态完全不同,防护手段也不能互换。
- 盗链:别的网站直接引用你的图片、视频,请求带对方站点的 Referer,时间分布跟着对方流量走,本质是「来源不合法」。
- 恶意爬虫:批量采集内容做索引或建库,会跟随链接、抓 HTML,也会顺带拉静态资源,行为有逻辑可循。
- 流量盗刷(CC 类):直接对着资源 URL 高频请求,几乎不访问页面、不加载 CSS/JS、Referer 常为空或伪造,目的就是把你的流量包烧光。
- 判定关键不是「来源合不合法」,而是请求频率与访问路径是否像真实用户——这也是防盗链替代不了限速的原因。
Q:带宽被刷了有哪些明显特征?
- 最典型的一组信号:出向带宽突然上涨,但页面 PV 几乎不动;静态资源请求占比超 90%;少数文件被反复请求;TOP IP 请求量大却没有任何页面请求。
- 先看流量与带宽曲线,再回到日志看请求分布:
# 1) 网卡出向流量(收包正常、发包暴涨是典型盗刷特征)
sar -n DEV 1 5 | grep -E 'IFACE|eth0'
vnstat -m
# 2) 出向字节数 TOP IP(配合 log_format 带 $body_bytes_sent,默认字段为 $10)
awk '{print $1, $10}' access.log | awk '{s[$1]+=$2} END{for(i in s) print s[i], i}' | sort -rn | head -20
# 3) 被刷得最狠的资源文件
awk '$7 ~ /\.(jpg|jpeg|png|webp|gif|mp4|zip|apk|iso)$/ {print $7}' access.log | sort | uniq -c | sort -rn | head -20
- 三条命令合起来看,就能判断是「某几个大文件被盯上」还是「整站静态资源被扫」。
Q:怎么区分盗刷和正常流量高峰(比如上了首页推荐)?
- 用三个对照就够了,不要只看带宽一条曲线。
- 页面请求有没有同步上涨:正常高峰 HTML 请求数与静态请求同比例涨;盗刷时 HTML 请求数几乎不动。
- 来源是否分散:真实用户来源地跟随业务受众,UA 多样;盗刷集中在少数 IP 与 ASN,UA 高度单一。
- 请求是否加载资源链路:真实用户进页面必然连带 CSS、JS、字体,盗刷只要文件本身。
# 静态请求与页面请求的比例,正常站点一般在 5:1 到 20:1,盗刷时可达 100:1 以上
grep -Ec '\.(jpg|jpeg|png|webp|mp4|zip)$' access.log
grep -Ec '\.(html|php|jsp)$' access.log
Q:确认被刷之后,第一件事该做什么?
- 顺序很重要,先保命、再止血、后分析、最后固化,顺序错了会把正常用户一起挡在门外。
- 第一步保命:在 CDN 或防护节点设置带宽与流量封顶,触顶后优先拒绝大文件请求,保住页面与接口可用。
- 第二步止血:对大文件路径临时收紧限速、限制单 IP 并发连接。
- 第三步分析:拉出 TOP IP、TOP URL 清单,确定封禁范围——是几个 C 段还是全网分散。
- 第四步固化:把临时规则改写成常规配置,同步调整告警阈值并留档。
- 一条经验:不要在没看清日志的情况下直接全站返回 403,那等于自己给业务做了一次 DDoS。
Q:Nginx 层怎么给静态资源单独限速?
- 思路是三个维度分开管:频率管「多久请求一次」,并发管「同时开几条连接」,速率管「每条连接跑多快」。
- 单连接限速用
limit_rate,先放开一部分流量保证首屏体验,再限速:
# 先跑 1MB 全速,之后压到 512KB/s(大文件才需要)
location ~* \.(mp4|zip|rar|apk|iso)$ {
limit_rate_after 1m;
limit_rate 512k;
}
- 但
limit_rate是按连接限速,多线程下载器开多条连接就能绕过,必须配合并发与频率限制:
limit_conn_zone $binary_remote_addr zone=dl:10m;
limit_req_zone $binary_remote_addr zone=dlreq:10m rate=5r/s;
location ~* \.(jpg|jpeg|png|webp|gif|mp4|zip|apk)$ {
limit_conn dl 4; # 单 IP 同时最多 4 条下载连接
limit_req zone=dlreq burst=10 nodelay;
limit_rate_after 512k;
limit_rate 800k;
limit_conn_status 429;
limit_req_status 429;
expires 7d;
}
- 关键参数三个:limit_conn 的单 IP 并发上限、limit_req 的 rate 与 burst、limit_rate 的速率。并发基数按业务定:图片站 4 条足够,视频点播可放宽到 8~10。
- 返回码统一用 429 而不是 403:语义清晰,也方便在日志里区分「被限流」与「被拒绝」。
- 注意:limit_rate 只对源站出口生效,挡不住 CDN 回源流量,回源带宽要在 CDN 侧限制。
Q:CDN 侧的流量盗刷怎么防?
- CDN 通常是流量账单的主要出口,要在这一层做三件事:带宽与流量封顶、单 IP 频率与并发限制、缓存与回源控制。
- 封顶:设置告警阈值(如套餐 70%)与硬性上限,触顶后明确拒绝大文件,而不是整站下线。
- 频率与并发:主流 CDN 都支持单 IP 的 QPS 与并发限制,阈值可比源站宽松,先挡掉明显异常来源。
- 缓存与回源:命中率越高回源越少,但流量账单按边缘出流量算,缓存命中省不下被盗刷的流量费。
- 排查就看 CDN 后台四个报表:TOP URL、TOP IP、TOP Referer、状态码分布,429 与 403 占比上升说明规则确实生效了。
Q:视频、安装包这类热点大文件还有别的办法吗?
- 三个通用做法,核心是抬高单次抓取成本、降低被抓取的收益。
- 大文件不落源站:交给对象存储加 CDN 分发,源站只签发地址,出口流量与源站解耦。
- 访问加门槛:把需要大带宽的资源放到登录后或验证之后,匿名请求只给缩略图或试看片段,让盗刷拿不到完整文件。
- 地址带时效:给资源地址附加时间戳与签名,几分钟后自动失效,让攻击者无法长期复用同一个 URL。
- 签名只能提高攻击成本,替代不了限速:攻击者照样能在有效期内高频请求,频率限制才是底线。
Q:封禁怎么做才不误伤真实用户?
- 原则是短时封禁优先、段级封禁优先、白名单常备,绝不轻易下永久黑名单。
- 家庭宽带 IP 会被运营商回收再分配,今天封掉的地址明天可能属于正常访客;因此封禁一定要带自动过期。
# 用 ipset 做带超时的封禁,1 小时后自动解封
ipset create scratch hash:ip timeout 3600 maxelem 100000 -exist
# 取静态资源请求量异常高的 IP(阈值 200 次/小时可按业务调整)
awk '$7 ~ /\.(mp4|zip|apk)$/ {print $1}' access.log \
| sort | uniq -c | sort -rn | awk '$1>200 {print $2}' > ban.txt
while read ip; do ipset add scratch "$ip" -exist; done < ban.txt
# 只封 Web 端口,保留 22 管理通道,避免把自己锁在外面
iptables -I INPUT -p tcp -m multiport --dports 80,443 -m set --match-set scratch src -j DROP
- 一个前提特别容易被忽略:日志里必须拿到真实客户端 IP。CDN 回源场景若直接按日志来源封禁,会把回源节点全部封掉,整站立刻不可访问。
- 白名单要预留三类:监控探针、合作方接口、CDN 回源段。所有封禁规则都保留一键回滚入口。
Q:流量成本怎么控制和核算?
- 先弄清自己的计费口径:按流量计费(GB)的站点最怕盗刷,被刷多少付多少;按带宽计费(95 计费)更怕持续高峰,偶尔的尖峰反而被削掉。
- 被刷当天先算一笔账,再决定投入多少精力处置:
# 统计大文件出向总流量(GB)
awk '$7 ~ /\.(mp4|zip|apk)$/ {s+=$10} END {printf "%.1f GB\n", s/1024/1024/1024}' access.log
- 流量告警按套餐 70% 预警、85% 强提醒、95% 触发封顶策略来设置,避免账单出来才发现。
Q:还有什么补充建议?
- 分层防御:CDN 负责封顶与粗粒度限速,Nginx 负责频率、并发、速率三个维度,应用层负责访问门槛,最后才是封禁。
- 监控盯四个量:出向带宽、静态资源 QPS、单 IP 并发连接数、流量包余量,其中出向带宽与页面 PV 的背离是最灵敏的盗刷信号。
- 灰度上线规则:限速阈值先按正常用户峰值的 2~3 倍设置,观察一周再收紧,避免上线当天就误伤。
- 一句话总结:流量盗刷烧的是你的流量费,不是你的 CPU——识别上盯「出向带宽涨而页面 PV 不涨」,处置上限速与封顶优先于封 IP,封 IP 就只封短时、封段级、留白名单。