返回列表 发布新帖
查看: 11|回复: 0

如何在源站防止网站被恶意刷流量

发表于 5 小时前 | 查看全部 |阅读模式

这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在许多小型网站或内网应用中,仍然存在未接入 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:
max_connections = 200
避免高峰直接打死数据库。
2. 分离动态接口与静态资源
如果所有请求都访问数据库,压力非常大。
应将:
  • 图片
  • JS
  • CSS
  • 页面的缓存
  • 频繁访问的列表页
尽量静态化。
七、日志分析:找到攻击来源并封禁
查看 Nginx 日志:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
即:
  • 列出访问量最多的 IP
  • 高访问量 IP 直接封禁
封禁方式:
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)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2025 Suike Tech All Rights Reserved. 随客交流社区 (备案号:津ICP备19010126号) |Processed in 0.107397 second(s), 7 queries , Gzip On, MemCached On.
关灯 在本版发帖返回顶部
快速回复 返回顶部 返回列表