CC攻击刷爆带宽怎么办?流量盗刷防护实战

带宽被盗刷是 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 就只封短时、封段级、留白名单。