服务器被 DDoS 攻击了怎么办?防御方案与紧急处置步骤详解
- 一、什么是 DDoS 攻击?常见类型速览
- 二、如何判断是否真的遭受了 DDoS?
- 三、紧急处置 5 步流程(正在被攻击时看这里)
- 四、主流防御方案对比与选型
- 五、Cloudflare 免费防护配置全流程
- 六、Nginx 层面的 CC 攻击防护配置
- 七、事前预防:降低被攻击影响的 7 个措施
- 八、常见问题解答(FAQ)
一、什么是 DDoS 攻击?常见类型速览
DDoS(分布式拒绝服务攻击)是攻击者控制大量"肉鸡"(被入侵的设备)同时向目标服务器发送海量请求,耗尽服务器的带宽、CPU 或内存资源,导致正常用户无法访问。
| 攻击类型 | 攻击层 | 原理 | 典型症状 |
|---|---|---|---|
| UDP Flood | 网络层(L3) | 海量 UDP 数据包打满带宽 | 带宽跑满,服务器完全不可达 |
| SYN Flood | 传输层(L4) | 发送大量半连接请求耗尽连接表 | 新连接无法建立,已有连接正常 |
| HTTP Flood(CC 攻击) | 应用层(L7) | 模拟正常用户发送海量 HTTP 请求 | CPU 飙升,页面响应极慢或 502 |
| DNS 放大攻击 | 网络层(L3) | 利用 DNS 服务器放大流量 | 带宽被占满,服务不可用 |
| 慢速攻击(Slowloris) | 应用层(L7) | 保持大量未完成的 HTTP 连接 | 连接数耗尽,服务器无响应 |
二、如何判断是否真的遭受了 DDoS?
服务器变慢或不可访问不一定是 DDoS,可能是代码 bug、流量高峰或硬件故障。先执行以下诊断命令确认:
# 1. 查看当前网络连接数(正常应在几百以内)
ss -s
# 2. 查看连接数最多的 IP(前 20)
netstat -ntu | awk '{print $5}' | cut -d: -f1 \
| sort | uniq -c | sort -rn | head -20
# 3. 查看每秒新建连接数(持续执行观察趋势)
watch -n 1 "ss -s | grep estab"
# 4. 查看带宽占用(需安装 nload)
apt install -y nload && nload
# 5. 查看 Nginx 访问日志中请求最多的 IP
awk '{print $1}' /var/log/nginx/access.log \
| sort | uniq -c | sort -rn | head -20
# 6. 查看每秒请求数(持续 10 秒)
for i in $(seq 1 10); do
echo "$(date): $(grep "$(date '+%d/%b/%Y:%H:%M:%S')" \
/var/log/nginx/access.log | wc -l) req/s"
sleep 1
done| 诊断指标 | 正常范围 | 异常信号 |
|---|---|---|
| TCP 连接总数 | < 1000 | > 5000,持续增长 |
| 单个 IP 连接数 | < 20 | > 100,来自同一 IP |
| Nginx 请求数/秒 | 平时基准的 2 倍以内 | 突然增长 10 倍以上 |
| 服务器带宽占用 | < 70% | 持续 100%,且无法访问 |
| CPU 占用 | < 70% | 持续 100%,主要是 nginx/ksoftirqd |
三、紧急处置 5 步流程(正在被攻击时看这里)
🚨 紧急情况处置流程
如果你的服务器正在遭受攻击,按以下顺序快速操作:
1 立即启用 Cloudflare「我正在受到攻击」模式
如果域名已接入 Cloudflare,这是最快的缓解手段,30 秒内生效:
- 登录 Cloudflare 控制台 → 选择对应域名
- 点击左侧「安全性」→「设置」
- 将「安全级别」切换为 「我正在受到攻击!」
- 所有访问者会看到 5 秒 JS 验证页面,自动化攻击脚本无法通过
2 用 iptables 临时封禁攻击 IP 段
# 封禁单个 IP iptables -I INPUT -s 攻击IP -j DROP # 封禁整个 IP 段(如 1.2.3.0/24) iptables -I INPUT -s 1.2.3.0/24 -j DROP # 批量封禁(从文件读取 IP 列表) while read ip; do iptables -I INPUT -s $ip -j DROP done < attack_ips.txt # 查看当前封禁规则 iptables -L INPUT -n --line-numbers | head -30 # 保存规则(重启后生效) iptables-save > /etc/iptables/rules.v4
3 限制 Nginx 连接数和请求速率
nano /etc/nginx/nginx.conf
在 http 块中添加限速配置:
# 定义限速区域(基于客户端 IP)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
# 每个 IP 最多 10 个并发连接
limit_conn conn_limit 10;
# 每个 IP 每秒最多 10 个请求,突发最多 20 个
limit_req zone=req_limit burst=20 nodelay;
# 超出限制返回 429(请求过多)
limit_req_status 429;
limit_conn_status 429;
}nginx -t && systemctl reload nginx
4 联系服务商启动黑洞路由(带宽层攻击时)
如果攻击流量超过服务器带宽上限(如服务器带宽 100Mbps 但攻击流量达到 10Gbps),服务器本身无能为力,需要服务商在上游网络层介入。
- 黑洞路由(Null Route):服务商将你的 IP 流量全部丢弃,服务器完全不可访问但带宽不再被占用。适合攻击持续时间长的情况。
- IP 切换:更换服务器 IP,将域名指向新 IP,让攻击流量打向废弃 IP。需要域名 TTL 较低才能快速生效。
- 流量清洗:服务商将流量引导到清洗中心,过滤恶意流量后再转发给服务器。部分服务商提供免费基础清洗服务。
5 切换到备用节点,保障业务连续性
如果主服务器已无法正常服务,立即将域名解析切换到备用节点(如 CDN 缓存页面或备用服务器):
# 临时将域名解析到 Cloudflare 的代理 IP # 在 Cloudflare DNS 控制台开启小橙云(代理模式) # 真实 IP 被隐藏,攻击者无法直接攻击服务器 # 将 TTL 设置为最低值(60 秒)提升切换速度 # 在 Cloudflare 或 DNSPod 控制台修改
四、主流防御方案对比与选型
| 防御方案 | 防御能力 | 价格 | 适用场景 | 推荐度 |
|---|---|---|---|---|
| Cloudflare 免费版 | CC/L7 攻击,5Gbps 以内 L3/L4 | 免费 | 中小网站首选 | ⭐⭐⭐⭐⭐ |
| Cloudflare Pro | 更强的 WAF 规则,高级 Bot 防护 | $20/月 | 有一定流量的商业站 | ⭐⭐⭐⭐⭐ |
| Nginx 限速 | CC 攻击(应用层) | 免费 | 配合 Cloudflare 使用 | ⭐⭐⭐⭐ |
| Fail2Ban | 扫描、暴力破解 | 免费 | SSH/Web 登录防护 | ⭐⭐⭐⭐ |
| 高防 IP / 流量清洗 | T 级大流量攻击 | 数百至数千元/月 | 金融、游戏等高价值目标 | ⭐⭐⭐ |
| 黑洞路由 | 任何规模(但服务不可用) | 免费(服务商提供) | 攻击超过带宽上限的紧急处置 | ⭐⭐⭐ |
五、Cloudflare 免费防护配置全流程
1 将域名接入 Cloudflare
- 注册 Cloudflare 账号,点击「添加站点」输入你的域名
- 选择免费套餐,Cloudflare 会自动扫描现有 DNS 记录
- 确认 DNS 记录正确后,将域名的 NS 服务器改为 Cloudflare 提供的 NS 地址(在域名注册商处修改)
- 等待 NS 生效(通常 5–30 分钟),Cloudflare 控制台显示「有效」即成功
2 关键安全配置
| 配置项 | 位置 | 推荐设置 | 作用 |
|---|---|---|---|
| SSL/TLS 模式 | SSL/TLS → 概述 | 完全(严格) | 强制 HTTPS,防止中间人攻击 |
| 安全级别 | 安全性 → 设置 | 中 | 平衡安全与用户体验 |
| Bot Fight Mode | 安全性 → 机器人 | 开启 | 自动拦截已知恶意爬虫 |
| Browser Integrity Check | 安全性 → 设置 | 开启 | 验证访问者有正常浏览器 |
| Challenge Passage | 安全性 → 设置 | 30 分钟 | 通过验证后免挑战时间 |
| Always Use HTTPS | SSL/TLS → 边缘证书 | 开启 | 自动将 HTTP 跳转 HTTPS |
| 小橙云(代理) | DNS → 各 A 记录 | 开启 | 隐藏真实 IP,攻击者无法绕过 CF |
3 创建自定义防火墙规则(免费版支持 5 条)
进入「安全性」→「WAF」→「防火墙规则」→「创建规则」:
| 规则名称 | 匹配条件 | 动作 |
|---|---|---|
| 封禁高风险国家 | 国家/地区 不在 [CN, HK, TW, US, SG...] | 质询(JS 验证) |
| 保护 wp-login | URI 路径 等于 /wp-login.php 且 不是已知机器人 | 质询 |
| 封禁恶意 UA | 用户代理 包含 [zgrab, masscan, sqlmap] | 封锁 |
| 放行合法爬虫 | 已知机器人 等于 true | 允许 |
| 限制 API 速率 | URI 路径 开头为 /api/ 且 速率超过 100/min | 质询 |
六、Nginx 层面的 CC 攻击防护配置
即使有 Cloudflare,Nginx 层面的限速也是必要的第二道防线(防止攻击者找到真实 IP 绕过 CF):
nano /etc/nginx/nginx.conf
http {
# ── 限速区域定义 ────────────────────────────
# 基于真实 IP(需配合 Cloudflare 的真实 IP 透传)
limit_req_zone $binary_remote_addr zone=global:20m rate=20r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
# ── 连接超时优化(防 Slowloris 慢速攻击)───────
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 30s;
send_timeout 10s;
server {
# 每 IP 最多 50 个并发连接
limit_conn perip 50;
# 全局每秒 20 个请求
limit_req zone=global burst=50 nodelay;
# 登录页面严格限速(每秒 1 次)
location ~ ^/(wp-login|login|signin|admin) {
limit_req zone=login burst=5 nodelay;
limit_req_status 429;
}
# 配合 Cloudflare 获取真实客户端 IP
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
real_ip_header CF-Connecting-IP;
}
}
nginx -t && systemctl reload nginx
七、事前预防:降低被攻击影响的 7 个措施
| # | 措施 | 作用 | 难度 |
|---|---|---|---|
| 1 | 域名接入 Cloudflare 并开启代理(隐藏真实 IP) | 攻击者无法找到服务器真实 IP | 低 |
| 2 | 配置 Nginx 限速(limit_req / limit_conn) | 限制单 IP 请求频率,削弱 CC 攻击 | 低 |
| 3 | 安装 Fail2Ban 防护 SSH 和 Web 登录 | 自动封禁暴力破解 IP | 低 |
| 4 | 开启页面静态缓存(WordPress + Redis/WP Rocket) | 减少动态请求,服务器抗压能力大幅提升 | 中 |
| 5 | 设置服务器内存/CPU 过载告警 | 攻击初期第一时间感知 | 中 |
| 6 | 定期备份数据(本地 + 异地) | 即使服务器被打垮,数据不会丢失 | 低 |
| 7 | 准备备用 IP 和快速切换预案 | 攻击发生时快速恢复业务 | 中 |
八、常见问题解答(FAQ)
Q1:小网站也会被 DDoS 攻击吗?攻击者为什么要攻击我?
会。很多 DDoS 攻击并非针对特定目标,而是自动化脚本的随机扫描和攻击,小网站同样会中招。此外,竞争对手恶意攻击、勒索(支付比特币才停止攻击)、黑客练手等也是常见动机。任何有公网 IP 的服务器都面临被攻击的风险。
Q2:Cloudflare 免费版能防多大规模的 DDoS 攻击?
Cloudflare 免费版对 CC 攻击(HTTP Flood)防护能力非常强,理论上没有上限,因为攻击流量由 Cloudflare 的全球网络承担而非你的服务器。对于网络层攻击(UDP/SYN Flood),免费版可抵御约 5Gbps 以内的流量。超过此规模需要 Cloudflare Enterprise 或专业高防服务。
Q3:如何防止攻击者绕过 Cloudflare 直接攻击服务器 IP?
核心原则是不泄露真实 IP。具体措施:所有 DNS 记录开启 Cloudflare 代理(小橙云);更换过一次 IP 的历史记录会在各种数据库中留存,更换 IP 后检查是否还有老 IP 的 DNS 记录;Nginx 日志、SSL 证书历史、邮件头等都可能暴露真实 IP,需逐一排查;同时在服务器防火墙只放行来自 Cloudflare IP 段的流量。
Q4:被 DDoS 攻击期间,如何通过 VNC 控制台操作服务器?
即使服务器因攻击导致 SSH 无法连接,云平台的 VNC 控制台走的是独立的管理网络,不受 DDoS 影响,通常仍可正常使用。后浪云用户登录 my.idc.net,在服务器管理页面找到「VNC 控制台」即可访问。
Q5:后浪云香港服务器有 DDoS 防护能力吗?
后浪云香港服务器机房具备基础 DDoS 流量清洗能力,可抵御常规规模的攻击。对于需要更高防护级别的业务(如游戏、金融),建议在服务器前端接入 Cloudflare,并联系后浪云技术支持咨询定制高防方案。遭受攻击时可通过 Telegram 或工单 7×24 小时联系技术支持处置。
