DDoS 与 CC 攻击:原理与防护思路

看懂网络层 DDoS 和应用层 CC 的区别,用好单机限速这道防线,也认清它扛不住大流量、必须靠 CDN 与高防的边界。

当服务器突然响应变慢、带宽被打满、CPU 飙高却没有真实业务量时,很可能遇到了 DDoS 或 CC 攻击。它们目标一致——让服务瘫痪,但作用在不同层面,防护手段也不同。

两类攻击的区别

网络层 DDoS

DDoS(分布式拒绝服务)通常发生在网络层/传输层,靠海量流量淹没你的服务器或链路。常见形式有 SYN Flood、UDP Flood、以及利用 DNS、NTP 反射放大的攻击。特征是带宽被打满、连接数暴涨,你的服务器往往还没处理到业务逻辑就已经被出口带宽拖垮。

应用层 CC

CC(Challenge Collapsar)属于应用层攻击,流量不一定大,但每个请求都很"贵"。攻击者用大量看似正常的 HTTP 请求反复打你的登录、搜索、下单等重接口,消耗数据库和 CPU。它更隐蔽,因为单个请求和真实用户几乎无异。

单机能做什么

单机防护的核心是限速、限连、识别异常、临时封禁,nginx 是最顺手的第一道闸门。

用 limitreq 限制请求速率,limitconn 限制单 IP 并发连接:

# 定义限流区(放在 http 块)
limit_req_zone  $binary_remote_addr zone=req_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;

server {
    location /login {
        limit_req  zone=req_per_ip burst=20 nodelay;
        limit_conn conn_per_ip 10;
    }
}

burst 允许短时突发,nodelay 让突发请求立即处理而非排队。

识别异常可以从访问日志入手,统计高频来源 IP:

# 统计访问量 Top 20 的来源 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

对确认的恶意 IP,可临时封禁(务必设过期时间,避免误伤):

# 临时封 IP,配合 fail2ban 更好
sudo ufw deny from 203.0.113.10

生产上更推荐用 fail2ban 按日志规则自动封禁并到期解封,而不是手工维护黑名单。

单机防护的边界

必须说清楚:这些手段挡不住真正的大流量 DDoS。 当攻击带宽是你出口带宽的几十倍时,包在到达 nginx 之前就把链路塞死了,机器上任何配置都无从谈起。单机限速真正有效的场景,是中小规模的 CC 和异常爬取。

真正扛量要靠上游:

  • CDN:把静态内容和流量分散到边缘节点,吸收并过滤大部分请求。
  • 高防 IP / 流量清洗:引流到清洗中心,过滤掉攻击流量后再回源。
  • 隐藏源站:这是最关键也最容易被忽视的一步。一旦真实源站 IP 泄露,攻击者可绕过 CDN 直接打你。务必只允许 CDN/高防的回源 IP 访问源站(用防火墙或安全组锁定),并检查邮件、DNS 历史记录、错误页等是否泄露了源 IP。

小结

DDoS 拼的是带宽,CC 拼的是请求成本。单机上用 nginx 的 limitreq/limitconn、日志分析和 fail2ban 能有效缓解中小规模应用层攻击,是必备的基本功;但面对大流量 DDoS,单机无解,必须依赖 CDN、高防清洗,并把隐藏源站当成头等大事。防护是分层的:单机守住应用层,上游扛住网络层,两者缺一不可。