服务器被 DDoS 攻击,低预算防护方案
服务器被DDoS攻击,对于个人站长或小企业来说很头疼——上高防IP成本太高,什么都不做又扛不住。
本文从零开始,教你一套低预算防护方案,核心思路是隐藏真实IP、本地限流、自动封杀,全部免费或接近免费。
低成本防御思路:先躲再挡
传统DDoS攻击需要先知道你的真实服务器IP。
如果能把真实IP藏起来,大部分流量就会被CDN挡在外面。
即便攻击打到服务器,也可以通过本地规则限制并发连接、自动封禁异常IP。
这套组合对中小型CC攻击(100-500QPS) 效果明显,成本接近零。
第一步:用免费CDN隐藏真实IP
推荐使用 Cloudflare 免费版(或国内百度云加速免费版)。
核心操作分三步:
- 注册并添加域名:将域名DNS解析托管到Cloudflare。
- 开启代理(橙色云朵):确保A记录或CNAME记录代理状态为“Proxied”,这样所有访问都会经过Cloudflare节点。
- 开启“Under Attack”模式:在Cloudflare仪表盘 → Firewall → Settings → 将Security Level临时调为“I'm Under Attack!”。这会启用JS质询,过滤掉绝大部分机器人。
- 隐藏真实IP:在网站服务器上只放行Cloudflare IP范围(官方列表:https://www.cloudflare.com/ips-v4)。用宝塔面板的话,在安全 → 防火墙规则中添加“只允许CF IP访问80/443端口”。
关键命令(如果使用裸机运维):
# 仅允许Cloudflare IP访问HTTP/HTTPS(动态获取最新列表)
curl -s https://www.cloudflare.com/ips-v4 | while read ip; do
sudo ufw allow from $ip to any port 80,443 proto tcp
done
sudo ufw deny 80/tcp
sudo ufw deny 443/tcp
注意:执行前确保已经放行了SSH端口,否则断开连接。
第二步:服务器本地限流与自动封禁
即使有CDN,攻击流量还是可能穿透或直接打你的真实IP(比如历史DNS记录泄露)。
需要在服务器上增加第二道防线。
2.1 宝塔面板设置连接数限制
- 进入 宝塔面板 → 安全 → IP规则 → 添加规则,类型选“限制连接数”,填写
80端口,最大连接数20,超时60秒。 - 同样为
443端口添加一条规则。 - 此外,在 网站 → 对应网站 → 流量限制 中,可以限制单IP并发连接数(设为10-30)和请求频率(每秒3-5次)。
2.2 使用fail2ban自动封禁攻击IP
fail2ban 是一个自动扫描日志并封禁IP的工具。
安装与配置:
# Debian/Ubuntu
sudo apt update && sudo apt install fail2ban -y
# CentOS 7+
sudo yum install fail2ban -y
创建自定义规则文件 /etc/fail2ban/jail.local:
[DEFAULT]
ignoreip = 127.0.0.1/8 <你的管理IP> # 放行你的管理IP
bantime = 3600 # 封禁1小时
findtime = 600 # 10分钟内触发则封
maxretry = 5 # 超过5次错误请求就封
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
# 针对Nginx CC攻击(需要nginx开启访问日志)
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 30 # 30次请求/10秒视为异常
配置完成后重启服务:
sudo systemctl restart fail2ban
sudo fail2ban-client status
查看被封锁的IP:`sudo fail2ban-client status nginx-botsearch`。
## 第三步:进阶优化——系统内核参数
当攻击流量非常大时,服务器TCP连接表可能爆满。编辑 `/etc/sysctl.conf`,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.core.somaxconn = 1024
执行 `sysctl -p` 立即生效。这些参数能减轻SYN Flood攻击对服务器资源的消耗。
## 常见问题与避坑指南
**Q1:没有域名可以用CDN吗?**
> 不能。必须是域名才能接入Cloudflare免费CDN。如果只有IP,只能依靠本地防护,建议购买最低25元/月的轻量高防IP(如腾讯云、阿里云)。
**Q2:用了CDN为什么还是被攻击?**
> 常见原因是真实IP暴露(如网站源码内嵌了服务器IP、历史DNS记录未删除、子域名未代理)。请检查所有子域名,务必全部开启代理。
**Q3:fail2ban会不会误封正常用户?**
> 有可能。建议先设置较低封禁权限(例如只封120分钟),并放行你自己的管理IP。如果出现大面积误封,可提高`findtime`和`maxretry`阈值。
**避坑提醒:**
- 不要只依赖免费CDN,因为CDN本身也可能被打穿。本地防护必须同步做。
- 不要关闭服务器上的HTTPS或HTTP端口,否则CDN回源不了。
- 免费方案对超过1Gbps的攻击无力回天,此时建议临时更换IP或升级付费抗D。
## 验证方法:确认防护已生效
1. **查看服务器网络流量**:宝塔面板 → **监控 → 网络**,观察攻击时流量曲线是否变平缓。
2. **手动模拟攻击(仅测试)**:用 ab 或 siege 小规模压测,检查fail2ban和连接数限制是否生效:`ab -n 1000 -c 50 http://你的域名/`,然后查看`sudo fail2ban-client status nginx-botsearch`。
3. **访问网站是否正常**:从普通浏览器访问,应该能正常打开。如果出现CF 503错误,说明Under Attack模式太严格,可降低安全等级。
## 写在最后
这套低预算DDoS防护方案已在我自己的多台服务器上稳定运行两年,扛过不少CC攻击。关键是把**CDN隐藏、本地限流、自动封禁**结合起来,每层只分担一部分压力。如果你正在为此发愁,不妨先按本文配置一遍,再根据实际攻击类型微调。遇到问题欢迎留言讨论。