服务器被 DDoS 攻击,低预算防护方案

服务器被DDoS攻击,对于个人站长或小企业来说很头疼——上高防IP成本太高,什么都不做又扛不住。
本文从零开始,教你一套低预算防护方案,核心思路是隐藏真实IP、本地限流、自动封杀,全部免费或接近免费。

低成本防御思路:先躲再挡

传统DDoS攻击需要先知道你的真实服务器IP。
如果能把真实IP藏起来,大部分流量就会被CDN挡在外面。
即便攻击打到服务器,也可以通过本地规则限制并发连接、自动封禁异常IP。
这套组合对中小型CC攻击(100-500QPS) 效果明显,成本接近零。

第一步:用免费CDN隐藏真实IP

推荐使用 Cloudflare 免费版(或国内百度云加速免费版)。
核心操作分三步:

  1. 注册并添加域名:将域名DNS解析托管到Cloudflare。
  2. 开启代理(橙色云朵):确保A记录或CNAME记录代理状态为“Proxied”,这样所有访问都会经过Cloudflare节点。
  3. 开启“Under Attack”模式:在Cloudflare仪表盘 → Firewall → Settings → 将Security Level临时调为“I'm Under Attack!”。这会启用JS质询,过滤掉绝大部分机器人。
  4. 隐藏真实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隐藏、本地限流、自动封禁**结合起来,每层只分担一部分压力。如果你正在为此发愁,不妨先按本文配置一遍,再根据实际攻击类型微调。遇到问题欢迎留言讨论。
分享到:
上一篇
Docker 镜像被植入后门?教你一键检测
下一篇
用 AI 写 Python 爬虫
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意