腾讯云国际版 预防大流量 CC 攻击的 Nginx 限流
什么是CC攻击?别让服务器\\\"累成狗\\\"
CC攻击(Challenge Collapsar)听着像科幻片,其实就是一群\\\"网络水军\\\"用机器人疯狂刷你的网站,把服务器搞到死机。想象一下,你开个奶茶店,突然100个只点水的客人涌进来,店员忙得连奶茶都做不了——这就是CC攻击的日常。它们不干别的,就疯狂请求同一个页面,让服务器忙得喘不过气,真正想用的用户却被挤到门外。是不是很气?别急,Nginx来救场!
Nginx限流:服务器的\\\"防暴盾牌\\\"
Nginx这货,平时就扛流量扛得贼稳,现在对付CC攻击更是小菜一碟。它不像某些防火墙动不动就封IP,而是用\\\"限流\\\"这种温和手段,控制流量节奏,既防攻击,又不伤及无辜。比如,给每个IP定个\\\"规矩\\\":每秒最多10个请求,超了?抱歉,您得排队,或者直接请回!这样,攻击流量被挡住,正常用户还能继续用。
说白了,Nginx限流就是给服务器装了个\\\"流量闸门\\\",过猛的洪水先拦一拦,让系统喘口气。这招既实用又优雅,比简单粗暴的封IP强多了。
基础限流:让流量\\\"排排队\\\"
先说最常用的limit_req模块。配置超简单,三步搞定:
- 腾讯云国际版 定义限流区域
- 设置速率和缓存大小
- 在location里启用
代码示例:
http {\n # 定义名为cc_limit的区域,10MB内存,每秒10个请求\n limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=10r/s;\n\n server {\n location / {\n # 启用限流,允许突发20个,直接拒绝多余\n limit_req zone=cc_limit burst=20 nodelay;\n }\n }\n}解释下这些参数:
- zone=cc_limit:10m:分配10MB内存存IP请求记录,能存约16万个IP(1MB约1.6万IP)。
- rate=10r/s:每秒10次请求,超过的进队列。想象成奶茶店每分钟只卖60杯,超了就得等。
- burst=20:允许临时突破到20个,比如突然100个请求,先处理10+20=30,剩下的排队或拒绝。
- nodelay:不延迟处理,直接拒绝,避免排队等太久。否则,如果没这个,可能积压大量请求,服务器更惨。
但要注意,rate不能设太低!比如设成1r/s,用户点个页面同时加载JS、CSS、图片,瞬间超过,直接被拦,用户肯定骂娘。得根据实际测试调参数,比如先用ab工具压测,看正常用户请求频率再定。
进阶玩法:白名单和精准打击
有些IP你得放行,比如公司内网、CDN节点。这时候用map搞白名单:
map $remote_addr $limit {\n default 1; # 默认需要限流\n 192.168.0.0/16 0; # 内网IP段\n 203.0.113.0/24 0; # CDN节点\n}\n\nserver {\n location / {\n if ($limit = 0) {\n limit_req off; # 白名单直接放行\n break;\n }\n limit_req zone=cc_limit burst=20 nodelay;\n }\n}这样,内网和CDN的IP就不用受限制。但注意:map写错的话,可能全放行或者全拦!比如把\\\"192.168.0.0/16\\\"写成\\\"192.168.0.0/24\\\",那内网其他IP就还得限流,可能出问题。所以配置前仔细检查IP段。
连接数限制:防止连接池被占满
除了请求速率,还可以限制每个IP的并发连接数。比如用limit_conn模块:
http {\n limit_conn_zone $binary_remote_addr zone=conn_limit:10m;\n server {\n location / {\n limit_conn conn_limit 10; # 每个IP最多10个连接\n }\n }\n}这就像地铁安检,同一时间只能进10个人,超过的得在外面排队。对CC攻击来说,很多机器人会开大量连接,限制连接数能有效防住。但要注意,正常用户可能需要多个连接(比如浏览器同时加载资源),所以10-20比较合理。设太低会导致正常访问卡顿,设太高又防不住攻击。建议根据实际观察调整。
监控与日志:别当\\\"睁眼瞎\\\"
配置完了,得知道有没有拦住攻击。Nginx日志是你的\\\"监控台\\\":
log_format cc_log \\'$remote_addr - $time_local - $status - $limit_req_status\\';\naccess_log /var/log/nginx/cc.log cc_log;这样每条日志会记录$limit_req_status,如果是REJECTED,说明被限流了。定期看日志,发现某个IP疯狂被拒绝,就可以手动封杀。比如:
grep REJECTED /var/log/nginx/cc.log | awk \\'{print $1}\\' | sort | uniq -c | sort -nr这个命令能统计出被拒绝的IP,哪个最多,直接拉黑。但别急着封,先确认是不是攻击。有时候正常用户也可能被误拦,比如爬虫或者刷单,得先分析。
实战演练:配置一个防CC小能手
现在来个完整配置,结合限流+白名单+连接数限制:
http {\n # 定义限流区域(10M内存,每秒15请求)\n limit_req_zone $binary_remote_addr zone=cc_zone:20m rate=15r/s;\n\n # 定义连接数限制区域\n limit_conn_zone $binary_remote_addr zone=conn_zone:10m;\n\n # 白名单:内网、CDN\n map $remote_addr $skip_limit {\n default 0;\n \\"192.168.0.0/16\\" 1;\n \\"10.0.0.0/8\\" 1;\n \\"203.0.113.0/24\\" 1;\n }\n\n server {\n listen 80;\n server_name your-site.com;\n\n location / {\n # 白名单直接放行\n if ($skip_limit) {\n limit_req off;\n limit_conn off;\n break;\n }\n\n # 限流:15r/s,突发30,直接拒绝\n limit_req zone=cc_zone burst=30 nodelay;\n # 连接数限制:每个IP最多15个连接\n limit_conn conn_zone 15;\n }\n }\n}这个配置能应付大多数CC攻击。但别忘了测试!用ab工具模拟:ab -c 50 -n 1000 http://your-site.com/
观察日志和响应时间,调参数直到效果满意。毕竟每个网站流量不同,配置得\\\"量身定制\\\"。
常见误区:别把\\\"限流\\\"当\\\"封杀\\\"
很多新手一上手就设超低rate,比如1r/s,结果用户访问就卡成PPT。比如,用户打开页面,同时加载10个资源,瞬间10个请求,超过1r/s,全被拒绝——这哪是防攻击,简直是自残!正确做法是:
- 先摸清正常流量:看日志,统计用户平均请求频率
- rate设为正常值的1.5倍,比如平均8r/s,设12r/s
- burst和nodelay配合,处理突发
还有个大坑:只靠Nginx限流。CC攻击可能用代理IP轮换,单个IP流量不大,但总量大。这时候Nginx限流可能效果有限,得配合CDN(比如Cloudflare的DDoS防护)或者防火墙规则。Nginx是第一道防线,但不是万能钥匙。
最后提醒:限流配置后要持续监控。攻击手法会变,你的配置也得更新。别等到服务器挂了才后悔没设置好。运维这活,就是\\\"平时多流汗,战时少流血\\\"。
总结:稳住,能赢!
CC攻击看着吓人,其实有Nginx限流这招,根本不用慌。记住三点:
1. 合理设rate:别把闸门关太死,正常用户才能进门;
2. 白名单是必须的:内网和CDN别卡住;
3. 监控+调整:日志是你的\\\"预警雷达\\\",随时调整参数。
现在你已经掌握了核心技能,赶紧去配置吧!下次攻击来袭,你就能淡定喝咖啡,看着Nginx把攻击流量挡在门外——这才是真正的\\\"运维大佬\\\"风范!

