luckygood logo

美国防御CC攻击最牛的服务器3层清洗方案实测

StrataServer

凌晨两点四十七,告警短信炸了满屏。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 Cookie34%(只管L4)0.2%+8ms$350L7层照样打穿
L4清洗+nginx limit_req+iptables hashlimit97.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分钟。真等到凌晨三点告警炸了再手忙脚乱,那滋味,谁试谁知道。

常见问题解答

01 CC攻击时带宽才用了5%但CPU已经100%,怎么快速确认是L7攻击而不是服务器本身性能不行?

跑ss -s看TCP连接数,如果ESTABLISHED上万但带宽没跑满,再grep nginx access.log统计单IP QPS。正常用户不会1秒内请求同一URI 50次,超了就是CC。

02 iptables的hashlimit和limit模块防CC到底该用哪个?网上说法不一。

用hashlimit。limit是全局速率限制,所有IP共享一个计数器,一个攻击者就能把配额吃完。hashlimit按srcip独立计数,每个IP有自己的30/sec配额,互不影响。

03 源站真实IP已经泄露了,攻击者绕过CDN直接打源站,美国高防服务器还能救吗?

能。先让机房把源站IP换掉,新IP只允许高防清洗节点回源。同时iptables里加白名单只放行清洗节点IP段,其他所有入站SYN直接DROP,攻击者拿不到新IP就打不进来。

04 nginx limit_req配了burst=30 nodelay,正常用户反馈偶尔还是429,怎么调?

把rate从15r/s降到10r/s但burst提到50,或者对登录/支付等高频交互路径单独建zone给更宽松的rate。另外检查是不是前端JS在轮询接口,把轮询间隔从1s改成3s。