首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊如果遇到DDoS攻击,如何在 5 分钟内恢复业务

聊聊如果遇到DDoS攻击,如何在 5 分钟内恢复业务

作者头像
IT运维技术圈
发布2025-10-09 12:11:08
发布2025-10-09 12:11:08
2000
代码可运行
举报
文章被收录于专栏:IT运维技术圈IT运维技术圈
运行总次数:0
代码可运行

0. 写在前面:为什么你需要“神器”而非“常用命令

大家好,老杨是老杨,干货满满的老杨 欢迎点击原文链接或直接访问vps.top365app.com,来看老杨的全球vps信息还有各种咱们用得着的信息实时收集分析项目.

帮老杨点赞、转发、在看以及打开小星标哦

攒今世之功德,修来世之福报

正文

遇到 DDoS 的感觉很单刀直入:流量像水闸被打开。 但老杨也见过把核心服务在 5 分钟内拉回来的场景。关键在于准备和门控脚本。 今天就来聊聊遇到大规模DDoS 后该如何做

整体思路

先把恶意流量挡在边缘。 再保护回源。 最后按灰度把业务放回。 先做 X,然后做 Y。 这样可以帮你在最短时间内保证用户可用。

5 分钟操作流程

下面是老杨实际用过的 6 步流程。目标:300 秒内恢复关键接口。

0:00–0:30 确认攻击并定位指标异常

观察带宽、连接数和 SYN 状态。

代码语言:javascript
代码运行次数:0
运行
复制
$ ss -s
Total: 123456 (kernel 78910)
TCP:   100000 (estab 8000, synrecv 12000, timewait 500)
UDP:   2300
代码语言:javascript
代码运行次数:0
运行
复制
$ cat /proc/net/dev | grep eth0
eth0: 1234567890 0 0 0 0 0 0 0 9876543210 0 0 0 0 0 0 0

输出说明:synrecv 或者网口 rx 突增,说明是流量型攻击。 我会立刻把事件标为高优先级并开始下一步。

0:30–1:30 启动边缘清洗 / CDN 严格模式

如果你用阿里云、腾讯云或自建 CDN,先在控制台切到清洗/严格模式。 若有 API,运行预制脚本。

API 调用(不同厂商接口不同,按厂商文档替换):

代码语言:javascript
代码运行次数:0
运行
复制
$ curl -X POST "https://cdn-api.example.com/domains/api.example.com/enable_scrub" \
  -H "Authorization: Bearer $TOKEN" -d '{"mode":"scrub"}'

输出

代码语言:javascript
代码运行次数:0
运行
复制
{"status":"ok","message":"scrubbing enabled for api.example.com"}

边缘清洗能在分钟级把大部分攻击丢掉。 没有边缘清洗,就切到下一步更激进的本地防护。

1:30–2:30 在边界机做快速封堵与速率限制(ipset + iptables + nginx)

先用 ipset 做黑名单集合,再让 iptables 丢弃集合里的流量。 这样规则非常高效,能承受成千上万条黑名单。

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo ipset create ddos-blacklist hash:ip family inet
$ sudo ipset add ddos-blacklist 203.0.113.45
$ sudo ipset add ddos-blacklist 198.51.100.23
$ sudo iptables -I INPUT -m set --match-set ddos-blacklist src -j DROP

输出

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo ipset list ddos-blacklist
Name: ddos-blacklist
Type: hash:ip
Members:
203.0.113.45
198.51.100.23

$ sudo iptables -L INPUT -n --line-numbers | grep ddos-blacklist
1    DROP       all  --  0.0.0.0/0            0.0.0.0/0      match-set ddos-blacklist src

同时在 Nginx 层打开速率限制,防止单 IP 或单连接耗尽资源。

代码语言:javascript
代码运行次数:0
运行
复制
http {
  limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
  server {
    location / {
      limit_req zone=one burst=20 nodelay;
      proxy_pass http://backend;
    }
  }
}

重载 Nginx:

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo nginx -s reload
# 无输出表示重载成功

2:30–3:30 请求上游清洗或 BGP 黑洞(当边缘不足时)

若攻击超过 CDN/自建清洗能力,就联系 ISP 或云清洗方。 常见做法是请求导流到清洗池或启用 RTBH(Remote Triggered Black Hole)。

我把联络信息和标准文本放在 runbook 里,复制粘贴能节约时间。

代码语言:javascript
代码运行次数:0
运行
复制
我们正在遭受 DDoS,目标 IP:A.B.C.D,开始时间:2025-08-XX 10:23,立即帮我们启用 RTBH 或导向清洗池,联系人:张三 +8613xxxx

如果必须临时黑洞路由,本机用示意命令(风险高,慎用):

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo ip route add blackhole 203.0.113.0/24

输出

代码语言:javascript
代码运行次数:0
运行
复制
$ ip route show | grep 203.0.113.0
blackhole 203.0.113.0/24 proto static

警告:黑洞会丢掉所有到该网段的合法流量。只在不得已时用。

3:30–4:30 保护 origin 与调整内核阈值

把 origin 限为只接受 CDN 回源的 IP。 这样即便攻击打到 origin,也被拒绝掉。

Nginx 白名单示例:

