网站被 CC 攻击是什么体验:CPU 飙高、带宽打满、PHP-FPM 进程耗尽、正常用户打不开网页,日志里全是同一个 URL 的疯狂请求。
这篇讲 Nginx 层的防护手段:限速、限并发、防恶意爬虫、配合 fail2ban 封 IP。全部配置可直接抄,不需要买高防。
需要云服务器可以看看财富云计算:NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,一键开服面板,主流游戏快速部署。
一、分清 CC 和 DDoS
很多人混用这两个词,应对方式完全不同:
| 类型 | 原理 | 规模 | Nginx 能防吗 |
|---|---|---|---|
| CC 攻击 | 模拟正常用户疯狂请求动态页面,耗尽服务器资源 | 小(几十个 IP/肉鸡) | 能,且效果明显 |
| DDoS 流量攻击 | 巨量垃圾流量打满带宽 | 大(几十 Gbps 起步) | 不能,得上高防/CDN |
CC 攻击是应用层的,特征是「请求看起来正常但频率异常」,这正是 Nginx 的强项。流量型 DDoS 靠带宽硬扛,只能靠高防 IP 或 CDN 分摊。
二、第一道防线:限制请求频率
Nginx 的 limit_req 模块,按客户端限流。
基础配置
http {
# 在 http 块定义限流区
# $binary_remote_addr: 用二进制 IP 做 key(省内存)
# rate=10r/s: 每秒 10 个请求
# zone=one: 10 兆共享内存,约存 16 万个 IP 状态
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
# burst=20: 允许瞬时突发 20 个请求排队
# nodelay: 排队的不延迟,立即处理(对交互网站重要)
limit_req zone=one burst=20 nodelay;
}
}
}效果:单 IP 每秒最多 10 个请求,超出的要么排队(burst)要么直接 503。
不同页面不同策略
# 搜索、评论这类重的接口,限更严
location ~ ^/(search|comment) {
limit_req_zone 已在 http 定义;
limit_req zone=search:5m rate=1r/s burst=3;
}
# 登录接口:极严,防暴力破解
location = /login {
limit_req zone=login:5m rate=5r/m burst=1;
}
# 静态资源不限(CDN 扛着,或者浏览器缓存)
location ~* \.(jpg|css|js|png)$ {
# 不限速
}白名单处理
搜索引擎爬虫、自己的监控不能误伤:
# 用 geo 模块标记可信 IP
geo $limited_ip {
default 1;
127.0.0.1 0; # 本机
66.249.64.0/19 0; # Googlebot 段
220.181.0.0/16 0; # 百度蜘蛛段
}
map $limited_ip $limit_key {
0 ""; # 白名单:空 key,不限流
1 $binary_remote_addr; # 其他:按 IP
}
limit_req_zone $limit_key zone=one:10m rate=10r/s;三、第二道防线:限制并发连接
有些攻击不是请求快,而是连接挂着不释放(慢速攻击 Slowloris)。用 limit_conn:
http {
# 单 IP 并发连接数上限
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 全站总连接数上限(大流量兜底)
limit_conn_zone $server_name zone=perserver:10m;
server {
location / {
limit_req zone=one burst=20 nodelay;
# 单 IP 最多 10 个并发连接
limit_conn perip 10;
}
# 下载类接口更严
location /download/ {
limit_conn perip 2;
limit_rate 500k; # 单连接限速 500KB/s
}
}
}慢速攻击专用参数:
server {
# 请求头读取超时(慢速攻击靠拖延时间)
client_header_timeout 10s;
client_body_timeout 10s;
# 请求体大小限制,防恶意大包
client_max_body_size 10m;
client_body_buffer_size 128k;
# 保持连接超时
keepalive_timeout 30s;
# 发送超时
send_timeout 10s;
}四、第三道防线:恶意 UA 和扫描器拦截
CC 攻击和漏洞扫描都有明显 UA 特征,直接 403:
server {
# 拦截常见扫描器和恶意 UA(返回 444:直接断连不响应)
if ($http_user_agent ~* "(python-requests|curl|wget|scrapy|nikto|sqlmap|nmap|masscan|acunetix|nessus|bot|spider|crawler)") {
return 444;
}
# 注意:这个规则会把正常爬虫和 API 调用也拦了
# 更精细的做法:只拦明确的恶意 UA,白名单放行搜索引擎
}更精准的做法(推荐):先看日志里什么 UA 在刷,再针对性拦:
# 统计最近日志里 UA 分布
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 统计请求最多的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20看到异常再写规则,别凭感觉封。
五、第四道防线:配合 fail2ban 自动封 IP
Nginx 限流是「削峰」,fail2ban 是「封人」。看到持续恶意的 IP,直接 iptables 拉黑。
# /etc/fail2ban/jail.d/nginx.local
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log
findtime = 60
maxretry = 5
bantime = 3600配套过滤器(匹配 Nginx 的限流日志):
# /etc/fail2ban/filter.d/nginx-limit-req.conf
[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
ignoreregex =systemctl restart fail2ban
fail2ban-client status nginx-limit-req # 看封禁状态被封 1 小时,攻击者换 IP 成本变高,小规模 CC 基本就退了。更多 fail2ban 内容见fail2ban 防暴力破解实战。
六、完整配置模板
这是一套可直接用的 Nginx 防护配置:
http {
# ===== 限流区定义 =====
limit_req_zone $binary_remote_addr zone=general:10m rate=30r/s;
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
# ===== 基础安全 =====
server_tokens off;
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 30s;
client_max_body_size 10m;
server {
listen 443 ssl http2;
server_name 你的域名;
# 全局限流
limit_req zone=general burst=50 nodelay;
limit_conn perip 20;
# 登录接口严控
location = /login {
limit_req zone=login burst=2 nodelay;
limit_conn perip 2;
proxy_pass http://backend;
}
# API 接口中等限流
location /api/ {
limit_req zone=api burst=10 nodelay;
proxy_pass http://backend;
}
# 静态资源
location ~* \.(jpg|jpeg|png|webp|css|js|svg|woff2)$ {
expires 7d;
access_log off;
}
# 恶意 UA
if ($http_user_agent ~* "(sqlmap|nikto|nmap|masscan|acunetix)") {
return 444;
}
}
}七、测试:确认配置生效
# 1. 语法检查
nginx -t
# 2. 重载
systemctl reload nginx
# 3. 模拟高频请求(应该开始返回 503)
for i in $(seq 1 100); do curl -s -o /dev/null -w "%{http_code}\n" https://你的域名/; done | sort | uniq -c
# 4. 模拟并发连接
ab -n 500 -c 50 https://你的域名/ # 看是否触发限流
# 5. 看限流日志
tail -f /var/log/nginx/error.log | grep limiting八、什么时候该上高防
Nginx 防护解决「小打小闹」,以下情况说明超出 Nginx 能力:
| 现象 | 该上什么 |
|---|---|
| 带宽持续打满(CDN 回源也满) | 高防 IP / 高防包 |
| 几十 Gbps 流量攻击 | 高防(清洗后回源) |
| CC 混合流量攻击 | 高防 + WAF |
| 游戏服被攻击 | 高防 IP(UDP 防护) |
NAT 型用户的注意点:NAT 机型的流量先经过服务商网关,能不能防攻击取决于服务商网关的清洗能力。买之前问清楚:带不带基础防护、被攻击了会不会封实例。选择有清洗能力的 NAT 服务商(如财富云计算),游戏服被小流量攻击时网关能兜住,不至于直接失联。
九、常见问题
Q:限流把自己人封了?
rate 设太激进了。先看正常用户的请求频率(awk 统计日志),按峰值的 3–5 倍设。别忘了加监控和爬虫白名单。
Q:503 和 444 有什么区别?
503 是「服务不可用」,客户端知道被限了;444 是 Nginx 特色,直接关闭连接不返回任何东西,对付恶意扫描更省资源。
Q:加了 limit_req 网站变慢?burst 设太小,正常突发也被限。加大 burst,或者用 nodelay 让排队请求立即处理。
Q:日志里看不到被限的 IP?limit_req_status 默认返回 503,日志状态码能看到;但限流记录在 error.log 不在 access.log,去 error.log 找 limiting requests。
Q:CDN 之后所有请求都是 CDN 的回源 IP,limit_req 失效?
这是经典问题。回源 IP 就几个,限流等于全站限速。解决:CDN 层限流(云厂商 WAF 都有),或者 Nginx 用 $http_x_forwarded_for 取真实 IP(注意可伪造,配合 real_ip 模块)。
小结
Nginx 防护四层防线:限频率 → 限并发 → 拦恶意 UA → fail2ban 封 IP。对付百 MB 级以内的 CC 攻击足够,配置半小时搞定,零成本。真遇上大流量攻击,就得上高防,Nginx 那点算力扛不住带宽。
更多安全教程见财富云计算知识库:防火墙配置、fail2ban、DDoS 认知、安全基线全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,网关带基础清洗能力。
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]}更细的限流和防护见Nginx 限速与 CC 防护进阶。四、主流程序现成配置4.1 WordPresslocation / {[...]
2026-10-15 回复
[...]limit_conn perip 20;详细限流策略见Nginx 限速与 CC 防护进阶。四、第三层:WAF 规则fail2ban 管「频率」,WAF 管「内容」——请求里带 SQL 注入、XSS、webshell 特征的直接拦:# ModSecurity + OWASP CRS(开箱即用的规则集)[...]
2026-10-15 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复
[...]})AppSecret 是最高机密,只能存服务器,绝不能写进小程序前端代码(前端代码所有人可下载)。密钥管理见Steam API Key 与 RCON 密码安全里的同类思路。七、上线前检查清单[ ] 域名解析生效,dig 能查到[ ] ICP 备案通过,备案号已挂页面[ ] curl https://域名/health 返回 200,证书链完整[ ] HTTP 自动跳 HTTPS[ ] reque[...]
2026-10-18 回复
[...]}4. 初始化:访问域名 → 环境检查 → 填数据库 → 设管理员。进后台第一件事:关闭游客上传(除非你就是做公共图床,那先想清楚合规问题)配存储策略:本地 + 对象存储双策略,大的走对象存储开启图片处理:压缩 + WebP 转换 + 缩略图三、存储策略:本地 vs 对象存储图床的图片只增不减,硬盘迟早爆。Lsky Pro 支持多存储策略,正确姿势是:图片类型存哪理由小图(< 200KB)本[...]
2026-10-18 回复
[...]<script src="https://survey.yourdomain.com/js/formbricks.js"></script>活动报名页、用户反馈入口、满意度评价,全都能长在自己网站上——访客不用跳出去,转化率比外链高一大截。五、数据:自己收的数据自己用自托管的核心收益在数据:导出自由:CSV/Excel 随时拉,没有"导出 50 条以上要[...]
2026-10-18 回复