网站一到大促或上新就被打,带宽被塞满、CPU 飙到 100%、后台都登不进去——这是很多站长和运营团队都经历过的噩梦。DDoS(分布式拒绝服务)和 CC(Challenge Collapsar,应用层连接攻击)是当前互联网上最泛滥的两类攻击,打的就是你没有防护的源站。本文先帮你分清攻击类型,再给出从内核参数、防火墙到 Nginx 限流、高防 CDN 联动的完整防护方案,全部配置可以直接复制使用。
一、先分清你的网站被打的是哪种攻击
防护的前提是认清敌人,两类攻击的原理完全不同:
1. 流量型 DDoS(网络层/传输层)。攻击者控制大量肉鸡或利用反射放大技术,向你的服务器 IP 发送海量 SYN、UDP、ICMP 数据包,直接打爆带宽和交换机。特征是:服务器带宽瞬时跑满、ping 不通、Nginx 报大量 connection timeout。
2. CC 攻击(应用层)。攻击者模拟真实浏览器行为,持续发起大量看似正常的 HTTP 请求(比如频繁刷新首页、搜索接口),耗尽服务器 CPU 和数据库连接。特征是:带宽正常但 CPU 100%、Nginx 日志里同一 IP 高频访问同一 URL、数据库连接数爆表。
两者常常叠加出现:先用流量型打崩带宽,再用 CC 消耗应用资源。所以完整的方案必须是”网络层清洗 + 应用层限流”双管齐下。
二、服务器层基础防护:内核参数 + 防火墙限速
这一层解决”小规模攻击时源站自己扛得住”,配置在 SSH 中执行,长期有效。
1. 内核参数优化(防 SYN Flood)
# 编辑内核参数文件
cat >> /etc/sysctl.conf <<'EOF'
# 开启 SYN Cookies,半连接队列被塞满时依然能正常建立连接
net.ipv4.tcp_syncookies = 1
# 缩短 SYN 重试次数,加快清理半连接
net.ipv4.tcp_syn_retries = 2
# 增大半连接与全连接队列,扛住突发
net.ipv4.tcp_max_syn_backlog = 2048
net.core.somaxconn = 2048
# 缩短 TIME_WAIT 复用,减少资源占用
net.ipv4.tcp_tw_reuse = 1
# 关闭 ICMP 重定向与广播响应,减少被反射利用的可能
net.ipv4.icmp_echo_ignore_broadcasts = 1
EOF
# 立即生效
sysctl -p
2. iptables 限速(防 UDP/ICMP 洪泛)
# 对 ICMP 限速,超过 5 个/秒的 ping 直接丢弃
iptables -A INPUT -p icmp -m limit --limit 5/s -j ACCEPT
iptables -A INPUT -p icmp -j DROP
# 限制单 IP 新建 TCP 连接速率,防止握手风暴
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 丢弃畸形包和广播包
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp -j DROP
# 保存规则(CentOS 7+ / Ubuntu)
service iptables save
注意:如果你后面接入了高防 CDN,源站防火墙应只放行 CDN 回源 IP,其他来源一律拒绝,否则攻击者绕过 CDN 直连源站 IP 依然能打崩你。
三、应用层防护:Nginx 限流防 CC 攻击
CC 攻击靠的是”看似正常的请求”,Nginx 的 limit_req 和 limit_conn 模块是成本最低的防线。在 Nginx 配置的 http 块中定义限流规则:
# http 块中定义:每个 IP 每秒最多 5 个请求,超出进入 10MB 队列
limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=5r/s;
# 限制单个 IP 的并发连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
# 对全站请求限流,超出后返回 503 并加入黑名单缓存
location / {
limit_req zone=cc_limit burst=10 nodelay;
limit_conn conn_limit 20;
limit_req_status 503;
# 触发限流后记录日志,便于事后分析
access_log /www/wwwlogs/cc_block.log;
}
# 对登录、下单等敏感接口单独收紧:每秒 2 个
location ~* ^/(wp-login\.php|api/|cart) {
limit_req zone=cc_limit burst=5 nodelay;
limit_req_status 429;
}
}
配合 fail2ban 效果更好:监控 Nginx 错误日志里 503/429 频发的 IP,自动封禁。规则写法与 WordPress 教程中的 fail2ban 配置相同,只需把 failregex 改成匹配 503 状态码的请求即可。这里注意:Nginx 限流只能消耗攻击者的资源,面对上万 QPS 的分布式 CC,还得靠下面这层。
四、高防 CDN + WAF 联动:真正的兜底方案
当攻击流量超过服务器带宽(比如 100Gbps 的 UDP Flood),源站再怎么优化内核都无济于事——带宽已经满了。这时候必须把流量引到具备大带宽清洗能力的云端:
1. 高防 CDN 隐藏源站。把域名解析切到高防 CDN,回源走白名单,源站 IP 对公网隐藏。攻击者打不到源站,只能打高防节点,由清洗集群在入口层把攻击流量直接丢弃。
2. WAF 规则兜底。在高防控制台开启 CC 防护策略:按 IP/地域/会话维度限速,配置人机校验(JS 挑战、滑块验证),拦截高频异常 UA 和恶意指纹。
3. 容量评估。选购防护套餐时按”日常峰值 × 2 + 预留”评估,例如业务峰值 10Gbps,建议选 20Gbps 以上的防护容量,避免攻击流量刚好卡在套餐边缘反复触发黑洞。
以速度网络的高防方案为例,它同时提供 DDoS 流量清洗、CC 人机识别和 WAF 规则拦截,并支持按需弹性扩容,配合本文的服务器层配置即可形成”云端清洗 + 源站限流”的立体防护。接入后记得在源站只放行 CDN 回源 IP,并测试一下回源链路是否顺畅。
五、总结
DDoS/CC 防护的正确姿势是分层设防:内核参数和防火墙挡住小规模骚扰,Nginx 限流消化应用层 CC,高防 CDN 承担大流量清洗。三层缺一不可,单靠任何一层都扛不住规模化攻击。另外提醒两点:一是攻击发生后保留抓包和日志,便于溯源取证;二是提前准备好应急预案,明确切换高防的触发阈值(如带宽占用超 60% 持续 5 分钟即切换),别等被打挂了才临阵磨枪。
服务器安全防护是一场持久战,建议把本文的配置纳入服务器初始化脚本,新机器上线即默认具备基础防护能力。
