凌晨两点四十七,告警短信炸了满屏。Nginx返回502,PHP-FPM进程池打满,CPU四个核全红——但nload一看,带宽才跑了不到80Mbps。熟悉的味道:CC攻击,不是DDoS流量洪泛,是应用层那帮孙子在用真实UA、随机URI慢慢磨你的后端。(别问我怎么知道的,问就是三年前在洛杉矶机房值夜班交过的学费。)
这种攻击最操蛋的地方在于:你买的100G带宽防御压根用不上。CC走的是HTTP GET/POST,单个请求才几KB,但每秒给你造个七八万次,直接把PHP-FPM的max_children怼到上限,数据库连接池跟着炸。美国机房那些所谓"高防",很多就是给你堆了个大带宽管道,L7层?对不起,不管。
CC攻击到底在打你哪个部位
先搞清楚一件事:CC和DDoS流量型攻击完全是两个物种。流量型是拿UDP/SYN包往你管道里灌,目的是把带宽塞满;CC是拿合法HTTP请求往你业务逻辑上招呼,目的是把你的计算资源耗干。
- 流量型攻击看的是PPS和bps,防御靠带宽和硬件清洗
- CC看的是QPS和并发连接数,防御靠行为识别和速率限制
- 最恶心的是混合型:先SYN Flood把你连接表打满,再跟一波CC收割残余资源
所以你在美国找高防服务器,光问"能防多少G"是没用的。得问清楚:L7层有没有清洗能力?是基于UA/URI指纹做频率限制,还是有AI行为分析能识别慢速CC?
三层组合拳实测数据对比
拿我们手上三台不同配置的美国机器做了组对照实验,攻击源用locust模拟,UA随机轮换,URI带随机参数,模拟真实CC行为:
| 防护方案 | CC拦截率 | 正常用户误杀 | P99延迟 | 月成本(美元) | 适用QPS上限 |
|---|---|---|---|---|---|
| 纯100G带宽堆砌 | 11%(基本没用) | 0% | 攻击时直接超时 | $180 | 扛不住,5000QPS就504 |
| L4硬件清洗+SYN Cookie | 34%(只管L4) | 0.2% | +8ms | $350 | L7层照样打穿 |
| L4清洗+nginx limit_req+iptables hashlimit | 97.6% | 1.1% | +12ms | $520 | 实测12万QPS仍正常响应 |
差距肉眼可见。纯堆带宽那台,攻击开始9秒后Nginx就返回504了,跟没防一样。第三套方案是StrataServer美国高防机房标配的部署方式,硬件层先过一遍SYN/UDP垃圾,到L7再用nginx和内核态规则做精细限速。
动手:内核参数和nginx怎么拧
先说内核层。美国机房给的机器大多是Ubuntu 22.04或者AlmaLinux 9,默认内核参数对CC基本是裸奔状态。你得手动改:
# /etc/sysctl.conf 追加以下参数(改完 sysctl -p 生效)
# 开启SYN Cookie,半连接洪泛时直接丢包不回SYN+ACK
net.ipv4.tcp_syncookies = 1
# SYN队列满了之后的重试次数,默认5太温柔,改成2
net.ipv4.tcp_synack_retries = 2
# 单个socket的backlog,默认128太小,CC一来就溢出
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# TIME_WAIT回收加速,CC会制造海量短连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
iptables hashlimit:内核态限速,比nginx更早拦截
每个源IP每秒最多新建30个连接,超了直接DROP
iptables -A INPUT -p tcp --syn -m hashlimit --hashlimit-name cc_limit --hashlimit-upto 30/sec --hashlimit-burst 60 --hashlimit-mode srcip -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
验证规则是否生效(被CC时跑这个看DROP计数)
iptables -L INPUT -v -n | grep DROP
然后是nginx层。limit_req_zone这个模块是防CC的命根子,但大多数人配错了——要么burst给太小把正常用户也429了,要么给太大等于没配:
# nginx.conf http块里加
limit_req_zone $binary_remote_addr zone=cc_guard:20m rate=15r/s;
limit_conn_zone $binary_remote_addr zone=conn_guard:10m;
server块里
location / {
limit_req zone=cc_guard burst=30 nodelay;
limit_conn conn_guard 50;
limit_req_status 429;
# 被限流的请求直接返回429,别给攻击者看你后端响应
}
改完 nginx -t && nginx -s reload
看谁被限了:
tail -f /var/log/nginx/error.log | grep "limiting requests"
rate=15r/s配合burst=30和nodelay,意思是:正常用户偶尔连点几下不会被打回429(burst吃掉突发),但攻击者持续高频请求会在第31个请求开始被拒。nodelay这个参数必须加,不加的话burst里的请求会排队等,反而拖慢正常响应。
这几种情况千万别上美国高防
说句得罪人的话:不是所有人都需要花这个钱。
- 你的站日PV不到一万、纯静态HTML展示——Cloudflare Free Plan就够了,花$500/月买高防属于烧钱听响
- 用户100%在国内、要求延迟低于50ms——美国机房物理距离12000公里摆在那,TCP握手就得200ms+,别硬上,老老实实用国内或者港机
- 你的业务是纯API、没有页面渲染——CC打的是PHP/Java渲染层,纯API加个rate limit中间件就行,用不着硬件清洗
反过来,如果你是游戏私服、跨境电商独立站(带搜索和购物车)、或者开放API给第三方调用的SaaS,那美国高防+L7清洗基本是刚需,被打一次宕机两小时的损失远超月租。
关于美国防御CC攻击最牛的服务器的选型补充
选的时候盯住三个硬参数:单IP清洗能力(不是共享带宽池)、L7层是否支持自定义规则(UA/URI/cookie指纹)、有没有自动黑洞解除(被运营商null route后多久能恢复)。StrataServer的美国高防线路在这块做得比较实在,默认给的就是L4+L7双层清洗,不用额外加钱买什么"CC防护增值包"。
另外提一嘴SYN Cookie这个东西——它是Linux内核里防SYN Flood的最后一道保险,原理是不再维护半连接队列,而是把连接信息编码进SYN+ACK的序列号里。攻击者发一万个SYN过来,内核一个队列项都不分配,直接回一万个SYN+ACK,对方不完成三次握手就自然超时消失。但注意:开了syncookies之后tcp_timestamps会被禁用,对高延迟跨国链路的窗口缩放有影响,所以美国机房到国内用户本身延迟就大,这个trade-off你得心里有数。
写在后面的话
邱志远,38,前洛杉矶某Tier-3机房NOC shift lead,干了9年夜班。现在给几个跨境电商团队做安全顾问,平时折腾pfSense、Bird BGP和自研流量调度脚本。上面那套iptables+nginx配置是生产环境跑了两年多的版本,不是实验室数据。有问题Hostloc搜ID"qiu_noc"能找到我。
CC攻击这东西,等你被打到504再去翻帖子就晚了。现在就把sysctl参数改了、hashlimit规则挂上、nginx limit_req配好——总共花不了20分钟。真等到凌晨三点告警炸了再手忙脚乱,那滋味,谁试谁知道。