代码语言:javascript
代码运行次数:0
运行
复制
server {
  allow 203.0.113.0/24;  # CDN 回源段示意
  deny all;
  location / { proxy_pass http://backend; }
}

重载并验证:

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo nginx -t && sudo nginx -s reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

同时放宽内核队列,防止 SYN 暂存溢出:

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo sysctl -w net.core.somaxconn=4096
net.core.somaxconn = 4096
$ sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096
net.ipv4.tcp_max_syn_backlog = 4096

检查 conntrack 计数:

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo conntrack -C
124567

如果 conntrack 快满,可短期清表(谨慎,可能影响合法会话)。

4:30–5:00 验证关键接口并逐步放流

确认健康接口返回 200。再逐步灰度放流。

代码语言:javascript
代码运行次数:0
运行
复制
$ curl -sS -o /dev/null -w "%{http_code}\n" https://api.example.com/health
200

测试下单接口:

代码语言:javascript
代码运行次数:0
运行
复制
$ curl -sS -X POST https://api.example.com/order -d '{"sku":"1001","qty":1}' -H "Content-Type: application/json" -w "\n%{http_code}\n"
{"orderId":"ord-20250810-001","status":"accepted"}
201

结果正常后,按 5%、10%、30% 的步进放流。每步观测 1–2 分钟。

薅就一个字

硅基流动是一个非常不错的国内AI调度平台.老杨近期token消耗量非常大,好多业务和项目在建,部分token就是用这里的模型.还是非常流畅的.想玩玩的可以用老杨的链接注册一个试试. 用老杨的链接注册就送2000万token.心动不如行动,跟老杨一起玩起来.自己独立注册的没有哈

https://cloud.siliconflow.cn/i/03Nnp0e8

图片
图片

一键应急脚本示例

把常用动作打包。值班时一键运行。下例为示例,需在测试环境验证后再用。

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env bash
set -euo pipefail

echo"[1/4] reload nginx limits"
sudo nginx -t && sudo nginx -s reload

echo"[2/4] update ipset"
sudo ipset create ddos-blacklist hash:ip -exist
if [[ -f /opt/ddos/blacklist.txt ]]; then
whileread -r ip; dosudo ipset add ddos-blacklist "$ip" -exist; done < /opt/ddos/blacklist.txt
fi
sudo iptables -C INPUT -m set --match-set ddos-blacklist src -j DROP 2>/dev/null || \
sudo iptables -I INPUT -m set --match-set ddos-blacklist src -j DROP

echo"[3/4] request CDN scrubbing (pseudo API)"
curl -s -X POST "https://cdn-api.example.com/domains/api.example.com/enable_scrub" \
  -H "Authorization: Bearer $TOKEN" -d '{"mode":"scrub"}' || true

echo"[4/4] check health"
curl -sS -o /dev/null -w "health_code:%{http_code}\n" https://api.example.com/health

执行反馈

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo ./ddos_mitigate.sh
[1/4] reload nginx limits
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[2/4] update ipset
[3/4] request CDN scrubbing (pseudo API)
{"status":"ok","message":"scrubbing enabled"}
[4/4] check health
health_code:200

脚本要和你的环境绑定。把各家 CDN 的 API、token、回源段写成可配置文件。

恢复后必须做的事

  1. 1. 保存攻击样本:pcap、nginx accesslogs、CDN 日志。
  2. 2. 与 CDN / ISP 做事件回溯,确认流量特征与拦截时序。
  3. 3. 把高频恶意 IP 加入长期策略或自动化模型。
  4. 4. 做无责复盘并生成行动项(谁、做什么、多久完成)。
  5. 5. 根据需要提升长期清洗带宽或启用 Anycast。

老杨每次处理完都往工单里贴证据。这样和业务、法务沟通时有凭据。

Q&A

  • • 单机能顶住 100 Gbps 吗? 不能。单机不是防御层。边缘清洗和 ISP 才能处理这种规模。
  • • 黑洞会造成误伤吗? 会。黑洞会丢弃该网段的所有合法流量。只在万不得已时使用。
  • • CDN 一定能挡住吗? 不能保证。CDN 有能力分散和清洗流量,但前提是你已把域名接入并测试过“清洗模式”。
  • • 如何保证 5 分钟成功? 把操作脚本化并演练。把联系人信息和控制台路径写在单页上。事后再优化流程。

老杨把经验压缩成这些步骤。各位小伙伴加油吧!

老杨时间

这里老杨先声明一下,日常生活中大家都叫老杨波哥,跟辈分没关系,主要是岁数大了.就一个代称而已. 老杨的00后小同事老杨喊都是带哥的.张哥,李哥的. 但是这个称呼呀,在线下参加一些活动时.金主爸爸也这么叫就显的不太合适. 比如上次某集团策划总监,公司开大会来一句:“今个咱高兴!有请IT运维技术圈的波哥讲两句“ 这个氛围配这个称呼在互联网这行来讲就有点对不齐! 每次遇到这个情况老杨就想这么接话: “遇到各位是缘分,承蒙厚爱,啥也别说了,都在酒里了.老杨干了,你们随意!” 所以以后咱们改叫老杨,即市井又低调.还挺亲切,老杨觉得挺好.

运维X档案系列文章:

从告警到CTO:一个P0故障的11小时生死时速

企业级 Kubernetes 集群安全加固全攻略( 附带一键检查脚本)

看完别走.修行在于点赞、转发、在看.攒今世之功德,修来世之福报

点击阅读原文或打开地址实时收集分析全球vps的项目 vps.top365app.com

老杨AI的号: 98dev

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT运维技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
    • 整体思路
    • 5 分钟操作流程
      • 0:00–0:30 确认攻击并定位指标异常
      • 0:30–1:30 启动边缘清洗 / CDN 严格模式
      • 1:30–2:30 在边界机做快速封堵与速率限制(ipset + iptables + nginx)
      • 2:30–3:30 请求上游清洗或 BGP 黑洞(当边缘不足时)
      • 3:30–4:30 保护 origin 与调整内核阈值
      • 4:30–5:00 验证关键接口并逐步放流
    • 薅就一个字
    • 一键应急脚本示例
    • 恢复后必须做的事
    • Q&A
    • 老杨时间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档