13 10 月 2026

网站被 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 机型省一半以上,网关带基础清洗能力。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:HTTPS 强制跳转与安全响应头配置:安全评分冲到 A+
  2. 下一篇:Redis 未授权访问防护:从被入侵到彻底加固
发表评论 6