服务器被攻击了怎么办?本文结合真实案例,详解DDoS攻击的识别、防御策略与应急响应流程,让你的云服务器安全无忧。
前言
凌晨3点,你的手机突然疯狂震动。
打开一看:监控告警——CPU 100%、内存爆满、服务器连接超时、业务全线崩溃。
你揉了揉眼睛,打开服务器一看:尼玛,登录日志里有十几万个来自不同IP的登录尝试!
这就是DDoS攻击——分布式拒绝服务攻击。它不需要破解你的密码,只需要用海量请求把你的服务器资源耗尽,让正常用户无法访问。
作为一个在云服务器上摸爬滚打多年的老司机,今天来聊聊DDoS防护实战经验。
一、认识DDoS攻击
1.1 DDoS是什么?
DDoS(Distributed Denial of Service) 即分布式拒绝服务攻击。攻击者通过控制大量计算机(僵尸网络),同时向目标服务器发送海量请求,耗尽其带宽、CPU、内存等资源,导致正常用户无法访问。
简单理解:就像有十万个人同时给你家门口打电话,让你正常的访客根本进不来。
1.2 常见的DDoS攻击类型
| 攻击类型 | 攻击原理 | 危害程度 | 防御难度 |
|---|---|---|---|
| SYN Flood | 伪造TCP握手包,耗尽连接队列 | ⭐⭐⭐ | ⭐ |
| UDP Flood | 发送大量UDP数据包,带宽耗尽 | ⭐⭐⭐⭐ | ⭐⭐ |
| HTTP Flood | 模拟正常请求,耗尽应用资源 | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| CC攻击 | 攻击动态页面,数据库连接耗尽 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| DNS Flood | 攻击DNS服务器,导致解析失败 | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 混合型攻击 | 多种攻击同时进行 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
1.3 如何判断服务器被攻击?
紧急告警信号:
# 1. CPU/内存异常飙升
top -c
# 查看进程占用,看到大量不明进程或CPU100%
# 2. 网络流量异常
sar -n DEV 1 10
# 观察网卡流量,发现入站流量暴增
# 3. 连接数异常
netstat -anp | grep ESTABLISHED | wc -l
# ESTABLISHED连接数高达数万
# 4. 查看登录失败日志
grep "Failed password" /var/log/auth.log | tail -100
# 大量来自不同IP的失败登录尝试
# 5. 检查端口连接状态
netstat -s | grep -i listen
# 半开连接队列满
典型特征:
- 服务器突然响应极慢或完全无法访问
- 监控显示入站流量暴增10倍以上
- SSH连接困难或频繁断开
- 日志出现大量异常请求
二、DDoS防护实战策略
2.1 第一道防线:云厂商DDoS防护
主流云厂商都提供了DDoS防护服务,这是最基础也是最有效的防护手段:
| 云厂商 | 防护服务 | 免费额度 | 说明 |
|---|---|---|---|
| 腾讯云 | DDoS基础防护 | 2Gbps | 自动开启,无需付费 |
| 腾讯云 | BGP高防 | 10G-100G | 付费,按量计费 |
| 阿里云 | DDoS基础防护 | 5Gbps | 自动开启 |
| 阿里云 | DDoS高防 | 20G-300G | 付费,按量计费 |
| 华为云 | Anti-DDoS | 5Gbps | 免费开启 |
腾讯云DDoS防护配置:
# 查看当前DDoS防护状态
tccli ant DDoS describeuebaStatus --BasicIp xx.xx.xx.xx --BasicRegion ap-guangzhou
# 开启DDoS防护(自动)
# 注:基础防护默认开启,无需手动配置
# 查看攻击日志
tccli ant DDoS describeAttackLogList --Offset 0 --Limit 20
2.2 第二道防线:iptables/firewalld应急处理
在云厂商防护生效前,先用服务器自带防火墙应急:
#!/bin/bash
# DDoS应急处理脚本
# 1. 立即限制新连接速率
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT
# 2. 封禁异常IP(假设攻击IP列表)
for ip in $(cat /tmp/attack_ips.txt); do
iptables -I INPUT -s $ip -j DROP
echo "已封禁: $ip"
done
# 3. 限制单个IP连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j DROP
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 100 -j DROP
# 4. 启用syncookies防止SYN Flood
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# 5. 保存iptables规则
iptables-save > /etc/sysconfig/iptables
封禁常用端口扫描器:
# 封禁常见扫描IP段
iptables -A INPUT -s 103.21.244.0/22 -j DROP
iptables -A INPUT -s 103.22.200.0/22 -j DROP
iptables -A INPUT -s 104.16.0.0/13 -j DROP
2.3 第三道防线:Nginx层防护
# Nginx DDoS防护配置
# 限制连接数(每个IP最多50个连接)
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 限制请求速率(每个IP每秒最多10个请求)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
# 应用连接限制
limit_conn addr 50;
# 应用请求限制(允许突发50个请求)
limit_req zone=one burst=50 nodelay;
# 关闭慢连接
client_body_timeout 5s;
client_header_timeout 5s;
# 设置缓冲区大小,防止内存耗尽
client_body_buffer_size 16k;
client_header_buffer_size 1k;
client_max_body_size 8m;
location / {
# 白名单跳过限制
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
deny all;
}
}
2.4 第四道防线:fail2ban自动封禁
# 安装fail2ban
yum install -y fail2ban
# 配置fail2ban防护SSH暴力破解
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
[http-get-dos]
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/nginx/access.log
maxretry = 200
bantime = 600
findtime = 60
action = iptables[name=HttpFlood, port=http, protocol=tcp]
EOF
# 创建HTTP DoS过滤器
cat > /etc/fail2ban/filter.d/http-get-dos.conf << EOF
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*"
ignoreregex =
EOF
# 启动服务
systemctl enable fail2ban
systemctl start fail2ban
三、应急响应流程
3.1 攻击应急响应 SOP
┌─────────────────────────────────────────────────────────────────┐
│ DDoS攻击应急响应流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 发现攻击 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 告警通知 → 登录云控制台 → 查看DDoS防护状态 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 2. 紧急止血 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 临时关闭非核心业务 → 切换高防IP → 启用IP黑白名单 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 3. 分析攻击 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 查看攻击类型 → 分析攻击源IP → 评估持续时间 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 4. 升级防护 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 扩容带宽 → 接入高防IP → 联系云厂商支援 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 5. 恢复服务 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 逐步恢复业务 → 监控流量变化 → 确认攻击结束 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
3.2 腾讯云高防IP配置
# 购买高防IP后配置
# 1. 添加防护域名
tccli dayu createCcGeoIPBlockConfig \
--BusinessType bgp \
--Id bgpip-xxxxxxxx \
--IpList ["1.2.3.4"] \
--ActionType block
# 2. 设置CC防护规则
tccli dayu createCcReqLimitPolicy \
--BusinessType bgp \
--Id bgpip-xxxxxxxx \
--Uri "/api/*" \
--ReqLimitRate 100 \
--ConnectionDuration 60
# 3. 查看防护状态
tccli dayu describeCCStatus \
--BusinessType bgp \
--Id bgpip-xxxxxxxx
四、预防胜于治疗:长期防护策略
4.1 架构层面
| 策略 | 说明 | 成本 |
|---|---|---|
| 多点部署 | 在不同地域部署服务,流量分散 | 中 |
| Anycast网络 | 利用CDN/云厂商全球节点吸收攻击 | 高 |
| DDoS高防 | 接入专业高防服务 | 按量付费 |
| 弹性带宽 | 提前扩容带宽,应对突发流量 | 按量付费 |
4.2 日常运维
# 1. 定期检查登录日志
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10
# 2. 开启自动告警
# 在腾讯云设置告警策略:
# - 公网入流量 > 1Gbps
# - CPU使用率 > 80%
# - 连接数 > 50000
# 3. 定期更新iptables规则
iptables-save > /root/iptables.backup.$(date +%Y%m%d)
4.3 安全加固清单
# 1. SSH禁用密码登录,使用密钥
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd
# 2. 修改SSH默认端口
sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
# 3. 安装denyhosts自动封禁SSH暴力破解
yum install -y denyhosts
# 4. 关闭不必要的端口
iptables -A INPUT -p tcp --dport 23 -j DROP # Telnet
iptables -A INPUT -p tcp --dport 135 -j DROP # RPC
iptables -A INPUT -p tcp --dport 445 -j DROP # SMB
五、总结
DDoS攻击是每个互联网服务都要面对的问题,关键在于:
- 预防为主:做好架构设计,启用云厂商基础防护
- 快速发现:配置完善的监控告警,第一时间感知攻击
- 有效止血:iptables紧急封禁 + 切换高防IP
- 长期防护:fail2ban + Nginx限流 + 安全加固
记住:攻击并不可怕,可怕的是没有应对预案。 建议每个上线的服务都准备一份DDoS应急预案,并定期演练。
关于作者
长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。
个人博客:yunduancloud.icu —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。