|
|
这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在许多小型网站或内网应用中,仍然存在未接入 CDN 的情况。此时,如果遭遇恶意刷流量、爬虫攻击、高频请求,源站服务器会直接承受压力,轻则 CPU 飙高卡顿,重则 502/504,甚至整个网站不可用。
那么在没有 CDN 的情况下,如何让源站尽可能抗住恶意流量?
本文从系统层、防火墙、应用层三个维度给出完整方案,帮助你构建 源站级别的抗刷防御体系。
一、源站为什么容易被刷挂?
源站直接对外暴露,所有请求(正常 + 恶意)都会进入:
- CPU 直接处理请求
- 带宽直接被占满
- 数据库会被打爆(最容易出问题)
- PHP、Node、Java 等后台线程会被占满
- Nginx/Apache 会产生大量连接等待
尤其在 VPS、轻量服务器、1C2G 小机型中,一个简单的高频攻击就能让服务器彻底失去响应。
因此,源站必须有多层防护,而不是只靠应用本身。
二、源站防刷的核心策略(必须多层组合)
无 CDN 时要在源站实现三层防御:
- 系统层(最低层) → 防火墙层(中间层) → 应用层(最高层)
三者缺一不可。
三、系统层防护:限制连接 + 限速 + 防 SYN Flood
这是源站抗刷最关键的底层配置。
1. 使用 iptables/ufw 设置频率限制(最有效)
大量攻击会从同一 IP 来,因此可以限制:
限制单 IP 每秒请求次数
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/second --limit-burst 100 -j ACCEPT 超过频率的请求会被丢弃。
2. 使用 iptables 限制单 IP 同时连接数
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP 可有效阻止大量并发连接攻击。
3. 防止 SYN 半连接攻击
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP 4. 如果是 Linux,可开启 SYN Cookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies 稳定性显著提高。
四、防火墙层防护:封禁恶意 IP、高频 IP
无 CDN 时,fail2ban 是高性价比方案。
1. 使用 fail2ban 自动封禁刷流量的 IP
fail2ban 可监控 Nginx、Apache、SSH 的日志,一旦发现高频访问,会自动封 IP。
配置示例:
/etc/fail2ban/jail.local
[nginx-limit-req]
enabled = true
filter = nginx-req
action = iptables-allports[name=HTTP, protocol=tcp]
logpath = /var/log/nginx/access.log
findtime = 10
maxretry = 100
bantime = 3600 过滤规则 /etc/fail2ban/filter.d/nginx-req.conf
[Definition]
failregex = ^ .*$ 意思是某 IP 在 10 秒超过 100 次访问 → 封 1 小时。
这种方法对爬虫、脚本攻击特别有效。
五、应用层防护(Nginx / Apache / PHP / Node)
这是最直接的限流手段,建议所有网站都启用。
1. Nginx 限制访问频率(必开)
Nginx 内置限速模块,非常高效。
限制每秒请求次数
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
server {
location / {
limit_req zone=req_limit_per_ip burst=20 nodelay;
}
} 效果:
每秒超过 10 次的请求 → 返回 503
大部分脚本攻击无法突破
2. 限制并发连接数
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
limit_conn addr 20;
} 单 IP 最大 20 并发。
3. 限制 User-Agent / 空 UA 访问
if ($http_user_agent ~* (curl|python|scrapy|bot|spider)) {
return 403;
}
if ($http_user_agent = "") { return 403; } 大量攻击使用这些 UA。
4. 限制 Referer(防盗刷 + 防恶意)
if ($http_referer = "") { return 403; } 恶意脚本通常不带 Referer。
5. 页面/接口独立限速
对于接口(如 /api/),设置更严格:
location /api/ {
limit_req zone=req_limit_per_ip burst=5 nodelay;
} 六、数据库层的防刷
刷流量本质上也是并发问题,数据库最容易爆。
1. 设置数据库连接池最大连接
例如 MySQL:
避免高峰直接打死数据库。
2. 分离动态接口与静态资源
如果所有请求都访问数据库,压力非常大。
应将:
尽量静态化。
七、日志分析:找到攻击来源并封禁
查看 Nginx 日志:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head 即:
封禁方式:
iptables -A INPUT -s 1.2.3.4 -j DROP 八、总结:源站防刷必须多层配合
如果没有使用 CDN,那么必须:
系统层
- iptables 限速
- 限连接
- SYN Cookies
- 防 SYN Flood
防火墙层
- fail2ban 自动封禁
- 黑名单
- 阻断异常国家/机房
应用层
- Nginx 限速
- 限并发
- 空 UA 拦截
- API 限速
- 日志分析封 IP
最终建议
无 CDN 环境下,源站抗刷需要多层组合,不可能靠某一个配置解决问题。
如果攻击规模太大(例如几百万请求/小时),源站再怎么优化也扛不住,必须:
- 上 CDN
- 或者使用高防 IP
- 或者使用反向代理层(例如 Nginx+Lua)
|
|